CN112035342B - 一种识别代码缺陷的方法及装置 - Google Patents
一种识别代码缺陷的方法及装置 Download PDFInfo
- Publication number
- CN112035342B CN112035342B CN202010806356.XA CN202010806356A CN112035342B CN 112035342 B CN112035342 B CN 112035342B CN 202010806356 A CN202010806356 A CN 202010806356A CN 112035342 B CN112035342 B CN 112035342B
- Authority
- CN
- China
- Prior art keywords
- parameter
- node
- code
- function
- identified
- 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
- 230000007547 defect Effects 0.000 title claims abstract description 53
- 238000000034 method Methods 0.000 title claims abstract description 49
- 230000006870 function Effects 0.000 claims abstract description 179
- 238000010586 diagram Methods 0.000 claims abstract description 71
- 239000013598 vector Substances 0.000 claims description 25
- 238000012545 processing Methods 0.000 claims description 13
- 238000004590 computer program Methods 0.000 claims description 9
- 238000012360 testing method Methods 0.000 description 17
- 238000007689 inspection Methods 0.000 description 5
- 238000004458 analytical method Methods 0.000 description 4
- 238000005516 engineering process Methods 0.000 description 3
- 238000012986 modification Methods 0.000 description 3
- 230000004048 modification Effects 0.000 description 3
- 230000004888 barrier function Effects 0.000 description 2
- 238000006243 chemical reaction Methods 0.000 description 2
- 238000011161 development Methods 0.000 description 2
- 230000003472 neutralizing effect Effects 0.000 description 2
- 230000008569 process Effects 0.000 description 2
- 238000004519 manufacturing process Methods 0.000 description 1
- 230000003287 optical 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
- G06F11/3608—Software analysis for verifying properties of programs using formal methods, e.g. model checking, abstract interpretation
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)
- Stored Programmes (AREA)
Abstract
本发明实施例提供一种识别代码缺陷的方法及装置,该方法包括:构建待识别代码的节点语法树;节点语法树中的各节点具有描述参数变量及函数的属性分支;针对待识别代码中待分析函数,从节点语法树中确定待分析函数对应的参数关联图;参数关联图用于表示与待分析函数中的参数变量存在指向关系的参数变量;确定参数关联图中是否存在外部可控的参数变量,若存在外部可控的参数变量,则确定待分析函数存在缺陷。如此,相比于现有技术中的抽象语法树通过代码中的语句建立节点以及通过规则匹配方式发现代码中的错误以及漏洞来说。本申请还可以通过参数关联图确定待识别代码中是否包含潜在缺陷,增加识别代码缺陷的准确性,降低代码审查人员的工作量。
Description
技术领域
本申请涉及计算机技术领域,尤其涉及一种识别代码缺陷的方法及装置。
背景技术
代码是程序开发人员用开发工具所支持的语言写出来的源文件,是一组由字符、符号或信号码元以离散形式表示信息的明确的规则体系。近年来,随着计算机技术与网络技术的迅速发展,代码的应用也愈加广泛。如,通过编辑代码可以实现网站、APP等以应用到生活的方方面面,改善人们的生活。但是,随着网站、APP的实现及其应用功能的增加,使得代码编辑愈加复杂,核查错误以及漏洞的变得越加困难。
现有技术中,通常应用自动化代码审查工具将代码转换为抽象语法树,然后通过规则匹配方式确定出现错误和漏洞的节点。但该种方法误报率过高,且不同语言种类的代码需要不同的转换方法生成抽象语法树;因此,代码审查人员在使用自动化代码审查工具审查代码时,需要确认代码语言种类,还需要根据审查结果确定该审查结果是否准确可信,增加代码审查人员的工作量。
因此,现在亟需一种识别代码缺陷的方法及装置,用于增加识别代码缺陷的准确性,降低代码审查人员的工作量。
发明内容
本发明实施例提供一种识别代码缺陷的方法及装置,用于增加识别代码缺陷的准确性,降低代码审查人员的工作量。
第一方面,本发明实施例提供一种识别代码缺陷的方法,该方法包括:
构建待识别代码的节点语法树;所述节点语法树中的各节点具有描述参数变量及函数的属性分支;针对所述待识别代码中待分析函数,从所述节点语法树中确定所述待分析函数对应的参数关联图;所述参数关联图用于表示与所述待分析函数中的参数变量存在指向关系的参数变量;确定所述参数关联图中是否存在外部可控的参数变量,若存在外部可控的参数变量,则确定所述待分析函数存在缺陷。
上述方法中,通过构建待识别代码的节点语法树,使得该节点语法树中的各节点具有描述参数变量及函数的属性分支。如此,相比于现有技术中的抽象语法树通过代码中的语句建立节点;本申请的节点语法树可以获得待识别代码的内部属性分支形成的属性结构以及属性内容,增加待识别代码的可视性;且由于该节点语法树是通过属性分支形成节点,则可以从各种语言的代码中和获取该代码的属性分支及属性内容,建立节点;打破不同种类语言代码不能转换成相同类型抽象语法树的壁垒,增加该节点语法树的通用性;也无需工作人员根据不同的抽象语法树生成参数关联图,降低工作人员的工作量。之后根据函数的属性分支中的待分析函数,以及与该待分析函数的参数变量存在指向关系的参数变量生成参数关联图。如此,在待分析函数的基础上生成与该待分析函数具有指向关系的参数变量,可以确定一切与该待分析函数具有关联的参数变量,当该待分析函数为容易引起待识别代码缺陷的函数时,则可以准确快速的从参数关联图中,确定出与该待分析函数有关联的所有参数变量中是否包含外部可控节点,进一步,确定该外部可控节点和待分析函数是否会形成缺陷。相比于现有技术中直接通过规则匹配方式匹配代码中可能引起代码错误以及漏洞的函数,即,应用错误正则语句匹配抽象语法树中各节点的语句,以发现代码中的引起错误以及漏洞的语句。本申请还可以通过参数关联图确定待识别代码中是否包含可能引起代码错误或漏洞的函数,以及该函数是否可与外部可控参数变量关联而形成潜在缺陷,增加识别代码缺陷的准确性,降低代码审查人员的工作量。
可选的,所述节点语法树中的各节点还具有类定义的属性分支、条件控制的属性分支;其中,具有描述函数的属性分支包括函数调用的属性分支和函数定义的属性分支;构建待识别代码的节点语法树,包括:针对所述待识别代码中的任一函数,创建所述函数的节点;按照节点的属性分支,将所述函数中的各行代码中的相应字段填入所述节点的属性分支中。
上述方法中,节点语法树中的各节点还可以具有类定义的属性分支、条件控制的属性分支。如此,当待识别代码中包含类定义和条件控制的内容时,则可以将待识别代码中包含类定义和条件控制的内容存放在类定义的属性分支和条件控制的属性分支中,增加待识别代码的可视性。函数的属性分支可以包括函数调用的属性分支和函数定义的属性分支。如此,在明确函数类型的属性分支后,以使相应的程序分别读取该函数调用的属性分支和函数定义的属性分支中的字段内容,并根据读取的字段内容和两种函数的函数关系以生成参数关联图,增加参数关联图的准确性,进一步,增加识别代码缺陷的准确性。且由于通过参数关联图可以发现待识别代码潜在的缺陷,因此,减少代码审查人员确认审查结果的准确性的工作量,或者,无需代码审查人员确认审查结果的准确性,降低代码审查人员的工作量。
可选的,所述待分析函数为所述节点语法树中的第一节点;从所述节点语法树中确定所述待分析函数对应的参数关联图,包括:针对所述待分析函数中的第一参数变量,确定所述节点语法树中具有所述第一参数变量的第二节点;若从所述第二节点中确定出所述第一参数变量具有指向关系的第二参数变量,则继续确定具有所述第二参数变量的第三节点,直至不存在具有指向关系的参数变量;按照指向关系,构建各参数变量之间的参数关联图。
上述方法中,从待分析函数中确定第一参数变量,进一步确定节点语法树中包含第一参数变量的第二节点。如此,根据第一参数变量获取到与待分析函数有关联的关联节点。进一步,确定第二节点中与第一参数变量具有指向关系的第二参数变量。如此,得到待分析函数有关联的第二参数变量。再进一步确定具有第二参数变量的第三节点。如此,根据第二参数变量获取到与待分析函数有关联的第三节点。按照如此方法找到所有与待分析函数有关联的节点以及参数变量,构建参数变量之间的参数关联图。如此,在确定待分析函数为容易引起缺陷的函数时,可以快速准确的确定其相关联的参数变量是否能够与该分析函数形成缺陷,增加识别代码缺陷的准确性,降低代码审查人员的工作量。
可选的,确定所述参数关联图中是否存在外部可控的参数变量,包括:针对所述待分析函数中的每个参数变量,确定所述参数变量在所述参数关联图中的指向关系中是否存在外部可控的参数变量。
上述方案中,当待分析函数为可能引起待识别代码缺陷的函数时,针对待分析函数生成参数关联图,确定与待分析函数中的每个参数变量存在关联关系的参数变量,确定其中是否包含外部可控的参数变量。因为存在关联关系,参数变量之间才会相互作用实现相应的功能;外部可控的参数变量可以由攻击者或攻击程序等写入相应的参数变量,以和待分析函数中的参数变量相互作用形成待识别代码的缺陷。因此,当确定与待分析函数中的参数变量存在关联关系的参数变量中存在外部可控的参数变量,则代表该待识别代码中存在潜在缺陷。增加识别代码缺陷的准确性,降低代码审查人员的工作量。
可选的,所述参数关联图中的各参数变量以向量形式存储;其中,向量形式为[参数变量、参数变量所在函数的类型、参数变量在函数中的位置、参数变量在待识别代码中的行数、参数变量所指向的参数变量]或[参数变量、参数变量在待识别代码中的行数、参数变量所指向的参数变量];确定所述参数关联图中是否存在外部可控的参数变量,包括:根据所述参数关联图中各参数变量的向量形式,确定是否存在外部可控的参数变量。
上述方法中,相应的程序或方法可以读取节点语法树中的各属性分支以及内容,根据属性分支和内容生成[参数变量、参数变量所在函数的类型、参数变量在函数中的位置、参数变量在待识别代码中的行数、参数变量所指向的参数变量]和\或[参数变量、参数变量在待识别代码中的行数、参数变量所指向的参数变量]形式的向量。如此,该程序或方法可以根据获取的向量确定参数变量、参数位置、参数指向等信息,进一步生成参数变量之间具有指向关系的参数关联图。如此,根据参数关联图中向量的指向关系找到外部可控的参数变量。增加识别代码缺陷的准确性,降低代码审查人员的工作量。
可选的,构建待识别代码的节点语法树之前,包括:确定所述待识别代码的代码语言;通过所述代码语言对应的解析器解析所述待识别代码,并转化为预设格式的待识别代码;构建待识别代码的节点语法树,包括:根据预设格式的所述待识别代码构建节点语法树。
上述方法中,还可以通过代码语言对应的解析器解析该待识别代码,并转化为预设格式的待识别代码,进一步根据预设格式的待识别代码构建节点语法树。如此,增加构建节点语法树的准确性。
可选的,所述节点语法树中的各节点还具有所述待识别代码的前缀的属性分支、中缀的属性分支、后缀的属性分支。
上述方法中,节点语法树中的各节点还可以包括待识别代码的前缀的属性分支、中缀的属性分支、后缀的属性分支。如此,节点语法树的节点中的属性分支越全面,节点语法树的可视性越强,增加节点语法树的可视性。
第二方面,本发明实施例提供一种识别代码缺陷的装置,该装置包括:
处理模块,用于构建待识别代码的节点语法树;所述节点语法树中的各节点具有描述参数变量及函数的属性分支;
确定模块,用于针对所述待识别代码中待分析函数,从所述节点语法树中确定所述待分析函数对应的参数关联图;所述参数关联图用于表示与所述待分析函数中的参数变量存在指向关系的参数变量;
所述确定模块还用于,确定所述参数关联图中是否存在外部可控的参数变量,若存在外部可控的参数变量,则确定所述待分析函数存在缺陷。
第三方面,本发明提供一种计算机设备,包括程序或指令,当所述程序或指令被执行时,用以执行上述第一方面及第一方面各个可选的方法。
第四方面,本发明提供一种存储介质,包括程序或指令,当所述程序或指令被执行时,用以执行上述第一方面及第一方面各个可选的方法。
附图说明
为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简要介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域的普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1为本发明实施例提供的一种识别代码缺陷的架构示意图;
图2为本发明实施例提供的一种识别代码缺陷的方法流程示意图;
图3为本发明实施例提供的一种待识别代码的节点语法树示意图;
图4为本发明实施例提供的一种待识别代码的参数关联图示意图;
图5为本发明实施例提供的一种待识别代码的参数关联图示意图;
图6为本发明实施例提供的一种识别代码缺陷的装置示意图。
具体实施方式
为了使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明作进一步地详细描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本发明保护的范围。
本发明实施例中识别代码缺陷的方法可以用于代码审查人员对当前编写的代码进行审查,还可用于对使用中的代码进行审查,以发现是否存在外部可控的参数变量造成该代码的缺陷。如图1所示,为本发明实施例提供的一种识别代码缺陷的架构示意图,将待识别代码输入代码处理101,代码处理101根据待识别代码生成节点语法树,代码处理101将节点语法树输入代码分析102,当代码分析102接收到待分析函数后,根据该待分析函数生成对应的参数关联图,根据该待分析函数的参数关联图中是否包含外部可控参数变量,确定该待识别代码是否存在缺陷。如此,增加识别待识别代码缺陷的准确性,降低代码审查人员的工作量。这里的可以在代码分析102中输入多个待分析函数,生成的参数关联图可以是多个待分析函数对应的参数关联图,该参数关联图中可以包含多个外部可控的参数变量。其中,一个待分析函数可能对应多个外部可控的参数变量,多个待分析函数也可能对应一个外部可控的参数变量,下面以一个待分析函数对应一个外部可控的参数变量为例。
基于此,本申请实施例提供了一种识别代码缺陷的流程,如图2所示,包括:
步骤201、构建待识别代码的节点语法树;所述节点语法树中的各节点具有描述参数变量及函数的属性分支;
此处,根据待识别代码构建节点语法树,该节点语法树中可以包含描述参数变量和函数的属性分支。如此,可以将描述参数变量的字段存放在节点的参数变量属性分支中,将描述函数的字段存放在节点的函数属性分支中。即使待识别代码的代码语言种类不同,只要识别该待识别代码的相应的属性,并将该属性对应的字段存放在节点的对应属性分支中即可。如,java的FunctionDef(函数定义)有返回类型和参数类型,但是Python的FunctionDef(函数定义)没有返回类型和参数类型;因此,当java类语言的待识别代码中包含FunctionDef时,根据该待识别代码生成的节点语法树的节点中包含FunctionDef属性分支以及FunctionDef属性分支延伸的返回类型和参数类型属性分支,或者FunctionDef属性分支中包含返回类型和参数类型内容。而根据python类语言的待识别代码中包含FunctionDef时,根据该待识别代码生成的节点语法树的节点中包含FunctionDef属性分支,但FunctionDef属性分支下没有延伸出返回类型和参数类型属性分支,或FunctionDef属性分支中返回类型和参数类型内容为空。
其中,可以根据待识别代码中的内容在节点语法树的各节点中建立其它属性分支,也可将属性分支进一步分化为更细种类的属性分支,这里不对属性分支的设置做限定。
步骤202、针对所述待识别代码中待分析函数,从所述节点语法树中确定所述待分析函数对应的参数关联图;所述参数关联图用于表示与所述待分析函数中的参数变量存在指向关系的参数变量;
此处,待分析函数为容易引起缺陷的函数或方法。
步骤203、确定所述参数关联图中是否存在外部可控的参数变量,若存在外部可控的参数变量,则确定所述待分析函数存在缺陷。
此处,外部可控的参数变量为可以在待识别代码编写完成后,后续在外部可控的参数变量中输入任意语句的参数变量,该外部可控的参数变量容易被攻击者利用与待分析函数结合实现攻击。
上述方法中,通过构建待识别代码的节点语法树,使得该节点语法树中的各节点具有描述参数变量及函数的属性分支。如此,相比于现有技术中的抽象语法树通过代码中的语句建立节点;本申请的节点语法树可以获得待识别代码的内部属性分支形成的属性结构以及属性内容,增加待识别代码的可视性;且由于该节点语法树是通过属性分支形成节点,则可以从各种语言的代码中和获取该代码的属性分支及属性内容,建立节点;打破不同种类语言代码不能转换成相同类型抽象语法树的壁垒,增加该节点语法树的通用性;也无需工作人员根据不同的抽象语法树生成参数关联图,降低工作人员的工作量。之后根据函数的属性分支中的待分析函数,以及与该待分析函数的参数变量存在指向关系的参数变量生成参数关联图。如此,在待分析函数的基础上生成与该待分析函数具有指向关系的参数变量,可以确定一切与该待分析函数具有关联的参数变量,当该待分析函数为容易引起待识别代码缺陷的函数时,则可以准确快速的从参数关联图中,确定出与该待分析函数有关联的所有参数变量中是否包含外部可控节点,进一步,确定该外部可控节点和待分析函数是否会形成缺陷。相比于现有技术中直接通过规则匹配方式匹配代码中可能引起代码错误以及漏洞的函数,即,应用错误正则语句匹配抽象语法树中各节点的语句,以发现代码中的引起错误以及漏洞的语句。本申请还可以通过参数关联图确定待识别代码中是否包含可能引起代码错误或漏洞的函数,以及该函数是否可与外部可控参数变量关联而形成潜在缺陷,增加识别代码缺陷的准确性,降低代码审查人员的工作量。
本申请实施例还提供了节点语法树中节点包含的属性分支,包括:所述节点语法树中的各节点还具有类定义的属性分支、条件控制的属性分支;其中,具有描述函数的属性分支包括函数调用的属性分支和函数定义的属性分支;构建待识别代码的节点语法树,包括:针对所述待识别代码中的任一函数,创建所述函数的节点;按照节点的属性分支,将所述函数中的各行代码中的相应字段填入所述节点的属性分支中。也就是说,节点语法树的节点中包含的属性分支不止包含参数变量的属性分支、函数的属性分支,还可以包含类定义的属性分支、条件控制的属性分支;而函数属性分支中又包含函数调用的属性分支和函数定义的属性分支。如,待识别代码为:
则对应的节点语法树如图3所示,其中,节点语法树的节点中可能包含Variable(参数变量)、ClassDef(类定义)、FunctionDef(函数定义)、FunctionCall(函数调用)、Controller(条件控制)的属性分支。即,描述函数的属性分支包括函数调用的属性分支和函数定义的属性分支。还可以在属性分支的基础上生成该属性分支对应的内容的节点,如图3中,上述待识别代码中的def funcA(A_A)属于FunctionDef(函数定义)属性分支,其中包含该语句在待识别代码中的行数:line:1,该语句中FunctionDef的name为funcA,该funcA中包含的参数变量在待识别代码中的行数:line:1,参数变量的name为A_A。该语句下的语句块包含Variable和FunctionCall属性分支,Variable属性分支在待识别代码中的行数:line:2,该语句中Variable的name为var_test,该语句中Variable的value为1。FunctionCall属性分支在待识别代码中的行数:line:3,该语句中FunctionCall的name为funcB,该funcB中包含的参数变量在待识别代码中的行数:line:3,参数变量的name分别为A_A和var_test。
本申请实施例还提供了一种参数关联图的生成方法,所述待分析函数为所述节点语法树中的第一节点;从所述节点语法树中确定所述待分析函数对应的参数关联图,包括:针对所述待分析函数中的第一参数变量,确定所述节点语法树中具有所述第一参数变量的第二节点;若从所述第二节点中确定出所述第一参数变量具有指向关系的第二参数变量,则继续确定具有所述第二参数变量的第三节点,直至不存在具有指向关系的参数变量;按照指向关系,构建各参数变量之间的参数关联图。如图4所示,在上述示例中,若所述待分析函数为funcC,则第一参数变量为var_b、var_e、var_c、var_p、var_d,分别对应的向量应为(var_b,funcC,0,12,var_b=func_test(B_B)+var_e)、(var_e,funcC,0,12,var_e=func_extra())、(var_c,funcC,0,12,var_c=func_other())、(var_p,funcC,0,12,var_p="test")、(var_d,funcC,0,12,var_d=10),以上向量形式为:[参数变量、参数变量所在函数的类型、参数变量在函数中的位置、参数变量在待识别代码中的行数、参数变量所指向的参数变量],则根据-参数变量所指向的参数变量-项,确定第二节点的第一参数变量指向的第二参数变量为:var_b指向func_test(B_B)中的B_B;var_e、var_c和var_p指向中不包含参数变量,即,第二节点中的第一参数变量没有指向的第二参数变量。具有第二参数变量B_B的第三节点为def funcB(B_A,B_B),因为funcB来自于funcB(A_A,var_test),则第二参数变量B_B的向量为(B_B,def funcB,1,5,funcB(A_A,var_test)。第四节点的第二参数变量指向的第三参数变量为funcB(A_A,var_test)中的var_test,var_test的向量为(var_test,funcB,1,3,funcB(A_A,var_test))。则第四节点中与第三参数变量具有指向关系的第四参数变量为A_A,A_A的向量为(A_A,funcB,0,3,def funcA(A_A))。则第五节点中与第四参数变量具有指向关系的第五参数变量为A_A,至此,该待识别代码对于待分析函数为funcC的参数关联图完成。
本申请实施例还提供了一种识别代码缺陷的方法,确定所述参数关联图中是否存在外部可控的参数变量,包括:针对所述待分析函数中的每个参数变量,确定所述参数变量在所述参数关联图中的指向关系中是否存在外部可控的参数变量。
此处,若上述示例中,待识别代码中的var_test=1改为var_test=sys.argv[1],sys.argv[1]为外部可控的参数变量,则待识别代码为:
则待分析函数为funcC时,根据该待识别代码生成的参数关联图如图5所示,则与待分析函数funcC关联的参数变量中包含外部可控的参数变量sys.argv[1],则该待分析函数为funcC与sys.argv[1]可能会被攻击者利用,造成该待识别代码的缺陷。这里本申请实施例还提供了一种可以确定待分析函数是否有关联的外部可控的参数变量的方法,即,A*算法,由于A*算法要求源函数与目的参数变量拥有连通性,才可以确定目的参数变量;因此,可以通过A*算法计算待分析函数与外部可控的参数变量之间的指向关系是否连通,以确定待分析函数是否有与其有指向关系的外部可控节点。这里确定待分析函数与外部可控的参数变量之间的指向关系的连通性的算法不止限于A*算法,如,狄克斯特拉算法等。
本申请实施例提供了一种参数变量的向量,所述参数关联图中的各参数变量以向量形式存储;其中,向量形式为[参数变量、参数变量所在函数的类型、参数变量在函数中的位置、参数变量在待识别代码中的行数、参数变量所指向的参数变量]或[参数变量、参数变量在待识别代码中的行数、参数变量所指向的参数变量];确定所述参数关联图中是否存在外部可控的参数变量,包括:根据所述参数关联图中各参数变量的向量形式,确定是否存在外部可控的参数变量。此处,[参数变量、参数变量所在函数的类型、参数变量在函数中的位置、参数变量在待识别代码中的行数、参数变量所指向的参数变量]如上述示例中的第一参数变量:var_b、var_e、var_c、var_p、var_d,分别对应的向量应为(var_b,funcC,0,12,var_b=func_test(B_B)+var_e)、(var_e,funcC,0,12,var_e=func_extra())、(var_c,funcC,0,12,var_c=func_other())、(var_p,funcC,0,12,var_p="test")、(var_d,funcC,0,12,var_d=10)。[参数变量、参数变量在待识别代码中的行数、参数变量所指向的参数变量]为如图3所示的,待识别代码中函数定义属性分支def funcA(A_A)节点下的参数变量A_A形成的节点,A_A的向量为(A_A,1,无);或,待识别代码中参数属性分支var_a=B_A节点下的参数变量var_a形成的节点,var_a的向量为(var_a,6,var_a=B_A)。
本申请实施例提供了一种代码语言转化方法,构建待识别代码的节点语法树之前,包括:确定所述待识别代码的代码语言;通过所述代码语言对应的解析器解析所述待识别代码,并转化为预设格式的待识别代码;构建待识别代码的节点语法树,包括:根据预设格式的所述待识别代码构建节点语法树。
此处,还可以将不同语言的待识别代码转化为预设格式的待识别代码,之后根据预设格式的待识别代码构建节点语法树,增加构建节点语法树的准确性。
本申请实施例还提供了节点语法树中节点包含的属性分支,所述节点语法树中的各节点还具有所述待识别代码的前缀的属性分支(Inifx)、中缀的属性分支(Suffix)、后缀的属性分支(Prefix)。在上述示例中,如图3所示,funcC(var_b+var_e,var_c+func_param(var_p),var_d)语句对应的节点中Inifx为(var_b+var_e,var_c+func_param(var_p),var_d),Inifx属性分支中又延伸了参数变量的属性分支:var_b、var_e、var_c、var_p、var_d。这里节点包含的属性分支可以不止包含上述属性分支,根据具体的待识别代码所包含的内容节点中还可以包含其它属性分支,如,指针的属性分支等等。
基于同样的构思,本申请实施例提供一种识别代码缺陷的装置,图6为本申请实施例提供的一种识别代码缺陷的装置示意图,如图6示,包括:
处理模块601,用于构建待识别代码的节点语法树;所述节点语法树中的各节点具有描述参数变量及函数的属性分支;
确定模块602,用于针对所述待识别代码中待分析函数,从所述节点语法树中确定所述待分析函数对应的参数关联图;所述参数关联图用于表示与所述待分析函数中的参数变量存在指向关系的参数变量;
所述确定模块602还用于,确定所述参数关联图中是否存在外部可控的参数变量,若存在外部可控的参数变量,则确定所述待分析函数存在缺陷。
可选的,所述节点语法树中的各节点还具有类定义的属性分支、条件控制的属性分支;其中,具有描述函数的属性分支包括函数调用的属性分支和函数定义的属性分支;所述处理模块601具体用于:针对所述待识别代码中的任一函数,创建所述函数的节点;按照节点的属性分支,将所述函数中的各行代码中的相应字段填入所述节点的属性分支中。
可选的,所述确定模块602具体用于:针对所述待分析函数中的第一参数变量,确定所述节点语法树中具有所述第一参数变量的第二节点;若从所述第二节点中确定出所述第一参数变量具有指向关系的第二参数变量,则继续确定具有所述第二参数变量的第三节点,直至不存在具有指向关系的参数变量;
按照指向关系,构建各参数变量之间的参数关联图。
可选的,所述确定模块602具体用于:针对所述待分析函数中的每个参数变量,确定所述参数变量在所述参数关联图中的指向关系中是否存在外部可控的参数变量。
可选的,所述参数关联图中的各参数变量以向量形式存储;其中,向量形式为[参数变量、参数变量所在函数的类型、参数变量在函数中的位置、参数变量在待识别代码中的行数、参数变量所指向的参数变量]或[参数变量、参数变量在待识别代码中的行数、参数变量所指向的参数变量];所述确定模块602具体用于:根据所述参数关联图中各参数变量的向量形式,确定是否存在外部可控的参数变量。
可选的,所述处理模块601还用于:确定所述待识别代码的代码语言;通过所述代码语言对应的解析器解析所述待识别代码,并转化为预设格式的待识别代码;所述处理模块601具体用于:根据预设格式的所述待识别代码构建节点语法树。
可选的,所述节点语法树中的各节点还具有所述待识别代码的前缀的属性分支、中缀的属性分支、后缀的属性分支。
本领域内的技术人员应明白,本申请的实施例可提供为方法、系统、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本申请是参照根据本申请的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
显然,本领域的技术人员可以对本申请进行各种改动和变型而不脱离本申请的精神和范围。这样,倘若本申请的这些修改和变型属于本申请权利要求及其等同技术的范围之内,则本申请也意图包含这些改动和变型在内。
Claims (10)
1.一种识别代码缺陷的方法,其特征在于,所述方法包括:
构建待识别代码的节点语法树;所述节点语法树中的各节点具有各自的描述参数变量的属性分支及描述函数的属性分支;
针对所述待识别代码中待分析函数,从所述节点语法树中确定所述待分析函数对应的参数关联图;所述参数关联图用于表示与所述待分析函数中的参数变量存在指向关系的参数变量;
确定所述参数关联图中是否存在外部可控的参数变量,若存在外部可控的参数变量,则确定所述待分析函数存在缺陷。
2.如权利要求1所述的方法,其特征在于,所述节点语法树中的各节点还具有类定义的属性分支、条件控制的属性分支;其中,具有描述函数的属性分支包括函数调用的属性分支和函数定义的属性分支;
构建待识别代码的节点语法树,包括:针对所述待识别代码中的任一函数,创建所述函数的节点;按照节点的属性分支,将所述函数中的各行代码中的相应字段填入所述节点的属性分支中。
3.如权利要求1所述的方法,其特征在于,所述待分析函数为所述节点语法树中的第一节点;从所述节点语法树中确定所述待分析函数对应的参数关联图,包括:
针对所述待分析函数中的第一参数变量,确定所述节点语法树中具有所述第一参数变量的第二节点;若从所述第二节点中确定出所述第一参数变量具有指向关系的第二参数变量,则继续确定具有所述第二参数变量的第三节点,直至不存在具有指向关系的参数变量;
按照指向关系,构建各参数变量之间的参数关联图。
4.如权利要求1所述的方法,其特征在于,
确定所述参数关联图中是否存在外部可控的参数变量,包括:
针对所述待分析函数中的每个参数变量,确定所述参数变量在所述参数关联图中的指向关系中是否存在外部可控的参数变量。
5.如权利要求1所述的方法,其特征在于,所述参数关联图中的各参数变量以向量形式存储;其中,向量形式为[参数变量、参数变量所在函数的类型、参数变量在函数中的位置、参数变量在待识别代码中的行数、参数变量所指向的参数变量]或[参数变量、参数变量在待识别代码中的行数、参数变量所指向的参数变量];
确定所述参数关联图中是否存在外部可控的参数变量,包括:
根据所述参数关联图中各参数变量的向量形式,确定是否存在外部可控的参数变量。
6.如权利要求1所述的方法,其特征在于,构建待识别代码的节点语法树之前,还包括:
确定所述待识别代码的代码语言;
通过所述代码语言对应的解析器解析所述待识别代码,并转化为预设格式的待识别代码;
构建待识别代码的节点语法树,包括:
根据预设格式的所述待识别代码构建节点语法树。
7.如权利要求1-6任一项所述的方法,其特征在于,所述节点语法树中的各节点还具有所述待识别代码的前缀的属性分支、中缀的属性分支、后缀的属性分支。
8.一种识别代码缺陷的装置,其特征在于,所述装置包括:
处理模块,用于构建待识别代码的节点语法树;所述节点语法树中的各节点具有各自的描述参数变量的属性分支及描述函数的属性分支;
确定模块,用于针对所述待识别代码中待分析函数,从所述节点语法树中确定所述待分析函数对应的参数关联图;所述参数关联图用于表示与所述待分析函数中的参数变量存在指向关系的参数变量;
所述确定模块还用于,确定所述参数关联图中是否存在外部可控的参数变量,若存在外部可控的参数变量,则确定所述待分析函数存在缺陷。
9.一种计算机可读存储介质,其特征在于,所述存储介质存储有程序,当所述程序在计算机上运行时,使得计算机执行权利要求1至7中任一项所述的方法。
10.一种计算机设备,其特征在于,包括:
存储器,用于存储计算机程序;
处理器,用于调用所述存储器中存储的计算机程序,按照获得的程序执行如权利要求1至7任一权利要求所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010806356.XA CN112035342B (zh) | 2020-08-12 | 2020-08-12 | 一种识别代码缺陷的方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010806356.XA CN112035342B (zh) | 2020-08-12 | 2020-08-12 | 一种识别代码缺陷的方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN112035342A CN112035342A (zh) | 2020-12-04 |
CN112035342B true CN112035342B (zh) | 2024-03-15 |
Family
ID=73577067
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202010806356.XA Active CN112035342B (zh) | 2020-08-12 | 2020-08-12 | 一种识别代码缺陷的方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112035342B (zh) |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102819490A (zh) * | 2012-07-20 | 2012-12-12 | 北京邮电大学 | 一种基于给定缺陷描述信息进行软件测试的方法及系统 |
WO2013190644A1 (ja) * | 2012-06-20 | 2013-12-27 | 株式会社 日立製作所 | 制御ソフトウェアの設計支援装置 |
CN105243019A (zh) * | 2015-10-27 | 2016-01-13 | 北京神州绿盟信息安全科技股份有限公司 | 一种检测python代码漏洞的方法及装置 |
CN108633310A (zh) * | 2015-07-31 | 2018-10-09 | 慧与发展有限责任合伙企业 | 基于类别的执行调度 |
CN108932192A (zh) * | 2017-05-22 | 2018-12-04 | 南京大学 | 一种基于抽象语法树的Python程序类型缺陷检测方法 |
Family Cites Families (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9645800B2 (en) * | 2014-12-19 | 2017-05-09 | Veracode, Inc. | System and method for facilitating static analysis of software applications |
US10606570B2 (en) * | 2018-03-08 | 2020-03-31 | Fujitsu Limited | Representing software with an abstract code graph |
-
2020
- 2020-08-12 CN CN202010806356.XA patent/CN112035342B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2013190644A1 (ja) * | 2012-06-20 | 2013-12-27 | 株式会社 日立製作所 | 制御ソフトウェアの設計支援装置 |
CN102819490A (zh) * | 2012-07-20 | 2012-12-12 | 北京邮电大学 | 一种基于给定缺陷描述信息进行软件测试的方法及系统 |
CN108633310A (zh) * | 2015-07-31 | 2018-10-09 | 慧与发展有限责任合伙企业 | 基于类别的执行调度 |
CN105243019A (zh) * | 2015-10-27 | 2016-01-13 | 北京神州绿盟信息安全科技股份有限公司 | 一种检测python代码漏洞的方法及装置 |
CN108932192A (zh) * | 2017-05-22 | 2018-12-04 | 南京大学 | 一种基于抽象语法树的Python程序类型缺陷检测方法 |
Non-Patent Citations (2)
Title |
---|
印鸿吉 ; 陈伟 ; .采用图遍历算法的服务端请求伪造漏洞检测.计算机工程与应用.2019,(第19期),119-124. * |
梁娟娟 ; 刘久富 ; 朱丹丹 ; 陈柯 ; .基于符号执行的软件静态测试研究.计算机技术与发展.2013,(第06期),48-51. * |
Also Published As
Publication number | Publication date |
---|---|
CN112035342A (zh) | 2020-12-04 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US8185878B2 (en) | Program maintenance support device, program maintenance supporting method, and program for the same | |
CN109033843B (zh) | 用于分布式静态检测系统的Java文件依赖性分析方法及模块 | |
CN109857641B (zh) | 对程序源文件进行缺陷检测的方法及装置 | |
CN109117633B (zh) | 静态源码扫描方法、装置、计算机设备及存储介质 | |
CN111104335B (zh) | 一种基于多层次分析的c语言缺陷检测方法及装置 | |
CN103218296A (zh) | 一种充分检测空指针引用缺陷的方法 | |
CN103294598A (zh) | 一种源代码检查方法及装置 | |
CN112988595A (zh) | 动态同步测试方法、装置、设备及存储介质 | |
US10628140B2 (en) | Program code generation apparatus | |
CN116028028B (zh) | 请求函数生成方法、装置、设备及存储介质 | |
CN114691196A (zh) | 动态语言的代码缺陷检测方法及装置、电子设备 | |
CN116305131B (zh) | 脚本静态去混淆方法及系统 | |
CN112035342B (zh) | 一种识别代码缺陷的方法及装置 | |
CN116340172A (zh) | 基于测试场景的数据收集方法、装置及测试用例检测方法 | |
CN112000573B (zh) | 代码质量的监控方法、装置、计算机设备及介质 | |
CN115495362A (zh) | 生成测试代码的方法、装置、存储介质及计算机设备 | |
CN115729560A (zh) | 程序代码处理方法及装置 | |
CN114510409B (zh) | 一种应用程序代码检测方法和计算机可读存储介质 | |
CN115454818A (zh) | 白盒接口测试方法、装置、电子设备及存储介质 | |
CN114691197A (zh) | 代码分析方法、装置、电子设备和存储介质 | |
CN113568662B (zh) | 一种基于调用关系的代码变更影响范围分析方法及系统 | |
JPH09288580A (ja) | ソースプログラムの最適化装置および最適化方法 | |
CN114610320B (zh) | 一种基于llvm的变量类型信息修复与比较方法及系统 | |
CN115291889B (zh) | 一种数据血缘关系建立方法、装置及电子设备 | |
CN118194291A (zh) | 测试数据生成方法、装置、存储介质及电子设备 |
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 | ||
GR01 | Patent grant | ||
GR01 | Patent grant |