CN117149617A - 一种代码的预分析方法和装置 - Google Patents
一种代码的预分析方法和装置 Download PDFInfo
- Publication number
- CN117149617A CN117149617A CN202310953002.1A CN202310953002A CN117149617A CN 117149617 A CN117149617 A CN 117149617A CN 202310953002 A CN202310953002 A CN 202310953002A CN 117149617 A CN117149617 A CN 117149617A
- Authority
- CN
- China
- Prior art keywords
- analysis
- source code
- code
- file
- syntax tree
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
- 238000004458 analytical method Methods 0.000 title claims abstract description 197
- 230000008859 change Effects 0.000 claims abstract description 49
- 238000000034 method Methods 0.000 claims abstract description 40
- 238000001914 filtration Methods 0.000 claims description 28
- 230000006870 function Effects 0.000 claims description 27
- 238000003860 storage Methods 0.000 claims description 14
- 238000012545 processing Methods 0.000 claims description 12
- 238000000605 extraction Methods 0.000 claims description 5
- 238000012360 testing method Methods 0.000 abstract description 27
- 238000011161 development Methods 0.000 abstract description 11
- 238000004519 manufacturing process Methods 0.000 abstract description 4
- 230000000903 blocking effect Effects 0.000 abstract description 3
- 238000011144 upstream manufacturing Methods 0.000 abstract description 2
- 238000004590 computer program Methods 0.000 description 11
- 230000003068 static effect Effects 0.000 description 10
- 238000004891 communication Methods 0.000 description 9
- 101001018259 Homo sapiens Microtubule-associated serine/threonine-protein kinase 1 Proteins 0.000 description 7
- 101000693728 Homo sapiens S-acyl fatty acid synthase thioesterase, medium chain Proteins 0.000 description 7
- 102100025541 S-acyl fatty acid synthase thioesterase, medium chain Human genes 0.000 description 7
- 238000007639 printing Methods 0.000 description 7
- 238000004422 calculation algorithm Methods 0.000 description 5
- 238000010586 diagram Methods 0.000 description 5
- 230000003287 optical effect Effects 0.000 description 4
- 230000008569 process Effects 0.000 description 4
- 239000010979 ruby Substances 0.000 description 4
- 229910001750 ruby Inorganic materials 0.000 description 4
- 238000004364 calculation method Methods 0.000 description 3
- 230000005856 abnormality Effects 0.000 description 2
- 238000005516 engineering process Methods 0.000 description 2
- 230000003993 interaction Effects 0.000 description 2
- 238000003672 processing method Methods 0.000 description 2
- 230000002035 prolonged effect Effects 0.000 description 2
- 230000009467 reduction Effects 0.000 description 2
- 230000008439 repair process Effects 0.000 description 2
- 230000002441 reversible effect Effects 0.000 description 2
- 101100217298 Mus musculus Aspm gene Proteins 0.000 description 1
- 238000013473 artificial intelligence Methods 0.000 description 1
- 230000009286 beneficial effect Effects 0.000 description 1
- 230000010267 cellular communication Effects 0.000 description 1
- 230000001413 cellular effect Effects 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 239000004973 liquid crystal related substance Substances 0.000 description 1
- 238000010801 machine learning Methods 0.000 description 1
- 238000012423 maintenance Methods 0.000 description 1
- 239000013307 optical fiber Substances 0.000 description 1
- 238000007781 pre-processing Methods 0.000 description 1
- 238000011076 safety test Methods 0.000 description 1
- 239000004065 semiconductor Substances 0.000 description 1
- 230000001953 sensory effect Effects 0.000 description 1
- 238000004904 shortening Methods 0.000 description 1
- 238000010998 test method Methods 0.000 description 1
- 238000012795 verification Methods 0.000 description 1
- 230000000007 visual effect Effects 0.000 description 1
- 239000002699 waste material Substances 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3604—Software analysis for verifying properties of programs
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Debugging And Monitoring (AREA)
Abstract
本公开提供一种代码的预分析方法和装置,涉及代码测试技术领域。该方法的具体实施方式包括:接收一个或多个分析任务;计算源代码文件的一致性校验信息,将一致性校验信息与代码库标识对应的历史分析记录进行对比,确定是否存在与源代码文件匹配的历史分析记录;在不存在的情况下,提取源代码文件中的待分析源代码的变动部分;利用抽象语法树确定变动部分的变动类型,在变动类型为可接受的情况下,将代码库的前一次历史分析记录的历史扫描结果作为分析任务的分析结果。该实施方式能够缩减扫描时间的开销,降低测试消耗的时间和成本,进而降低开发成本,防止整个生产线的上下游环节由于测试效率的低下而阻塞,缩短开发周期,提升用户体验。
Description
技术领域
本发明涉及代码测试技术领域,尤其涉及一种代码的预分析方法和装置。
背景技术
应用程序(Application)、计算机软件(software)等在正式发布之前,通常需要对源代码进行分析,以检测源代码中存在的漏洞,从而最大化地保证程序上线的稳定性,相较于后期高昂的维护成本,将漏洞的发现、修复提前在发布之前,保证安全性开发。
现有的异常测试过程中,常常采用SAST工具对应用程序的源代码进行扫描,实现源代码的静态分析,在发布之前定位程序代码中存在的安全漏洞。然而,随着开发需求的逐步复杂化,使得源代码的复杂度和迭代速率快速飙升,扫描消耗的时间成本越来越高,相应的分析模型也越来越复杂,导致程序发布的周期拖延,无法及时满足用户需求,开发成本指数级扩张的同时用户粘度降低,影响用户使用体验。
发明内容
有鉴于此,本发明实施例提供一种代码的预分析方法和装置,能够解决源代码的复杂度飙升导致扫描消耗的时间成本越来越高,程序发布周期拖延,无法及时满足用户需求,开发成本指数级扩张的同时用户粘度降低,影响用户使用体验的问题。
为实现上述目的,根据本公开的一方面,提供了一种代码的预分析方法,所述方法包括:
接收一个或多个分析任务;其中,所述分析任务包括源代码文件和代码库标识;
计算所述源代码文件的一致性校验信息,将所述一致性校验信息与所述代码库标识对应的历史分析记录进行对比,确定是否存在与所述源代码文件匹配的历史分析记录;
在与所述源代码文件匹配的历史分析记录不存在的情况下,提取所述源代码文件中的待分析源代码的变动部分;
利用抽象语法树确定所述变动部分的变动类型,在所述变动类型为可接受的情况下,将所述代码库的前一次历史分析记录的历史扫描结果作为所述分析任务的分析结果。
根据本公开的另一方面,提供了一种代码的预分析装置,所述装置包括:
接收模块,用于接收一个或多个分析任务;其中,所述分析任务包括源代码文件和代码库标识;
数据处理模块,用于计算所述源代码文件的一致性校验信息,将所述一致性校验信息与所述代码库标识对应的历史分析记录进行对比,确定是否存在与所述源代码文件匹配的历史分析记录;
提取模块,用于在与所述源代码文件匹配的历史分析记录不存在的情况下,提取所述源代码文件中的待分析源代码的变动部分;
判断模块,用于利用抽象语法树确定所述变动部分的变动类型,在所述变动类型为可接受的情况下,将所述代码库的前一次历史分析记录的历史扫描结果作为所述分析任务的分析结果。
根据本发明的再一方面,提供了一种电子设备,包括:
处理器;以及
存储程序的存储器,
其中,所述程序包括指令,所述指令在由所述处理器执行时使所述处理器执行所述代码的预分析方法。
根据本发明实施例的还一个方面,提供了一种存储有计算机指令的非瞬时计算机可读存储介质,其中,所述计算机指令用于使所述计算机执行所述代码的预分析方法。
本申请实施例中提供的一个或多个技术方案,通过静态分析之前的预分析,计算一致性校验信息判断是否可以利用历史扫描结果、根据代码库配置过滤无关文件、利用抽象语法树分析代码变动以判断是否可以利用前一次历史扫描结果,可以实现缩减扫描时间的开销,降低测试消耗的时间和成本,进而降低开发成本,防止整个生产线的上下游环节由于测试效率的低下而阻塞,缩短开发周期,提升用户体验技术效果。
附图说明
在下面结合附图对于示例性实施例的描述中,本公开的更多细节、特征和优点被公开,在附图中:
图1示出了根据本公开示例性实施例的代码的预分析方法的流程图;
图2示出了根据本公开示例性实施例的一致性校验信息的生成方法的流程图;
图3示出了根据本公开示例性实施例的待分析源代码的变动部分的提取方法的流程图;
图4示出了根据本公开示例性实施例的文件的过滤方法的流程图;
图5示出了根据本公开示例性实施例的待分析源代码的变动部分的处理方法的流程图;
图6示出了根据本公开示例性实施例的代码的预分析装置的示意性框图;
图7示出了能够用于实现本公开的实施例的示例性电子设备的结构框图。
具体实施方式
下面将参照附图更详细地描述本公开的实施例。虽然附图中显示了本公开的某些实施例,然而应当理解的是,本公开可以通过各种形式来实现,而且不应该被解释为限于这里阐述的实施例,相反提供这些实施例是为了更加透彻和完整地理解本公开。应当理解的是,本公开的附图及实施例仅用于示例性作用,并非用于限制本公开的保护范围。
应当理解,本公开的方法实施方式中记载的各个步骤可以按照不同的顺序执行,和/或并行执行。此外,方法实施方式可以包括附加的步骤和/或省略执行示出的步骤。本公开的范围在此方面不受限制。
本文使用的术语“包括”及其变形是开放性包括,即“包括但不限于”。术语“基于”是“至少部分地基于”。术语“一个实施例”表示“至少一个实施例”;术语“另一实施例”表示“至少一个另外的实施例”;术语“一些实施例”表示“至少一些实施例”。其他术语的相关定义将在下文描述中给出。需要注意,本公开中提及的“第一”、“第二”等概念仅用于对不同的装置、模块或单元进行区分,并非用于限定这些装置、模块或单元所执行的功能的顺序或者相互依存关系。
需要注意,本公开中提及的“一个”、“多个”的修饰是示意性而非限制性的,本领域技术人员应当理解,除非在上下文另有明确指出,否则应该理解为“一个或多个”。
本公开实施方式中的多个装置之间所交互的消息或者信息的名称仅用于说明性的目的,而并不是用于对这些消息或信息的范围进行限制。
SAST:Static Application Security Testing,即静态应用程序安全测试,也称静态分析,是一种测试方法,通过分析源代码确定易被攻击的安全漏洞,以及时修复,保证应用程序或者软件的安全运行。SAST在编译代码之前对代码进行扫描,亦称白盒测试。
gitlab:是一个用于仓库管理系统的开源代码管理平台,使用Git作为代码管理工具,并在此基础上搭建起来的Web服务,主要针对软件开发过程中产生的代码和文档进行管理。
语法树:Syntax tree,也称语法数,是源代码语法结构的一种抽象表示。语法树以树状的形式体现编程语言的语法结构,树上的每个节点都表示源代码中的一种结构,也称抽象语法树。比如,if-condition-then条件跳转语句可以使用带有两个分支的节点来表示。
antlr:Another Tool for Language Recognition,一种开源的语法分析器,可以根据输入自动生成语法树并可视化的显示出来。
以下参照附图描述本公开的方案。
图1示出了根据本公开示例性实施例的代码的预分析方法的流程图,如图1所示,本发明的代码的预分析方法包括如下步骤:
步骤S101,接收一个或多个分析任务;其中,所述分析任务包括代码库标识和源代码文件。
在本发明实施例中,分析任务由各个代码库发起,代码库与各个应用程序或者软件相对应,分析任务包括代码库的代码库标识和多个文件,多个文件包括源代码文件、测试文件、SQL文件等。其中,本发明的代码的预分析方法可以由代码分析服务器执行。
进一步地,代码库标识可以与应用标识相同。
步骤S102,计算所述源代码文件的一致性校验信息,将所述一致性校验信息与所述代码库标识对应的历史分析记录进行对比,确定是否存在与所述源代码文件匹配的历史分析记录。
在本发明实施例中,一致性校验信息包括唯一路径和唯一哈希值,唯一路径可以用“codePath”标识,唯一哈希值可以用“commitId”标识。代码分析服务器中存储了执行过的各个历史分析任务的历史分析记录,包括历史一致性校验信息、历史扫描结果、历史扫描文件等。需要说明的是,历史分析记录的存储位置可以根据实际分析环境进行选取。
进一步地,所述将所述一致性校验信息与所述代码库标识对应的历史分析记录进行对比,确定是否存在与所述源代码文件匹配的历史分析记录,包括:
将所述源代码文件的一致性校验信息与所述代码库标识对应的代码库中的一个或多个历史一致性校验信息进行对比,判断所述代码库中是否存在与所述源代码文件的一致性校验信息相同的历史一致性校验信息;
在所述代码库中存在与所述源代码文件的一致性校验信息相同的历史一致性校验信息的情况下,确定与所述源代码文件匹配的历史分析记录存在,将与所述源代码文件匹配的历史分析记录的历史扫描结果作为所述分析任务的分析结果;在所述代码库中不存在与所述源代码文件的一致性校验信息相同的历史一致性校验信息的情况下,确定与所述源代码文件匹配的历史分析记录不存在。
在本发明实施例中,在代码库中存在与源代码文件匹配的历史分析记录的情况下,表明源代码文件被扫描过且存在历史扫描结果,直接将历史分析记录的历史扫描结果作为分析任务的分析结果,以缩短扫描耗时,提高静态分析效率。
经过实际测试,本发明的代码的预分析方法通过一致性校验信息的对比,在日分析任务量为150~200个的生产线中,单月可避免至少100次的无效扫描。
在本发明实施例中,如图2所示,本发明的一致性校验信息的生成方法包括如下步骤:
步骤S201,获取所述源代码文件的待分析源代码。
步骤S202,删除所述待分析源代码中的注释字符串,得到中间分析源代码。
在本发明实施例中,待分析源代码中可能包括注释字符串,由于注释字符串对待分析源代码的分析并无实质性影响,并且注释字符串有可能包括汉字,因此,为了便于提效分析,可以直接将待分析源代码中的注释字符串删除,得到中间分析源代码。
步骤S203,计算所述中间分析源代码的全部字符串的哈希值,得到所述源代码文件的唯一哈希值。
步骤S2031,采集所述中间分析源代码的全部字符串的各个字符;其中,所述字符的种类包括数字、字母、标点符号。
步骤S2032,确定每个所述字符的转码值。
在本发明实施例中,各个字符的转码值可以根据实际需要进行选择性设置,仅需能区分数字、字母、标点符号等不同种类下的各个字符即可。比如,数字“0-9”的转码值为0-9;字母“a-z”的转码值为10-35;标点符号“、”的转码值为62、“回车”的转码值为63、“{”的转码值为64。
步骤S2033,计算所述字符的转码值和所述转码值所属转码基数的乘积,得到所述源代码文件的哈希值。
在本发明实施例中,源代码文件的哈希值=字符1的转码值*字符1所属转码基数+字符2的转码值*字符2所属转码基数+字符3的转码值*字符3所属转码基数+……+字符n的转码值*字符n所属转码基数;其中,n为中间分析源代码的全部字符串的字符个数。需要说明的是,转码值所属的转码基数可以根据需要进行选择性设置,比如,转码值为0-10对应的转码基数为89、转码值为11-20对应的转码基数为5等。
进一步地,将转码值和转码基数的乘积进行等间距分隔,逆向转码为字符,确定逆向转码后的字符串为源代码文件的哈希值。比如,间距为2个数字。
步骤S204,将所述源代码文件的存储路径作为所述源代码文件的唯一路径。
步骤S205,拼接所述源代码文件的唯一路径和唯一哈希值,得到所述源代码文件的一致性校验信息。
在本发明实施例中,唯一路径codePath通常由项目名称和代码库名称组成,比如,唯一路径codePath为“\\java\abc\”、唯一哈希值commitId为“651615465135265……161351”,拼接可得源代码文件的一致性校验信息为\\java\abc\651615465135265……161351。
在本发明实施例中,或者,根据代码库的管理方式的不同,代码库由gitlab作为代码管理工具进行管理时,一致性校验信息可以通过gitlab获取,进一步缩短一致性校验信息的计算耗时,提升分析效率。
在本发明实施例中,代码库中通常包括多个源代码文件,各个源代码文件与应用程序或者软件的不同功能相对应。因此,在进行一致性校验时,还可以将代码库中的全部代码文件压缩为一个压缩包文件,计算并对比压缩包文件的唯一哈希值,以进一步缩减唯一哈希值的计算时间,提高一致性对比效率,从而调用历史扫描结果提升分析效率。
需要说明的是,唯一哈希值的算法可以根据实际需要进行选择,仅需保证各个代码文件的哈希值唯一即可,比如,可以通过MD5、SHA1、SHA256、SHA512、SHA3-256、SHA3-512等算法计算源代码文件或者压缩包文件的唯一哈希值。
在本发明实施例中,通过本发明的一致性校验信息的生成方法,通过对源代码文件的哈希值进行计算,确定与分析任务对应的一致性校验信息,与历史一致性校验信息进行对比,判断是否历史上分析过相同的源代码文件,在分析过的基础上直接调用历史扫描结果作为分析任务的分析结果,在无需对待分析源代码进行分析的情况下,直接调用历史扫描结果的方式缩短了扫描时间,提高了分析效率,同时充分地利用历史分析资源,可有效提高测试效率,缩短应用上线时间,提升用户体验。
步骤S103,在所述源代码文件的历史扫描结果不存在的情况下,提取所述源代码文件中的待分析源代码的变动部分。
在本发明实施例中,在代码库中不存在与源代码文件的一致性校验信息相同的历史一致性校验信息的情况下,表明源代码文件未被扫描过,提取待分析源代码的变动部分。
在本发明实施例中,如图3所示,本发明的待分析源代码的变动部分的提取方法包括如下步骤:
步骤S301,根据所述代码库标识,下载与所述代码库标识对应的代码库的前一次历史扫描文件。
在本发明实施例中,前一次历史扫描文件即前一次分析记录的历史扫描文件。
步骤S302,将所述前一次历史扫描文件和所述源代码文件导入文件比较模型,确定所述文件比较模型的输出为所述待分析源代码的变动部分。
在本发明实施例中,文件比较模型的算法可以是diff函数。
在本发明实施例中,通过本发明的待分析源代码的变动部分的提取方法,将分析任务的源代码文件和分析任务对应的代码库的前一次分析记录的历史扫描文件进行对比,即可提取源代码文件的待分析源代码的变动部分,以便于后续对变动部分进行判断,在无实质性变动的情况下直接利用前一次历史扫描结果作为分析结果,以进一步缩短代码无实质性变动情况下的扫描耗时。
在本发明实施例中,或者,利用gitlab管理代码库时,通过Git工具提取待分析源代码的变动部分。
由于分析任务的执行需要对分析任务的全部文件进行分析,而分析任务中可能存在很多对分析结果无影响的文件,也即,与分析结果无关的文件。因此,为了缩短扫描耗时,提高测试效率,本发明的代码的预分析方法在对待分析源代码的变动部分分析之前,过滤与分析结果无关的文件,可以进一步降低无效扫描的时间,提高分析效率,进而缩短产品周期以提升用户体验,如图4所示,本发明的文件的过滤方法包括如下步骤:
步骤S401,获取所述代码库的默认配置。
在本发明实施例中,代码库的文件过滤的配置类型包括代码库纬度配置和语言纬度配置。其中,默认配置为代码库纬度配置,指的是代码库的缺省设置。
步骤S402,判断所述代码库的默认配置是否为空,如果是,转至步骤S404;如果否,转至步骤S403。
步骤S403,根据所述代码库的代码库纬度配置,确定目标文件并过滤;其中,所述代码库纬度配置包括代码库过滤文件格式、和/或代码库过滤文件功能。
在本发明实施例中,由于不同的开发人员开发习惯各异,故而代码库中可能存储有各种类型的用以从中读取的资源文件。分析时,此类资源文件通常会被全量扫描,但是资源文件的解析不会对代码的分析结果产生任何影响,因此,为了降低扫描成本,在分析之前过滤分析任务中的此类资源文件,以缩短扫描耗时,降低分析资源的消耗,提升分析和测试效率。在本发明实施例中,代码库纬度配置根据开发人的开发习惯预先设置,可以包括代码库过滤文件格式、和/或、代码库过滤文件功能。比如,代码库过滤文件格式包括后缀为shell、python、php、SQL、xml等格式的文件。又比如,代码库过滤文件功能为初始化功能。再比如,代码库过滤文件格式和代码库过滤文件功能结合使用,包括初始化功能的SQL文件。
在本发明实施例中,根据缺省的代码库纬度配置包括的代码库过滤文件格式、和/或代码库过滤文件功能,查找分析任务中的目标文件,将目标文件删除。比如,代码库纬度配置包括SQL文件和初始化功能,将初始化功能的全部SQL文件删除。
步骤S404,根据所述代码库的语言类型,匹配语言纬度配置;其中,所述语言纬度配置包括语言过滤路径、和/或语言过滤文件类型。
由于代码库使用的语言类型各式各样(包括Java、Python、JavaScript、php、Ruby、golang等),不同的开发语言存在不同的特殊配置,使得很多对于代码的异常分析无任何助益的文件,或者,分析确定的异常(包括代码漏洞、攻击方式等)解决成本过高、无分析必要、应通过其它技术进行分析并解决的文件浪费分析的扫描时间和成本,也即,上述文件不存在扫描的必要,扫描带来的只是成本的增加、对分析任务的分析结果无任何影响。因此,为了降低扫描成本,在分析之前过滤分析任务中的上述文件,以缩短扫描耗时,提升分析和测试效率。在本发明实施例中,根据代码库的语言类型不同,语言纬度配置可以包括语言过滤路径、和/或、语言过滤文件类型。比如,语言类型为JAVA语言时,src/test/路径下的文件为用于单元测试的文件,后期不会编译,故而无需分析,对代码的分析结果没有影响,相应地,JAVA语言的语言过滤路径为src/test/。又比如,语言类型为golang语言时,语言过滤文件类型为文件名称以_test结尾。
步骤S405,利用所述语言过滤路径、和/或所述语言过滤文件类型定位目标文件,将所述目标文件删除。
在本发明实施例中,比如,语言类型为JAVA语言时,定位src/test/路径下的全部文件为目标文件,将src/test/路径下的全部文件删除。又比如,语言类型为golang语言时,文件名称以_test结尾的全部文件为目标文件,将文件名称以_test结尾的全部文件删除。
经过实际测试,本发明的代码的预分析方法通过无效文件的过滤,每个分析任务可以缩短扫描耗时2~3分钟,从而缩短海量分析任务的扫描耗时,尤其是php等语言中提效显著。
在本发明实施例中,通过本发明的文件的过滤方法,在源代码文件所属的代码库的默认配置存在的情况下,根据代码库纬度配置查找分析任务中的目标文件并过滤;在默认配置为空的情况下,根据代码库的语言类型,匹配相应的语言纬度配置,定位目标文件并删除,从而可以避免无关资源文件的扫描,缩短扫描耗时,提升分析效率。
步骤S104,利用抽象语法树确定所述变动部分的变动类型,在所述变动类型为可接受的情况下,将所述代码库的前一次历史分析记录的历史扫描结果作为所述分析任务的分析结果。
在本发明实施例中,由于并非全部的代码变动皆需对整个源代码文件进行分析,类似回车、换行、注释等代码变动不会对代码分析的结果产生影响,也即,此类代码变动不存在安全隐患;类似日志打印函数等代码变动由于采用SAST工具分析的成本较高,通常会利用其它更加高效、低成本的工具进行分析,故而本发明的代码的分析方法不关注类似日志打印函数等的代码变动。
因此,本发明的代码的分析方法通过抽象语法树分析待分析源代码的变动部分是否属于回车符、换行符、注释、日志打印函数等可接受类型,对可接受的变动直接调用前一次历史扫描结果,可以进一步缩短无实质性变动的源代码文件的扫描耗时,提高分析任务的执行效率,降低分析成本。
在本发明实施例中,如图5所示,本发明的待分析源代码的变动部分的处理方法包括如下步骤:
步骤S501,分别生成所述源代码文件和所述前一次历史扫描文件的第一抽象语法树和第二抽象语法树。
在本发明实施例中,抽象语法树的生成工具可以是antlr。前一次历史扫描文件可以是从代码库下载的;或者,在使用通过Git工具提取待分析源代码的变动部分的情况下,为了节省下载成本并节约下载时间,可以利用源代码文件和变动部分还原前一次历史扫描文件,将源代码文件按照变动部分反向修改,即可还原前一次历史扫描文件。其中,通过还原的方式可以减少分析耗时,防止下载耗时导致的分析效率降低,提升产品的生产效率。
步骤S502,判断所述代码库的语言类型是否是第一类型,如果是,转至步骤S503;如果否,转至步骤S504。
在本发明实施例中,由于不同的语言类型可接受的变动内容不同,比如,golang语言需要通过回车符判断语句是否结束,Java、Python、JavaScript、php、Ruby等语言的回车符则可以忽略,因此,在利用抽象语法树分析之前,需要判断代码库的语言类型以执行不同的操作。语言类型包括第一类型和第二类型,第一类型的语言类型为golang语言,第二类型的语言类型包括Java、Python、JavaScript、php、Ruby等语言。
步骤S503,删除所述第一抽象语法树和所述第二抽象语法树中的回车符,得到更新后的第一对比语法树和第二对比语法树,转至步骤S505。
在本发明实施例中,在语言类型为第一类型的golang语言的情况下,需要删除抽象语法树中的回车符作为对比语法树,后续利用对比语法树进行对比。
步骤S504,将所述第一抽象语法树、所述第二抽象语法树作为第一对比语法树和第二对比语法树,转至步骤S505。
在本发明实施例中,在语言类型为第二类型的Java、Python、JavaScript、php、Ruby等语言的情况下,无需对抽象语法树文件进行额外操作,直接将抽象语法树作为对比语法树进行后续对比即可。
步骤S505,分别计算所述第一对比语法树、所述第二对比语法树的第一语法树哈希值、第二语法树哈希值。
在本发明实施例中,语法树哈希值的算法可以根据实际需要进行选取。
步骤S506,对比所述第一语法树哈希值与所述第二语法树哈希值是否相同,如果是,转至步骤S507;如果否,转至步骤S509。
在本发明实施例中,根据第一语法树哈希值与第二语法树哈希值的对比,可以确定源代码文件的待分析源代码相较于前一次历史扫描文件的源代码是否存在实质性的语法变动。
步骤S507,确定所述变动部分的变动类型为可接受。
在本发明实施例中,在第一语法树哈希值与第二语法树哈希值相同的情况下,表明待分析源代码相较于前一次历史扫描文件的源代码不存在实质性变动,也即:
对于第一类型的语言类型,待分析源代码相较于前一次历史扫描文件的源代码的变动内容为换行符、注释等内容;对于第二类型的语言类型,待分析源代码相较于前一次历史扫描文件的源代码的变动内容为回车符、换行符、注释等内容。
在本发明实施例中,或者,在第一语法树哈希值与第二语法树哈希值不同但是全部区别节点皆为日志打印函数调用的情况下,确定待分析源代码相较于前一次历史扫描文件的源代码不存在实质性变动,也即:
对于第一类型的语言类型,待分析源代码相较于前一次历史扫描文件的源代码的变动内容为换行符、注释、日志打印函数等内容;对于第二类型的语言类型,待分析源代码相较于前一次历史扫描文件的源代码的变动内容为回车符、换行符、注释、日志打印函数等内容。
步骤S508,将所述代码库的前一次历史扫描结果作为所述分析任务的分析结果。
在本发明实施例中,在变动部分的变动类型为可接受的情况下,表明无需对源代码文件进行重复扫描,直接采用前一次历史分析记录的历史扫描结果作为分析任务的分析结果即可,以节省重复扫描时间,降低扫描成本,提高分析效率。
步骤S509,查找所述第一对比语法树和所述第二对比语法树之间的全部区别节点,确定全部所述区别节点是否为日志打印函数调用,如果是,转至步骤S507;如果否,转至步骤S510。
在本发明实施例中,在第一语法树哈希值与第二语法树哈希值不同的情况下,顺次对比第一对比语法树和第二对比语法树,查找两者之间的全部区别节点,对区别节点的节点函数进行分析,确定区别节点是否是日志打印函数调用。
步骤S510,确定所述变动部分的变动类型为不可接受。
在本发明实施例中,在第一语法树哈希值与第二语法树哈希值不同并且两者之间的任意一个区别节点为日志打印函数调用以外的代码变动时,表明变动部分属于回车符、换行符、注释、日志打印函数等以外的内容,需要提交SAST工具进行分析。
步骤S511,生成所述分析任务的扫描请求。
在本发明实施例中,在变动部分的变动类型为不可接受的情况下,表明需要对源代码文件进行扫描分析,故而生成与分析任务对应的扫描请求,将扫描请求发送给SAST工具进行静态分析。
进一步地,获取所述SAST工具返回的扫描结果,将所述一致性校验信息、源代码文件和所述扫描请求的扫描结果存储至所述代码分析服务器。
经过实际测试,本发明的代码的预分析方法通过无实质性变动的待分析源代码的前一次历史扫描结果的调用,可以减少至少23%的扫描请求生成率。
在本发明实施例中,通过本发明的待分析源代码的变动部分的处理,生成源代码文件和前一次历史扫描文件的抽象语法树,并根据语言类型进行预处理,得到对应的对比语法树,计算并对比两者的对比语法树的哈希值,在哈希值相同的情况下忽略待分析源代码的变动部分,直接采用前一次历史扫描结果作为分析任务的分析结果,可以大大缩减分析任务的扫描量,降低扫描成本,提高测试效率。
在本发明实施例中,通过本发明的代码的预分析方法,在静态分析之前添加计算一致性校验信息判断是否可调用历史扫描结果、根据代码库配置过滤无关文件、利用抽象语法树分析待分析源代码的变动情况判断是否调用前一次历史扫描结果等预分析步骤,可以缩短扫描耗时,提高静态分析安全测试流程的速度,提升静态分析的扫描效率,减少流水线阻塞情况的发生,缩短产品上线周期,提升用户体验。
图6是根据本发明实施例的代码的预分析装置的主要模块的示意图,如图6所示,本发明的代码的预分析装置600包括:
接收模块601,用于接收一个或多个分析任务;其中,所述分析任务包括源代码文件和代码库标识。
数据处理模块602,用于计算所述源代码文件的一致性校验信息,将所述一致性校验信息与所述代码库标识对应的历史分析记录进行对比,确定是否存在与所述源代码文件匹配的历史分析记录。
提取模块603,用于在与所述源代码文件匹配的历史分析记录不存在的情况下,提取所述源代码文件中的待分析源代码的变动部分。
判断模块604,用于利用抽象语法树确定所述变动部分的变动类型,在所述变动类型为可接受的情况下,将所述代码库的前一次历史分析记录的历史扫描结果作为所述分析任务的分析结果。
本公开示例性实施例还提供一种电子设备,包括:至少一个处理器;以及与至少一个处理器通信连接的存储器。所述存储器存储有能够被所述至少一个处理器执行的计算机程序,所述计算机程序在被所述至少一个处理器执行时用于使所述电子设备执行根据本公开实施例的方法。
本公开示例性实施例还提供一种存储有计算机程序的非瞬时计算机可读存储介质,其中,所述计算机程序在被计算机的处理器执行时用于使所述计算机执行根据本公开实施例的方法。
本公开示例性实施例还提供一种计算机程序产品,包括计算机程序,其中,所述计算机程序在被计算机的处理器执行时用于使所述计算机执行根据本公开实施例的方法。
参考图7,现将描述可以作为本公开的服务器或客户端的电子设备700的结构框图,其是可以应用于本公开的各方面的硬件设备的示例。电子设备旨在表示各种形式的数字电子的计算机设备,诸如,膝上型计算机、台式计算机、工作台、个人数字助理、服务器、刀片式服务器、大型计算机、和其它适合的计算机。电子设备还可以表示各种形式的移动装置,诸如,个人数字处理、蜂窝电话、智能电话、可穿戴设备和其它类似的计算装置。本文所示的部件、它们的连接和关系、以及它们的功能仅仅作为示例,并且不意在限制本文中描述的和/或者要求的本公开的实现。
如图7所示,电子设备700包括计算单元701,其可以根据存储在只读存储器(ROM)702中的计算机程序或者从存储单元707加载到随机访问存储器(RAM)703中的计算机程序,来执行各种适当的动作和处理。在RAM 703中,还可存储设备700操作所需的各种程序和数据。计算单元701、ROM 702以及RAM 703通过总线704彼此相连。输入/输出(I/O)接口705也连接至总线704。
电子设备700中的多个部件连接至I/O接口705,包括:输入单元706、输出单元707、存储单元708以及通信单元709。输入单元706可以是能向电子设备700输入信息的任何类型的设备,输入单元706可以接收输入的数字或字符信息,以及产生与电子设备的用户设置和/或功能控制有关的键信号输入。输出单元707可以是能呈现信息的任何类型的设备,并且可以包括但不限于显示器、扬声器、视频/音频输出终端、振动器和/或打印机。存储单元704可以包括但不限于磁盘、光盘。通信单元709允许电子设备700通过诸如因特网的计算机网络和/或各种电信网络与其他设备交换信息/数据,并且可以包括但不限于调制解调器、网卡、红外通信设备、无线通信收发机和/或芯片组,例如蓝牙TM设备、WiFi设备、WiMax设备、蜂窝通信设备和/或类似物。
计算单元701可以是各种具有处理和计算能力的通用和/或专用处理组件。计算单元701的一些示例包括但不限于中央处理单元(CPU)、图形处理单元(GPU)、各种专用的人工智能(AI)计算芯片、各种运行机器学习模型算法的计算单元、数字信号处理器(DSP)、以及任何适当的处理器、控制器、微控制器等。计算单元701执行上文所描述的各个方法和处理。例如,在一些实施例中,代码的预分析方法、一致性校验信息的生成方法、待分析源代码的变动部分的提取方法、文件的过滤方法、待分析源代码的变动部分的处理方法可被实现为计算机软件程序,其被有形地包含于机器可读介质,例如存储单元707。在一些实施例中,计算机程序的部分或者全部可以经由ROM702和/或通信单元709而被载入和/或安装到电子设备700上。在一些实施例中,计算单元701可以通过其他任何适当的方式(例如,借助于固件)而被配置为执行代码的预分析方法、一致性校验信息的生成方法、待分析源代码的变动部分的提取方法、文件的过滤方法、待分析源代码的变动部分的处理方法。
用于实施本公开的方法的程序代码可以采用一个或多个编程语言的任何组合来编写。这些程序代码可以提供给通用计算机、专用计算机或其他可编程数据处理装置的处理器或控制器,使得程序代码当由处理器或控制器执行时使流程图和/或框图中所规定的功能/操作被实施。程序代码可以完全在机器上执行、部分地在机器上执行,作为独立软件包部分地在机器上执行且部分地在远程机器上执行或完全在远程机器或服务器上执行。
在本公开的上下文中,机器可读介质可以是有形的介质,其可以包含或存储以供指令执行系统、装置或设备使用或与指令执行系统、装置或设备结合地使用的程序。机器可读介质可以是机器可读信号介质或机器可读储存介质。机器可读介质可以包括但不限于电子的、磁性的、光学的、电磁的、红外的、或半导体系统、装置或设备,或者上述内容的任何合适组合。机器可读存储介质的更具体示例会包括基于一个或多个线的电气连接、便携式计算机盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦除可编程只读存储器(EPROM或快闪存储器)、光纤、便捷式紧凑盘只读存储器(CD-ROM)、光学储存设备、磁储存设备、或上述内容的任何合适组合。
如本公开使用的,术语“机器可读介质”和“计算机可读介质”指的是用于将机器指令和/或数据提供给可编程处理器的任何计算机程序产品、设备、和/或装置(例如,磁盘、光盘、存储器、可编程逻辑装置(PLD)),包括,接收作为机器可读信号的机器指令的机器可读介质。术语“机器可读信号”指的是用于将机器指令和/或数据提供给可编程处理器的任何信号。
为了提供与用户的交互,可以在计算机上实施此处描述的系统和技术,该计算机具有:用于向用户显示信息的显示装置(例如,CRT(阴极射线管)或者LCD(液晶显示器)监视器);以及键盘和指向装置(例如,鼠标或者轨迹球),用户可以通过该键盘和该指向装置来将输入提供给计算机。其它种类的装置还可以用于提供与用户的交互;例如,提供给用户的反馈可以是任何形式的传感反馈(例如,视觉反馈、听觉反馈、或者触觉反馈);并且可以用任何形式(包括声输入、语音输入或者、触觉输入)来接收来自用户的输入。
可以将此处描述的系统和技术实施在包括后台部件的计算系统(例如,作为数据服务器)、或者包括中间件部件的计算系统(例如,应用服务器)、或者包括前端部件的计算系统(例如,具有图形用户界面或者网络浏览器的用户计算机,用户可以通过该图形用户界面或者该网络浏览器来与此处描述的系统和技术的实施方式交互)、或者包括这种后台部件、中间件部件、或者前端部件的任何组合的计算系统中。可以通过任何形式或者介质的数字数据通信(例如,通信网络)来将系统的部件相互连接。通信网络的示例包括:局域网(LAN)、广域网(WAN)和互联网。
计算机系统可以包括客户端和服务器。客户端和服务器一般远离彼此并且通常通过通信网络进行交互。通过在相应的计算机上运行并且彼此具有客户端-服务器关系的计算机程序来产生客户端和服务器的关系。
Claims (12)
1.一种代码的预分析方法,其特征在于,包括:
接收一个或多个分析任务;其中,所述分析任务包括源代码文件和代码库标识;
计算所述源代码文件的一致性校验信息,将所述一致性校验信息与所述代码库标识对应的历史分析记录进行对比,确定是否存在与所述源代码文件匹配的历史分析记录;
在与所述源代码文件匹配的历史分析记录不存在的情况下,提取所述源代码文件中的待分析源代码的变动部分;
利用抽象语法树确定所述变动部分的变动类型,在所述变动类型为可接受的情况下,将所述代码库的前一次历史分析记录的历史扫描结果作为所述分析任务的分析结果。
2.如权利要求1所述的代码的预分析方法,其特征在于,在所述提取所述源代码文件中的待分析源代码的变动部分之前,还包括:
获取所述代码库的默认配置;
判断所述代码库的默认配置是否为空;
在所述代码库的默认配置非空的情况下,根据所述代码库的代码库纬度配置,确定目标文件并过滤;其中,所述代码库纬度配置包括代码库过滤文件格式、和/或代码库过滤文件功能。
3.如权利要求2所述的代码的预分析方法,其特征在于,在所述默认配置为空的情况下,还包括:
根据所述代码库的语言类型,匹配语言纬度配置;其中,所述语言纬度配置包括语言过滤路径、和/或语言过滤文件类型。
利用所述语言过滤路径、和/或所述语言过滤文件类型定位目标文件,将所述目标文件删除。
4.如权利要求1所述的代码的预分析方法,其特征在于,所述计算所述源代码文件的一致性校验信息,包括:
删除所述待分析源代码中的注释字符串,得到中间分析源代码;
计算所述中间分析源代码的全部字符串的哈希值,得到所述源代码文件的唯一哈希值;
将所述源代码文件的存储路径作为所述源代码文件的唯一路径,拼接所述源代码文件的唯一路径和唯一哈希值,得到所述源代码文件的一致性校验信息。
5.如权利要求4所述的代码的预分析方法,其特征在于,所述计算所述中间分析源代码的全部字符串的哈希值,得到所述源代码文件的唯一哈希值,包括:
采集所述中间分析源代码的全部字符串的各个字符;其中,所述字符的种类包括数字、字母、标点符号;
确定每个所述字符的转码值;
计算所述字符的转码值和所述转码值所属转码基数的乘积,得到所述源代码文件的唯一哈希值。
6.如权利要求1所述的代码的预分析方法,其特征在于,所述提取所述源代码文件中的待分析源代码的变动部分,包括:
根据所述代码库标识,下载所述代码库的前一次历史分析记录的历史扫描文件;
将所述前一次历史扫描文件和所述源代码文件导入文件比较模型,确定所述文件比较模型的输出为所述待分析源代码的变动部分;
或者,
通过Git工具提取待分析源代码的变动部分。
7.如权利要求1所述的代码的预分析方法,其特征在于,所述利用抽象语法树确定所述变动部分的变动类型,包括:
分别生成所述源代码文件和所述前一次历史扫描文件的第一抽象语法树和第二抽象语法树;
根据所述代码库的语言类型,确定与所述第一抽象语法树和所述第二抽象语法树对应的第一对比语法树和第二对比语法树;
分别计算并对比所述第一对比语法树、所述第二对比语法树的第一语法树哈希值、第二语法树哈希值,在所述第一语法树哈希值与所述第二语法树哈希值相同的情况下,确定所述变动部分的变动类型为可接受。
8.如权利要求7所述的代码的预分析方法,其特征在于,所述根据所述代码库的语言类型,确定与第一抽象语法树和所述第二抽象语法树对应的第一对比语法树和第二对比语法树,包括:
在所述代码库的语言类型为第一类型的情况下,删除所述第一抽象语法树和所述第二抽象语法树中的回车符,得到更新后的所述第一对比语法树和所述第二对比语法树;
在所述代码库的语言类型为第二类型的情况下,将所述第一抽象语法树、所述第二抽象语法树作为所述第一对比语法树和所述第二对比语法树。
9.如权利要求1所述的代码的预分析方法,其特征在于,在与所述源代码文件匹配的历史分析记录存在的情况下,还包括:
将与所述源代码文件匹配的历史分析记录的历史扫描结果作为所述分析任务的分析结果。
10.一种代码的预分析装置,其特征在于,包括:
接收模块,用于接收一个或多个分析任务;其中,所述分析任务包括源代码文件和代码库标识;
数据处理模块,用于计算所述源代码文件的一致性校验信息,将所述一致性校验信息与所述代码库标识对应的历史分析记录进行对比,确定是否存在与所述源代码文件匹配的历史分析记录;
提取模块,用于在与所述源代码文件匹配的历史分析记录不存在的情况下,提取所述源代码文件中的待分析源代码的变动部分;
判断模块,用于利用抽象语法树确定所述变动部分的变动类型,在所述变动类型为可接受的情况下,将所述代码库的前一次历史分析记录的历史扫描结果作为所述分析任务的分析结果。
11.一种电子设备,包括:
处理器;以及
存储程序的存储器,
其中,所述程序包括指令,所述指令在由所述处理器执行时使所述处理器执行根据权利要求1-9中任一项所述的代码的预分析方法。
12.一种存储有计算机指令的非瞬时计算机可读存储介质,其中,所述计算机指令用于使所述计算机执行根据权利要求1-9中任一项所述的代码的预分析方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310953002.1A CN117149617A (zh) | 2023-07-31 | 2023-07-31 | 一种代码的预分析方法和装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310953002.1A CN117149617A (zh) | 2023-07-31 | 2023-07-31 | 一种代码的预分析方法和装置 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN117149617A true CN117149617A (zh) | 2023-12-01 |
Family
ID=88897658
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202310953002.1A Pending CN117149617A (zh) | 2023-07-31 | 2023-07-31 | 一种代码的预分析方法和装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN117149617A (zh) |
-
2023
- 2023-07-31 CN CN202310953002.1A patent/CN117149617A/zh active Pending
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CA3047939C (en) | Automated extraction of rules embedded in software application code using machine learning | |
WO2019075390A1 (en) | BOX BLACK MATCHING MOTOR | |
CN110688307B (zh) | JavaScript代码检测方法、装置、设备和存储介质 | |
CN112015430A (zh) | JavaScript代码翻译方法、装置、计算机设备及存储介质 | |
CN115061721A (zh) | 一种报表生成方法、装置、计算机设备及存储介质 | |
EP3789882B1 (en) | Automatic configuration of logging infrastructure for software deployments using source code | |
CN113287096A (zh) | 用于失败代码验证的测试结果分类 | |
CN112688966A (zh) | webshell检测方法、装置、介质和设备 | |
CN112783508B (zh) | 文件的编译方法、装置、设备以及存储介质 | |
WO2016093839A1 (en) | Structuring of semi-structured log messages | |
CN116088846A (zh) | 一种持续集成代码格式的处理方法、相关装置及设备 | |
CN117940894A (zh) | 用于检测代码克隆的系统和方法 | |
CN114626061A (zh) | 网页木马检测的方法、装置、电子设备及介质 | |
CN117149617A (zh) | 一种代码的预分析方法和装置 | |
CN107977304B (zh) | 一种系统调试方法和装置 | |
CN115495740A (zh) | 一种病毒检测方法和装置 | |
CN112579093B (zh) | 一种信息推送方法、装置及相关设备 | |
CN113362111A (zh) | 一种内容发送方法、装置及电子设备 | |
CN113051479A (zh) | 文件处理、推荐信息生成方法、装置、设备及存储介质 | |
CN113448852A (zh) | 一种测试案例的获取方法、装置、电子设备及存储介质 | |
CN114372265A (zh) | 一种恶意程序检测方法、装置、电子设备及存储介质 | |
CN116611065B (zh) | 脚本的检测方法、深度学习模型的训练方法及装置 | |
CN116561768B (zh) | 设备固件漏洞检测方法、装置、设备及存储介质 | |
CN117312383A (zh) | Hive任务的风险预警方法、装置、电子设备和介质 | |
CN113821448A (zh) | 一种Webshell代码的检测方法及装置、可读存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |