CN106250319B - 静态代码扫描结果处理方法和装置 - Google Patents
静态代码扫描结果处理方法和装置 Download PDFInfo
- Publication number
- CN106250319B CN106250319B CN201610671439.6A CN201610671439A CN106250319B CN 106250319 B CN106250319 B CN 106250319B CN 201610671439 A CN201610671439 A CN 201610671439A CN 106250319 B CN106250319 B CN 106250319B
- Authority
- CN
- China
- Prior art keywords
- error
- hash value
- code
- line code
- target
- 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.)
- Active
Links
- 230000003068 static effect Effects 0.000 title claims abstract description 68
- 238000000034 method Methods 0.000 title claims abstract description 26
- 238000012545 processing Methods 0.000 claims description 15
- 238000003672 processing method Methods 0.000 claims description 15
- 238000004364 calculation method Methods 0.000 claims description 2
- 230000006870 function Effects 0.000 description 53
- 238000010586 diagram Methods 0.000 description 9
- 230000008569 process Effects 0.000 description 4
- 230000008859 change Effects 0.000 description 3
- 238000004891 communication Methods 0.000 description 3
- 230000008878 coupling Effects 0.000 description 3
- 238000010168 coupling process Methods 0.000 description 3
- 238000005859 coupling reaction Methods 0.000 description 3
- 238000011161 development Methods 0.000 description 2
- 238000004458 analytical method Methods 0.000 description 1
- 238000005516 engineering process Methods 0.000 description 1
- 239000012634 fragment Substances 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 230000003287 optical effect Effects 0.000 description 1
- 230000002085 persistent effect Effects 0.000 description 1
- 230000000717 retained effect Effects 0.000 description 1
- 238000004904 shortening Methods 0.000 description 1
- 238000006467 substitution reaction Methods 0.000 description 1
- 238000012360 testing method Methods 0.000 description 1
- 230000001052 transient effect Effects 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
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)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明实施例公开了一种静态代码扫描结果处理方法和装置。本发明实施例方法包括:获取第一报错,所述第一报错为对目标代码的一次静态扫描结果中的一个报错;根据所述第一报错生成第一散列值;根据所述第一散列值在历史报错记录表中查找第二散列值,所述第二散列值为与所述第一散列值指示同一个报错的散列值,其中,所述历史报错记录表中存有所述目标代码的历史静态扫描结果中各报错的散列值以及报错ID,其中,所述报错的报错ID用于唯一标识所述报错的散列值;当查找到所述第二散列值时,将所述第一散列值的报错ID取值为所述第二散列值的报错ID。
Description
技术领域
本发明涉及计算机技术领域,尤其涉及一种静态代码扫描结果处理方法和装置。
背景技术
项目测试开发过程中,需要通过静态代码扫描来检查项目代码质量。其中,静态代码扫描指的是在不运行代码的方式下,通过文本分析和正则匹配等技术扫描程序代码,发现代码中存在的规范性、安全性问题的技术,输出项目代码的扫描报错。常用的静态代码扫描工具有TscanCode、Cppcheck、Cpplint和ReSharper等等。
项目代码每完成一次扫描,会输出一个扫描结果,扫描结果中包括若干条扫描报错。项目代码进行修改后形成新的版本,对新版本再次扫描时,会得到新的扫描结果。然而,现有的扫描工具只能提供每个版本的项目代码的扫描结果,不能提供不同版本的项目代码的扫描结果之间的对比。由于项目代码会在不同版本的开发迭代过程中发生变化,如代码的上下文、注释和行号等发生变化,而这些变化会导致扫描报错的相关信息(例如报错位置、报错说明等)发生变更,进一步导致识别项目代码中的新增的扫描报错和已修复的扫描报错出现困难。
发明内容
本发明实施例提供了一种静态代码扫描结果处理方法和装置,能够实现对目标代码的报错跟踪的闭环管理。
第一方面,本发明实施例提供一种静态代码扫描结果处理方法,包括:
获取第一报错,所述第一报错为对目标代码的一次静态扫描结果中的一个报错;
根据所述第一报错生成第一散列值;
根据所述第一散列值在历史报错记录表中查找第二散列值,所述第二散列值为与所述第一散列值指示同一个报错的散列值,其中,所述历史报错记录表中存有所述目标代码的历史静态扫描结果中各报错的散列值以及报错ID,其中,所述报错的报错ID用于唯一标识所述报错的散列值;
当查找到所述第二散列值时,将所述第一散列值的报错ID取值为所述第二散列值的报错ID。
第二方面,本发明实施例提供一种静态代码扫描结果处理装置,包括:
获取模块,用于获取第一报错,所述第一报错为对目标代码的一次静态扫描结果中的一个报错;
生成模块,用于根据所述第一报错生成第一散列值;
查找模块,用于根据所述第一散列值在历史报错记录表中查找第二散列值,所述第二散列值为与所述第一散列值指示同一个报错的散列值,其中,所述历史报错记录表中存有所述目标代码的历史静态扫描结果中各报错的散列值以及报错ID,其中,所述报错的报错ID用于唯一标识所述报错的散列值;
取值模块,用于当查找到所述第二散列值时,将所述第一散列值的报错ID取值为所述第二散列值的报错ID。
从以上技术方案可以看出,本发明实施例具有以下优点:
本发明中,对目标代码的一次静态扫描结果中的第一报错,生成该第一报错的散列值(即第一散列值),这样,可以根据该散列值从历史报错记录中查找是否存在与该散列值指示同一个报错的散列值(即第二散列值),若存在,则表示目标代码的历史静态扫描结果中曾出现该报错,那么将第一散列值的报错ID取值为历史报错记录中所存储的第二散列值的报错ID,由于报错ID用于唯一标识一个报错的散列值,这样,可以根据目标代码的不同次静态扫描结果中各报错的报错ID来判断该目标代码在各次静态扫描中的新增扫描报错和已修复的扫描报错,有效地形成目标代码的报错跟踪的闭环管理。
附图说明
图1为本发明的静态代码扫描结果处理方法的一个实施例的流程示意图;
图2对本发明中生成第一散列值的方法的一个实施例的流程示意图;
图3为采用本发明的静态代码扫描结果处理方法的一个装置的结构示意图;
图4为本发明的静态代码扫描结果处理装置的一个实施例的结构示意图;
图5为本发明的静态代码扫描结果处理装置的另一个实施例的结构示意图;
图6是本发明实施例提供的一种服务器结构示意图。
具体实施方式
请参阅图1,图1为本发明的静态代码扫描结果处理方法的一个实施例的流程示意图。如图1所示,本实施例中的静态代码扫描结果处理方法包括:
101、获取第一报错,所述第一报错为对目标代码的一次静态扫描结果中的一个报错。
本实施例中,目标代码是需要采用代码扫描工具进行安全性、规范性等检查的项目代码。具体的,可通过项目的SVN地址来获取目标代码,并使用静态代码扫描工具来对该目标代码进行扫描,其中,该静态代码扫描工具可以是TscanCode、Cppcheck、PC-Lint或者Cpplint,在此不作限制。对目标代码扫描后,扫描工具会输出本次静态扫描的扫描结果,其中,扫描结果中包括至少一个报错。其中,每个报错包括目标代码中一个错误行代码的信息。例如,报错包括报错位置、扫描规则和报错说明,其中,报错位置包括错误行代码所在文件的文件名以及该错误行代码在该文件中的行号,通过该文件名和行号可以具体定位错误行代码在目标代码中的位置。扫描规则用于指示错误行代码的错误类型,例如,扫描规则可以指示错误行代码属于数值计算的错误,或者属于数组越界错误,或者属于运行逻辑错误等等。报错说明为对错误行代码的内容的说明,静态代码扫描工具输出的报错说明通常具有固定的模式。
本实施例中,第一报错指的是本次扫描结果中的一个报错。
102、根据所述第一报错生成第一散列值。
本实施例中,第一散列值用于指示第一报错的内容。两个相同的报错的散列值相同。生成第一散列值的方法有多种,下面结合图2对其中的一种生成第一散列值的方法进行举例说明。如图2所示,本实施例中的生成第一散列值的方法,包括:
S1、获取到第一报错后,根据第一报错中的报错位置获取错误行代码以及错误行代码的位置内容。
其中,该错误行代码的位置内容用于指示该错误行代码的位置。实际应用中,目标代码每一次经静态代码扫描工具扫描后都有可能会进行修改,得到不同版本的目标代码,因此同一行代码在不同版本的目标代码中的行号不一定相同,本实施例中,根据错误行代码的位置获取错误行代码的位置内容,该位置内容在不同版本的目标代码中保持不变。
其中,根据报错位置获取错误行代码的位置内容的方法可以有多种,例如,获取到报错位置后,根据该报错位置查找错误行代码的所在函数。当查找到所述错误行代码的所在函数时,表示该错误行代码是位于一个函数作用域内,那么获取所述函数的函数签名,所述函数签名包括所述函数的返回值类型、函数名和函数参数类型,将该函数的函数签名作为位置内容的至少部分。当查找不到所述错误行代码的所在函数时,表示该错误行代码不位于一个函数的作用域内,那么获取所述错误行代码的上下文代码,将所述上下文代码作为该错误行代码的位置内容的至少部分。
其中,错误行代码的上下文代码指的是目标代码中位于所述错误行代码之前或者之后去除空行的N行代码,N为正整数,例如,N为10或者15;或者,错误行代码的上下文代码指的是目标代码中位于所述错误行代码前后去除空行的M行代码,例如,M为5。
其中,查找错误行代码的所在函数的方法有多种。例如,Cppcheck提供了c++代码符号化功能,在Cppcheck符号化的基础之上,可以输出一个函数列表,该函数列表中包括源代码文件中所有的函数以及这些函数的起始代码行。在获取到报错位置后,可根据报错位置中在该函数列表中查询到错误行代码的所在函数。或者,能够提供相同的查找函数签名的功能的工具还有clang。
具体举例来说,Cppcheck包含一个叫做SymbolDatabase的类,提供了访问函数以及函数范围信息的功能。例如对于token.cpp这个文件中的代码片段,SymbolDatabase提供了函数Token::firstWordEquals的作用域范围为547行到560行,如果报错位置中错误行代码的行号为555,那么可以确定该错误行代码位于函数Token::firstWordEquals,从而得到其函数签名为bool Token::firstWordEquals(const char*,const char*)。
S2、去除所述错误行代码、报错说明和所述位置内容中的干扰信息。
本实施例中,第一散列值是用于和其他报错的散列值进行比较,以判断第一散列值和其他报错是否为同一个报错,而错误行代码、报错说明和所述位置内容这些信息是用于生成第一散列值的,因此,需要将错误行代码、报错说明和所述位置内容这些信息中容易在不同版本的目标代码中出现变动的信息以及对进行比较无用的信息去除掉。例如,将错误行代码、报错说明和所述位置内容中的注释、多余的空格和制表符去除,将报错说明中可能存在的和行号相关的信息去除等等。具体的,可通过分别对所述错误行代码、报错说明和所述位置内容进行符号化来去除干扰信息。
具体举例来说,一个报错的报错说明为:[npSt]is dereferenced in Function[DereferenceFunction]at line 65 before check null here。在该报错说明中,“atline65”中的65是错误行代码的行号,如果错误行代码的位置发生变化,这个行号也会发生变化,因此,作为判定报错相同的依据时,需去掉该数字。此外,对于这种报错类型而言,报错信息中最关键的是和变量相关的信息,也即“[npSt]is dereferenced”中的变量名npSt,因此只保留报错说明中的变量名npSt作为判定依据已经足够。
本实施例中,当位置内容具体为错误行代码所在函数的函数签名时,可选的,还去除函数签名中的参数名,仅保留函数签名中的函数的返回值类型、函数名和函数参数类型,由于该三个信息足够用于判断两个函数是否为同一个函数,仅保留该三个信息能够去除参数名改变造成的不利影响,也可以减少用于判定的字符串长度。
S3、根据所述文件名、扫描规则以及去除干扰信息后的错误行代码、报错说明和函数签名生成所述第一散列值。
根据文件名、扫描规则、错误行代码、报错说明和函数签名生成散列值的方法有多种。例如,分别计算去除干扰信息后的错误行代码、报错说明和位置内容的MD5值;将所述文件名、扫描规则、所述错误行代码的MD(英文全称:Message Digest Algorithm,中文全称:消息摘要算法)5值、所述报错说明的MD5值和所述位置内容的MD5值连接,形成所述第一散列值。该MD5值的作用是让大容量信息被压缩成一种简短的字符串信息,形成该大容量信息独一无二的“数字指纹”。或者,上述的MD5值也可以替换为MD2值或者MD4值,在此不作限制。
本实施例中,通过文件名、扫描规则、错误行代码、报错说明和函数签名来生成第一报错的第一散列值,由于该五个信息的组合能够唯一指向第一报错中的错误行代码,那么当两个根据该五个信息所形成的散列值相同时,即可确认该两个散列值所关联的报错为同一个报错,而且,该五个信息的内容较少,有助于散列值的简短化。
103、根据所述第一散列值在历史报错记录表中查找第二散列值,所述第二散列值为与所述第一散列值指示同一个报错的散列值。
本实施例中,历史报错记录表中存有所述目标代码的历史静态扫描结果中各报错的散列值以及报错ID,其中,所述报错的报错ID用于唯一标识所述报错的散列值。具体的,该历史报错记录表为哈希表。
本实施例中,查找第二散列值的方法有多种。下面对在采用图2所示实施例中的方法来生成散列值的情况下查找第二散列值的一种方法进行举例说明。
遍历历史报错记录表,当查找到和第一散列值相同的散列值(为描述方便,下文称为目标散列值)时,根据该目标散列值获取对应的报错中的错误行代码的位置内容,当所述目标散列值对应的错误行代码的位置内容和所述第一散列值对应的错误行代码的位置内容相同时,确定所述目标函数签名为所述第二散列值。
本实施例中,获取目标散列值对应的位置内容和第一散列值对应的位置内容的方法有多种。例如,对目标代码每次静态扫描的扫描结果,在生成该扫描结果中各报错的散列值后,还将该散列值以及该散列值对应的位置内容存储到存储器中。这样,在确定目标散列值和第一散列值后,可直接从存储器中查找该两个散列值分别对应的位置内容。
本实施例中,当目标散列值对应的报错的位置内容和第一散列值对应的报错的位置内容为相同的函数签名时,可确定该两个位置内容相同;当目标散列值对应的报错的位置内容和第一散列值对应的报错的位置内容均为相同的上下文代码时,确定该两个位置内容相同。
实际应用中,不同版本的目标代码中同一段代码可能会出现细微的差别,因此,优选的,本实施例中,当位置内容为上下文代码时,还计算所述目标散列值对应的错误行代码的上下文代码和所述第一散列值对应的错误行代码的上下文代码的相似度,当所述相似度大于第一阈值(例如为85%)时,确定所述目标散列值对应的错误行代码的位置内容和所述第一散列值对应的错误行代码的位置内容相同;或者,还计算所述目标散列值对应的错误行代码的上下文代码和所述第一散列值对应的错误行代码的上下文代码的编辑距离,当所述编辑距离大于第二阈值时,确定所述目标散列值对应的错误行代码的位置内容和所述第一散列值对应的错误行代码的位置内容相同。
其中,计算两段代码的相似度的方法具体如下:执行步骤A:从该两段代码中提取出相同程度最大的一段字符,这样,每段代码还剩位于该段字符前面的一段字符(为描述方便,下文简称为前段字符)和后面的一段字符(为描述方便,下午简称为后段字符)。对该两段代码的前段字符重复执行步骤A,提取出该两个前段字符中的相同程度最大的一段字符,这样,该两个前段字符被该段字符进一步分为前段字符和后段字符,对该两个前端字符重复执行步骤A,以此类推,直至两段字符中不在包含相同的部分。对该两段代码的后段字符的操作和对该两段代码的前段字符的操作相同。统计从该两段代码中提取出的所有相同字符的长度的和,那么该两段代码的相似度等于该所有相同字符的长度的和与2的乘积除以该两段代码的长度之和。
其中,计算两段代码的编辑距离的方法为现有技术,在此不再赘述。
104、当查找到所述第二散列值时,将所述第一散列值的报错ID取值为所述第二散列值的报错ID。
当在在历史报错记录表中查找第二散列值时,即可确定对目标代码的历史扫描中曾经出现过第一报错,因此将第一散列值的报错ID取值为历史报错记录表中所存储的第二散列值对应的报错ID,以表示该第一散列值和第二散列值对应的报错为同一个报错。
若查找不到第二散列值,则可确定对目标代码的历史扫描中未曾出现过第一报错,那么该第一报错为新增的报错,则另外为该第一报错分配新的报错ID。
本实施例中,对目标代码的一次静态扫描结果中的第一报错,生成第一散列值),这样,可以根据该散列值从历史报错记录中查找是否存在与该散列值指示同一个报错的散列值(即第二散列值),若存在,则将第一散列值的报错ID取值为历史报错记录中所存储的第二散列值的报错ID,由于报错ID用于唯一标识一个报错的散列值,这样,可以根据目标代码的不同次静态扫描结果中各报错的报错ID来判断该目标代码在各次静态扫描中的新增扫描报错和已修复的扫描报错,能够实现目标代码的报错跟踪的闭环管理。
为理解本发明,下面结合一个实际应用场景对本发明的静态代码扫描结果处理方法进行举例说明。
如图3所示,图3为采用本发明的静态代码扫描结果处理方法的一个装置的结构示意图。该装置具体为X86架构处理器,具体的,该X86架构处理器包括静态代码扫描服务器、数据库服务器和网页(Web)服务器。其中,静态代码扫描服务器上运行有linux操作系统。
在静态代码扫描服务器中,通过项目的SVN地址获取到该项目的项目代码,使用静态代码扫描服务器中的静态代码扫描工具(本实施例中具体为Cppcheck)来对该项目代码进行第一次扫描。扫描结束后,Cppcheck输出扫描结果,将该扫描结果存储到数据库服务器中。具体的,该扫描结果可以以可扩展标记语言的格式文件呈现。该扫描结果中包括报错列表,其中,该报错列表中的每一个报错包括报错位置、扫描规则和报错说明,其中,报错位置包括错误行代码所在文件的文件名以及该错误行代码在该文件中的行号。例如,一个报错具体为:<error file=“CS_BadRecursive.cs”line=“48”rule=“BadRecursive.cs”msg=“[c1]may lead to dead loop”/。
对报错列表中的每一个报错,生成该报错的散列值。获取到报错列表中的各报错的散列值后,建立第一哈希表和总哈希表并存储到数据库服务器中。其中,在第一哈希表和总哈希表中均存储各散列值,并为每一个散列值分配一个与该散列值唯一对应的报错ID。另外,还在该第一哈希表和总哈希表中存储各散列值对应的位置内容。
在对项目代码第一次扫描后,根据报错列表对项目代码进行修改,形成第二个版本的项目代码,为该版本的项目代码分配程序版本号。静态代码扫描工具对第二个版本的项目代码进行扫描后,输出扫描结果,该扫描结果中包括报错列表。对报错列表中的每一个报错,生成该报错的散列值。为该第二个版本的项目代码的扫描结果建立第二哈希表,用于存储该扫描结果中的报错列表中各报错的散列值。将扫描结果以及第二哈希表存储到数据库服务器中。
其中,对第二哈希表中的每一个散列值M,从总哈希表中查找与该散列值M相同的散列值N,当查找到散列值N时,判断总哈希表中散列值N对应的位置内容和第二哈希表中散列值M对应的位置内容是否相同。若相同,那么将总哈希表中散列值N对应的报错ID作为散列值M的报错ID存储到的第二哈希表中;若不相同,或者查找不到散列值N时,在第二哈希表中为散列值M分配一个新的报错ID,并将该新增的报错ID、散列值M以及该散列值M对应的位置内容存储到总哈希表中。
以此类推,在对每个版本的项目代码的扫描结果均采用上述的处理方法。这样,可以获取到每个版本的项目代码的扫描结果,而且各扫描结果中相同的报错的报错ID相同。
将各版本的项目代码的扫描结果通过Web服务器向用户展示。
可选的,在Web服务器中预置有至少两个级别的紧急程度以及每一个级别的紧急程度的判断条件。在接收到各版本的项目代码的扫描结果后,对每一个扫描结果中的每一个报错,根据该报错的报错说明所满足的判断条件确定该报错对应的紧急程度的级别。可选的,还对每个版本中每一个级别对应的紧急程度的报错进行统计和显示。
例如,预置规则中将报错的紧急程度分为致命、严重、一般和提醒四个级别。Web服务器接收到一个版本的项目代码的扫描结果时,统计出该扫描结果中包括154个报错,并根据预置规则确定该扫描结果中致命级别对应的报错数量为24个,严重级别对应的报错数量为30个,一般级别对应的报错数量为95个,提醒级别对应的报错数量为5个。在对该扫描结果进行展示时,具体对该扫描结果中的总数以及每个级别对应的报错数量进行展示。
可选的,在Web服务器中,在每个版本的项目代码的哈希表中还对新增的报错ID以及对应的散列值采用第一方式进行标记和统计,在对该扫描结果进行展示时,还对该扫描结果中新增的报错的数量进行展示。可选的,在接收到用户查看新增报错的指令时,对该扫描结果中新增的报错的具体详情进行展示,以方便用户快速查看到每个版本的项目代码中的新增报错。
可选的,在Web服务器中,还将每个版本的项目代码的哈希表与后一个版本的项目代码的哈希表进行比较,若某个报错ID在该版本的哈希表中出现且在后一个版本的哈希表中没有出现,则可确定该报错ID对应的报错为已修复的报错,并对该报错ID以及对应的散列值采用第二方式进行标记和统计,以方便用户快速查看到每个版本的项目代码中的已修复报错。
例如,在第一个版本的项目代码的哈希表中包括两个报错ID:
00000241-AD4E-BCE5-FFCE-F5CC0759362
000002D7-14C5-B4AD-C685-F4830417CB76
在第二个版本的项目代码的哈希表中包括两个报错ID:
000002D7-14C5-B4AD-C685-F4830417CB76
000003C3-DBCB-C8AF-1214-392C0E08B504
那么,可以确定第一个版本的项目代码的哈希表中报错00000241-AD4E-BCE5-FFCE-F5CC0759362C在第二个版本中被修复,在第二个版本中,报错000003C3-DBCB-C8AF-1214-392C0E08B504为新增的报错,而报错000002D7-14C5-B4AD-C685-F4830417CB76在第二个版本中继续存在,没有被修复。
可选的,在Web服务器中,在获取到项目代码至少两个版本的扫描结果后,还可以采用图表展示该项目代码在各版本中新增的报错数量和已修复的报错数量,以更加直观地展示项目的质量变更趋势。
上面对本发明的静态代码扫描结果处理方法进行了描述,下面将对本发明的静态代码扫描结果处理装置进行描述。
请参阅图4,图4为本发明的静态代码扫描结果处理装置的一个实施例的结构示意图。本实施例中,静态代码扫描结果处理装置400包括:
获取模块401,用于获取第一报错,所述第一报错为对目标代码的一次静态扫描结果中的一个报错;
生成模块402,用于根据所述第一报错生成第一散列值;
查找模块403,用于根据所述第一散列值在历史报错记录表中查找第二散列值,所述第二散列值为与所述第一散列值指示同一个报错的散列值,其中,所述历史报错记录表中存有所述目标代码的历史静态扫描结果中各报错的散列值以及报错ID,其中,所述报错的报错ID用于唯一标识所述报错的散列值;
取值模块404,用于当查找到所述第二散列值时,将所述第一散列值的报错ID取值为所述第二散列值的报错ID。
本实施例中,对目标代码的一次静态扫描结果中的第一报错,生成第一散列值),这样,可以根据该散列值从历史报错记录中查找是否存在与该散列值指示同一个报错的散列值(即第二散列值),若存在,则将第一散列值的报错ID取值为历史报错记录中所存储的第二散列值的报错ID,由于报错ID用于唯一标识一个报错的散列值,这样,可以根据目标代码的不同次静态扫描结果中各报错的报错ID来判断该目标代码在各次静态扫描中的新增扫描报错和已修复的扫描报错,能够实现目标代码的报错跟踪的闭环管理。
可选的,所述第一报错包括报错位置、扫描规则和报错说明,所述报错位置包括错误行代码所在文件的文件名以及所述错误行代码在所述文件中的行号;
所述生成模块402具体用于:
根据所述报错位置获取错误行代码以及所述错误行代码的位置内容,其中,所述错误行代码的位置内容在所述目标代码中保持不变;
去除所述错误行代码、报错说明和所述位置内容中的干扰信息;
根据所述文件名、扫描规则以及去除干扰信息后的错误行代码、报错说明和函数签名生成所述第一散列值。
进一步,可选的,所述生成模块402在根据所述报错位置获取所述报错的位置内容是,具体用于:
根据所述报错位置查找所述错误行代码的所在函数;
当查找到所述错误行代码的所在函数时,获取所述函数的函数签名,所述位置内容包括所述函数签名,所述函数签名包括所述函数的返回值类型、函数名和函数参数类型;
当查找不到所述错误行代码的所在函数时,获取所述错误行代码的上下文代码,所述位置内容包括所述上下文代码。
进一步,可选的,所述生成模块402在根据所述文件名、扫描规则以及去除干扰信息后的错误行代码、报错说明和位置内容生成所述第一字符时,具体用于:
分别计算去除干扰信息后的错误行代码、报错说明和位置内容的MD5值;
将所述文件名、扫描规则、所述错误行代码的MD5值、所述报错说明的MD5值和所述位置内容的MD5值连接,形成所述第一散列值。
可选的,所述查找模块403具体用于:
在所述历史报错记录表中查找目标散列值,所述目标散列值为与所述第一散列值相同的散列值;
当查找到所述目标散列值时,获取所述目标散列值对应的错误行代码的位置内容;
当所述目标散列值对应的错误行代码的位置内容和所述第一散列值对应的错误行代码的位置内容相同时,确定所述目标函数签名为所述第二散列值。
如图5所示,图5为本发明的静态代码扫描结果处理装置的一个实施例的结构示意图。与图4所示实施例不同的是,本实施例中,所述目标散列值的位置内容和所述第一散列值的位置内容均为上下文代码;所述装置500还包括:
计算模块501,用于执行以下步骤:
计算所述目标散列值对应的错误行代码的上下文代码和所述第一散列值对应的错误行代码的上下文代码的相似度,当所述相似度大于第一阈值时,确定所述目标散列值对应的错误行代码的位置内容和所述第一散列值对应的错误行代码的位置内容相同;
或者,
计算所述目标散列值对应的错误行代码的上下文代码和所述第一散列值对应的错误行代码的上下文代码的编辑距离,当所述编辑距离大于第二阈值时,确定所述目标散列值对应的错误行代码的位置内容和所述第一散列值对应的错误行代码的位置内容相同。
请参阅图6,图6是本发明实施例提供的一种服务器结构示意图,该服务器1100可因配置或性能不同而产生比较大的差异,可以包括一个或一个以上中央处理器(centralprocessing units,CPU)1122(例如,一个或一个以上处理器)和存储器1132,一个或一个以上存储应用程序1142或数据1144的存储介质1130(例如一个或一个以上海量存储设备)。其中,存储器1132和存储介质1130可以是短暂存储或持久存储。存储在存储介质1130的程序可以包括一个或一个以上模块(图示没标出),每个模块可以包括对服务器中的一系列指令操作。更进一步地,中央处理器1122可以设置为与存储介质1130通信,在服务器1100上执行存储介质1130中的一系列指令操作。
服务器1100还可以包括一个或一个以上电源1126,一个或一个以上有线或无线网络接口1150,一个或一个以上输入输出接口1158,和/或,一个或一个以上操作系统1141,例如Windows ServerTM,Mac OS XTM,UnixTM,LinuxTM,FreeBSDTM等等。
上述用于执行图1至图3所示实施例中的方法步骤的装置可以基于该图6所示的服务器结构。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统,装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
在本申请所提供的几个实施例中,应该理解到,所揭露的系统,装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-OnlyMemory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。
以上所述,以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。
Claims (12)
1.一种静态代码扫描结果处理方法,其特征在于,包括:
获取第一报错,所述第一报错为对目标代码的一次静态扫描结果中的一个报错;
根据所述第一报错生成第一散列值;
根据所述第一散列值在历史报错记录表中查找第二散列值,所述第二散列值为与所述第一散列值指示同一个报错的散列值,其中,所述历史报错记录表中存有所述目标代码的历史静态扫描结果中各报错的散列值以及报错ID,其中,所述报错的报错ID用于唯一标识所述报错的散列值;
当查找到所述第二散列值时,将所述第一散列值的报错ID取值为所述第二散列值的报错ID。
2.根据权利要求1所述的静态代码扫描结果处理方法,其特征在于,所述第一报错包括报错位置、扫描规则和报错说明,所述报错位置包括错误行代码所在文件的文件名以及所述错误行代码在所述文件中的行号;
所述根据所述第一报错生成第一散列值,包括:
根据所述报错位置获取错误行代码以及所述错误行代码的位置内容,其中,所述错误行代码的位置内容在所述目标代码中保持不变;
去除所述错误行代码、报错说明和所述位置内容中的干扰信息;
根据所述文件名、扫描规则以及去除干扰信息后的错误行代码、报错说明和函数签名生成所述第一散列值;所述位置内容包括所述函数签名。
3.根据权利要求2所述的静态代码扫描结果处理方法,其特征在于,所述根据所述报错位置获取所述报错的位置内容,包括:
根据所述报错位置查找所述错误行代码的所在函数;
当查找到所述错误行代码的所在函数时,获取所述函数的函数签名,所述位置内容包括所述函数签名,所述函数签名包括所述函数的返回值类型、函数名和函数参数类型;
当查找不到所述错误行代码的所在函数时,获取所述错误行代码的上下文代码,所述位置内容包括所述上下文代码。
4.根据权利要求2或3所述的静态代码扫描结果处理方法,其特征在于,所述根据所述文件名、扫描规则以及去除干扰信息后的错误行代码、报错说明和位置内容生成所述第一散列值,包括:
分别计算去除干扰信息后的错误行代码、报错说明和位置内容的MD5值;
将所述文件名、扫描规则、所述错误行代码的MD5值、所述报错说明的MD5值和所述位置内容的MD5值连接,形成所述第一散列值。
5.根据权利要求2所述的静态代码扫描结果处理方法,其特征在于,所述根据所述第一散列值在历史报错记录表中查找第二散列值,包括:
在所述历史报错记录表中查找目标散列值,所述目标散列值为与所述第一散列值相同的散列值;
当查找到所述目标散列值时,获取所述目标散列值对应的错误行代码的位置内容;
当所述目标散列值对应的错误行代码的位置内容和所述第一散列值对应的错误行代码的位置内容相同时,确定目标函数签名为所述第二散列值。
6.根据权利要求5所述的静态代码扫描结果处理方法,其特征在于,所述目标散列值的位置内容和所述第一散列值的位置内容均为上下文代码;
所述方法还包括:
计算所述目标散列值对应的错误行代码的上下文代码和所述第一散列值对应的错误行代码的上下文代码的相似度,当所述相似度大于第一阈值时,确定所述目标散列值对应的错误行代码的位置内容和所述第一散列值对应的错误行代码的位置内容相同;
或者,
计算所述目标散列值对应的错误行代码的上下文代码和所述第一散列值对应的错误行代码的上下文代码的编辑距离,当所述编辑距离大于第二阈值时,确定所述目标散列值对应的错误行代码的位置内容和所述第一散列值对应的错误行代码的位置内容相同。
7.一种静态代码扫描结果处理装置,其特征在于,包括:
获取模块,用于获取第一报错,所述第一报错为对目标代码的一次静态扫描结果中的一个报错;
生成模块,用于根据所述第一报错生成第一散列值;
查找模块,用于根据所述第一散列值在历史报错记录表中查找第二散列值,所述第二散列值为与所述第一散列值指示同一个报错的散列值,其中,所述历史报错记录表中存有所述目标代码的历史静态扫描结果中各报错的散列值以及报错ID,其中,所述报错的报错ID用于唯一标识所述报错的散列值;
取值模块,用于当查找到所述第二散列值时,将所述第一散列值的报错ID取值为所述第二散列值的报错ID。
8.根据权利要求7所述的静态代码扫描结果处理装置,其特征在于,所述第一报错包括报错位置、扫描规则和报错说明,所述报错位置包括错误行代码所在文件的文件名以及所述错误行代码在所述文件中的行号;
所述生成模块具体用于:
根据所述报错位置获取错误行代码以及所述错误行代码的位置内容,其中,所述错误行代码的位置内容在所述目标代码中保持不变;
去除所述错误行代码、报错说明和所述位置内容中的干扰信息;
根据所述文件名、扫描规则以及去除干扰信息后的错误行代码、报错说明和函数签名生成所述第一散列值;所述位置内容包括所述函数签名。
9.根据权利要求8所述的静态代码扫描结果处理装置,其特征在于,所述生成模块在根据所述报错位置获取所述报错的位置内容是,具体用于:
根据所述报错位置查找所述错误行代码的所在函数;
当查找到所述错误行代码的所在函数时,获取所述函数的函数签名,所述位置内容包括所述函数签名,所述函数签名包括所述函数的返回值类型、函数名和函数参数类型;
当查找不到所述错误行代码的所在函数时,获取所述错误行代码的上下文代码,所述位置内容包括所述上下文代码。
10.根据权利要求8或9所述的静态代码扫描结果处理装置,其特征在于,所述生成模块在根据所述文件名、扫描规则以及去除干扰信息后的错误行代码、报错说明和位置内容生成所述第一散列值时,具体用于:
分别计算去除干扰信息后的错误行代码、报错说明和位置内容的MD5值;
将所述文件名、扫描规则、所述错误行代码的MD5值、所述报错说明的MD5值和所述位置内容的MD5值连接,形成所述第一散列值。
11.根据权利要求8所述的静态代码扫描结果处理装置,其特征在于,所述查找模块具体用于:
在所述历史报错记录表中查找目标散列值,所述目标散列值为与所述第一散列值相同的散列值;
当查找到所述目标散列值时,获取所述目标散列值对应的错误行代码的位置内容;
当所述目标散列值对应的错误行代码的位置内容和所述第一散列值对应的错误行代码的位置内容相同时,确定目标函数签名为所述第二散列值。
12.根据权利要求11所述的静态代码扫描结果处理装置,其特征在于,所述目标散列值的位置内容和所述第一散列值的位置内容均为上下文代码;
所述装置还包括:
计算模块,用于执行以下步骤:
计算所述目标散列值对应的错误行代码的上下文代码和所述第一散列值对应的错误行代码的上下文代码的相似度,当所述相似度大于第一阈值时,确定所述目标散列值对应的错误行代码的位置内容和所述第一散列值对应的错误行代码的位置内容相同;
或者,
计算所述目标散列值对应的错误行代码的上下文代码和所述第一散列值对应的错误行代码的上下文代码的编辑距离,当所述编辑距离大于第二阈值时,确定所述目标散列值对应的错误行代码的位置内容和所述第一散列值对应的错误行代码的位置内容相同。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610671439.6A CN106250319B (zh) | 2016-08-15 | 2016-08-15 | 静态代码扫描结果处理方法和装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610671439.6A CN106250319B (zh) | 2016-08-15 | 2016-08-15 | 静态代码扫描结果处理方法和装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN106250319A CN106250319A (zh) | 2016-12-21 |
CN106250319B true CN106250319B (zh) | 2018-02-27 |
Family
ID=57592453
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201610671439.6A Active CN106250319B (zh) | 2016-08-15 | 2016-08-15 | 静态代码扫描结果处理方法和装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN106250319B (zh) |
Families Citing this family (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109960529B (zh) * | 2017-12-21 | 2023-03-17 | 北京奇虎科技有限公司 | 一种程序代码的修复方法和装置 |
CN108304327B (zh) * | 2018-02-02 | 2021-01-19 | 平安证券股份有限公司 | 静态代码扫描结果处理方法和装置 |
CN109358564B (zh) * | 2018-09-19 | 2022-05-20 | 珠海格力电器股份有限公司 | 一种检测组态软件的方法及装置、计算机可读存储介质 |
CN109491923B (zh) * | 2018-12-14 | 2021-11-12 | 东软集团股份有限公司 | 新增异常代码的确定方法、装置、介质及电子设备 |
CN110275827A (zh) * | 2019-05-31 | 2019-09-24 | 北京大米科技有限公司 | 一种代码缺陷判断方法、装置、存储介质及电子设备 |
CN110457902A (zh) * | 2019-06-25 | 2019-11-15 | 平安银行股份有限公司 | 银行系统的静态源代码扫描方法、装置及计算机存储介质 |
CN111240873A (zh) * | 2019-12-31 | 2020-06-05 | 广东趣炫网络股份有限公司 | 一种代码错误记录管理方法和装置 |
CN112346967B (zh) * | 2020-10-20 | 2022-03-01 | 四川长虹电器股份有限公司 | 基于云平台的pc-lint云服务系统、计算机设备及存储介质 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104246693A (zh) * | 2012-04-20 | 2014-12-24 | 飞思卡尔半导体公司 | 用于保护调用栈中的数据的信息处理装置和方法 |
CN105320591A (zh) * | 2014-07-25 | 2016-02-10 | 腾讯科技(深圳)有限公司 | 代码检测方法及装置 |
CN105468508A (zh) * | 2014-09-04 | 2016-04-06 | 阿里巴巴集团控股有限公司 | 代码检测方法及装置 |
-
2016
- 2016-08-15 CN CN201610671439.6A patent/CN106250319B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104246693A (zh) * | 2012-04-20 | 2014-12-24 | 飞思卡尔半导体公司 | 用于保护调用栈中的数据的信息处理装置和方法 |
CN105320591A (zh) * | 2014-07-25 | 2016-02-10 | 腾讯科技(深圳)有限公司 | 代码检测方法及装置 |
CN105468508A (zh) * | 2014-09-04 | 2016-04-06 | 阿里巴巴集团控股有限公司 | 代码检测方法及装置 |
Also Published As
Publication number | Publication date |
---|---|
CN106250319A (zh) | 2016-12-21 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN106250319B (zh) | 静态代码扫描结果处理方法和装置 | |
CA2892019C (en) | Method and apparatus for recovering data | |
US20200380125A1 (en) | Method for Detecting Libraries in Program Binaries | |
CN113420537B (zh) | 电子表格数据处理方法、装置、设备及存储介质 | |
CN111813845B (zh) | 基于etl任务的增量数据抽取方法、装置、设备及介质 | |
EP2862101B1 (en) | Method and a consistency checker for finding data inconsistencies in a data repository | |
CN111722998B (zh) | 代码的质量控制方法、系统、设备及存储介质 | |
CN110647562B (zh) | 一种数据查询方法和装置、电子设备、存储介质 | |
US20200042422A1 (en) | Log analysis method, system, and storage medium | |
CN112988440B (zh) | 一种系统故障预测方法、装置、电子设备及存储介质 | |
CN112231133B (zh) | 一种数据修复处理方法、装置及电子设备 | |
CN111666101A (zh) | 软件同源分析方法及装置 | |
CN113890821A (zh) | 一种日志关联的方法、装置及电子设备 | |
CN112988780A (zh) | 数据校核方法和装置、存储介质及电子设备 | |
US20220405184A1 (en) | Method, electronic device, and computer program product for data processing | |
CN113128213A (zh) | 日志模板提取方法及装置 | |
CN114625554A (zh) | 故障修复方法、装置、电子设备及存储介质 | |
CN112612810A (zh) | 慢sql语句识别方法及系统 | |
CN117216765A (zh) | 一种漏洞可达性检测方法、装置、设备及可读存储介质 | |
CN109491923B (zh) | 新增异常代码的确定方法、装置、介质及电子设备 | |
CN108255490B (zh) | 一种硬编码的处理方法及装置 | |
CN112395865A (zh) | 报关单校验方法及装置 | |
CN111240873A (zh) | 一种代码错误记录管理方法和装置 | |
EP4386601A1 (en) | System and method for auto repairing vulnerable code program fragments of a software | |
CN115586920B (zh) | 脆弱代码片段克隆检测方法、装置、电子设备及存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |