[go: up one dir, main page]
More Web Proxy on the site http://driver.im/

CN109117633B - 静态源码扫描方法、装置、计算机设备及存储介质 - Google Patents

静态源码扫描方法、装置、计算机设备及存储介质 Download PDF

Info

Publication number
CN109117633B
CN109117633B CN201810915002.1A CN201810915002A CN109117633B CN 109117633 B CN109117633 B CN 109117633B CN 201810915002 A CN201810915002 A CN 201810915002A CN 109117633 B CN109117633 B CN 109117633B
Authority
CN
China
Prior art keywords
node
execution
source code
execution chain
chain
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
Application number
CN201810915002.1A
Other languages
English (en)
Other versions
CN109117633A (zh
Inventor
张全
李彦成
彭云鹏
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Beijing Baidu Netcom Science and Technology Co Ltd
Original Assignee
Beijing Baidu Netcom Science and Technology Co Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Beijing Baidu Netcom Science and Technology Co Ltd filed Critical Beijing Baidu Netcom Science and Technology Co Ltd
Priority to CN201810915002.1A priority Critical patent/CN109117633B/zh
Publication of CN109117633A publication Critical patent/CN109117633A/zh
Application granted granted Critical
Publication of CN109117633B publication Critical patent/CN109117633B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/50Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
    • G06F21/55Detecting local intrusion or implementing counter-measures
    • G06F21/56Computer malware detection or handling, e.g. anti-virus arrangements
    • G06F21/562Static detection
    • G06F21/563Static detection by source code analysis

Landscapes

  • Engineering & Computer Science (AREA)
  • Computer Security & Cryptography (AREA)
  • Software Systems (AREA)
  • Computer Hardware Design (AREA)
  • General Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Virology (AREA)
  • Health & Medical Sciences (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • General Health & Medical Sciences (AREA)
  • Stored Programmes (AREA)
  • Debugging And Monitoring (AREA)

Abstract

本申请提出一种静态源码扫描方法、装置、计算机设备及存储介质,其中,方法包括:获取待扫描源码对应的抽象语法树;对所述抽象语法树中的代码信息进行解析,生成与所述抽象语法树对应的执行链集合,其中,执行链集合中每条执行链分别与源码中的一条执行路径对应;对所述执行链集合中的每条执行链进行遍历,以确定所述源码中是否包含缺陷代码。通过本方法,只需分析每条执行链即可确定缺陷代码,分析过程简单、可靠,提高了分析效率,解决了现有技术中先将源代码转换为对应的控制流图,再对控制流图进行遍历分析实现源代码的静态扫描,分析过程复杂、效率低的技术问题。

Description

静态源码扫描方法、装置、计算机设备及存储介质
技术领域
本申请涉及数据处理技术领域,尤其涉及一种静态源码扫描方法、装置、计算机设备及存储介质。
背景技术
静态源代码扫描是近年被人们提及较多的软件应用安全解决方案之一,是指在软件工程中,程序员在写好源代码后,对编写完成的源代码进行扫描,以找出源代码当中存在的缺陷,保证软件质量。
目前,相关技术中,对源代码进行静态扫描时,多是通过各种方式将源代码转换为控制流图,再采用多种算法对控制流图进行遍历分析,以对源代码进行缺陷检测。这种静态扫描方式,分析过程复杂,并且对不同的分析目标需要编写对应的遍历程序,效率低。
发明内容
本申请旨在至少在一定程度上解决相关技术中的技术问题之一。
为此,本申请的提出一种静态源码扫描方法、装置、计算机设备及存储介质,用于解决现有技术中先将源代码转换为对应的控制流图,再对控制流图进行遍历分析实现源代码的静态扫描,分析过程复杂、效率低的技术问题。
为达上述目的,本申请第一方面实施例提出了一种静态源码扫描方法,包括:
获取待扫描源码对应的抽象语法树;
对所述抽象语法树中的代码信息进行解析,生成与所述抽象语法树对应的执行链集合,其中,执行链集合中每条执行链分别与源码中的一条执行路径对应;
对所述执行链集合中的每条执行链进行遍历,以确定所述源码中是否包含缺陷代码。
本申请实施例的静态源码扫描方法,通过获取待扫描源码对应的抽象语法树,对抽象语法树中的代码信息进行解析,生成与抽象语法树对应的执行链集合,进而对执行链集合中的每条执行链进行遍历,以确定源码中是否包含缺陷代码。由此,通过将源码转换为抽象语法树,而抽象语法树自身包含了源码的所有信息,从而可以直接根据抽象语法树获取所有可能的执行链,进而对每条执行链进行遍历,即可确定缺陷代码,分析过程简单、可靠,提高了分析效率。
为达上述目的,本申请第二方面实施例提出了一种静态源码扫描装置,包括:
获取模块,用于获取待扫描源码对应的抽象语法树;
生成模块,用于对所述抽象语法树中的代码信息进行解析,生成与所述抽象语法树对应的执行链集合,其中,执行链集合中每条执行链分别与源码中的一条执行路径对应;
遍历模块,用于对所述执行链集合中的每条执行链进行遍历,以确定所述源码中是否包含缺陷代码。
本申请实施例的静态源码扫描装置,通过获取待扫描源码对应的抽象语法树,对抽象语法树中的代码信息进行解析,生成与抽象语法树对应的执行链集合,进而对执行链集合中的每条执行链进行遍历,以确定源码中是否包含缺陷代码。由此,通过将源码转换为抽象语法树,而抽象语法树自身包含了源码的所有信息,从而可以直接根据抽象语法树获取所有可能的执行链,进而对每条执行链进行遍历,即可确定缺陷代码,分析过程简单、可靠,提高了分析效率。
为达上述目的,本申请第三方面实施例提出了一种计算机设备,包括:处理器和存储器;其中,所述处理器通过读取所述存储器中存储的可执行程序代码来运行与所述可执行程序代码对应的程序,以用于实现如第一方面实施例所述的静态源码扫描方法。
为达上述目的,本申请第四方面实施例提出了一种非临时性计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现如第一方面实施例所述的静态源码扫描方法。
为达上述目的,本申请第五方面实施例提出了一种计算机程序产品,当所述计算机程序产品中的指令由处理器执行时实现如第一方面实施例所述的静态源码扫描方法。
本申请附加的方面和优点将在下面的描述中部分给出,部分将从下面的描述中变得明显,或通过本申请的实践了解到。
附图说明
本申请上述的和/或附加的方面和优点从下面结合附图对实施例的描述中将变得明显和容易理解,其中:
图1为本申请实施例所提供的一种静态源码扫描方法的流程示意图;
图2(a)为源码转换为抽象语法树的示例图一;
图2(b)为源码转换为抽象语法树的示例图二;
图3为本申请实施例所提供的另一种静态源码扫描方法的流程示意图;
图4(a)为执行链中的语句可拆解的示例图;
图4(b)为将子执行链合并至主执行链后的示例图;
图5为本申请实施例所提供的又一种静态源码扫描方法的流程示意图;
图6为本申请实施例所提供的一种静态源码扫描装置的结构示意图;
图7为本申请实施例所提供的另一种静态源码扫描装置的结构示意图;
图8为本申请实施例所提供的又一种静态源码扫描装置的结构示意图;以及
图9为本申请实施例所提供的计算机设备的结构示意图。
具体实施方式
下面详细描述本申请的实施例,所述实施例的示例在附图中示出,其中自始至终相同或类似的标号表示相同或类似的元件或具有相同或类似功能的元件。下面通过参考附图描述的实施例是示例性的,旨在用于解释本申请,而不能理解为对本申请的限制。
下面参考附图描述本申请实施例的静态源码扫描方法、装置、计算机设备及存储介质。
图1为本申请实施例所提供的一种静态源码扫描方法的流程示意图。
如图1所示,该静态源码扫描方法可以包括以下步骤:
步骤101,获取待扫描源码对应的抽象语法树。
抽象语法树(Abstract Syntax Tree,AST)是源代码的抽象语法结构的树状表现形式,具有不依赖于具体文法和语言细节的特点,有利于减少代码分析过程中的工作量。
本实施例中,对于待扫描的源码,可以获取对应的抽象语法树。具体地,可以借助于语法分析器,将待扫描源码通过语法分析器,转换为对应的抽象语法树。比如,语法分析器可以为ANTLR、PHP-Parser、Eclipse JDT、Clang、JavaCC等。
举例而言,假设待扫描源码如下:
Figure BDA0001762744950000031
则,对该待扫描源码进行转换后,得到的抽象语法树如图2(a)所示。
又例如,假设待扫描源码如下:
Figure BDA0001762744950000032
Figure BDA0001762744950000041
则,对该XML语言的源码进行转换后,得到的抽象语法树如图2(b)所示。
步骤102,对抽象语法树中的代码信息进行解析,生成与抽象语法树对应的执行链集合,其中,执行链集合中每条执行链分别与源码中的一条执行路径对应。
将待扫描源码转换为对应的抽象语法树之后,抽象语法树自身包含了待扫描源码中的所有信息,可以直接从抽象语法树上获取待扫描源码所有可能的执行路径,即执行链。从而,本实施例中,可以对获取的抽象语法树中的代码信息进行解析,得到待扫描源码中可能包含的所有执行链,进而利用所有的执行链,生成与抽象语法树对应的执行链集合。
举例而言,以如图2(a)所示的抽象语法树为例,对该抽象语法树进行解析,可以得到三条执行链,分别为:①stmts_list→[false]stmt_while condition→stmt_return;②stamts_list→[true]stamt_while_condition→[false]stmtif condition→else_bodyassign(=)→stmt_return;③stamts_list→[true]stamt_while_condition→[true]stmtif condition→if_body assign(=)→stmt_return,则与该抽象语法树对应的执行链集合包括上述三条执行链。
步骤103,对执行链集合中的每条执行链进行遍历,以确定源码中是否包含缺陷代码。
本实施例中,得到抽象语法树对应的执行链集合后,可以对执行链集合中的每条执行链进行遍历,以确定源码中是否包含缺陷代码。通过遍历每条执行链即可发现缺陷代码,避免了相关技术中,首先将抽象语法树转化为控制流图,然后再对控制流图进行遍历的繁琐过程,提高了静态源码的扫描效率。
本实施例的静态源码扫描方法,通过获取待扫描源码对应的抽象语法树,对抽象语法树中的代码信息进行解析,生成与抽象语法树对应的执行链集合,进而对执行链集合中的每条执行链进行遍历,以确定源码中是否包含缺陷代码。由此,通过将源码转换为抽象语法树,而抽象语法树自身包含了源码的所有信息,从而可以直接根据抽象语法树获取所有可能的执行链,进而对每条执行链进行遍历,即可确定缺陷代码,分析过程简单、可靠,提高了分析效率。
为了更加清楚地描述前述实施例中对抽象语法树中的代码信息进行解析,生成与抽象语法树对应的执行链集合的具体实现过程,本申请提出了另一种静态源码扫描方法,图3为本申请实施例所提供的另一种静态源码扫描方法的流程示意图。
如图3所示,在如图1所示实施例的基础上,步骤102可以包括以下步骤:
步骤201,由父节点至末端子节点,依次根据每个节点对应的节点类型,生成多条子执行链,其中,每条子执行链中包括至少一个节点。
语法分析器中会预先定义一些节点类型,利用语法分析器将待扫描源码转换为抽象语法树时,会按照预先定义的节点类型,对抽象语法树中的各节点进行节点类型标记。
比如,在PHP-Parser语法分析器中,定义的部分节点类型有:
(1)PhpParser\Node\Stmt,语句节点,是不带任何返回信息(return)的结构,如赋值语句“$a=$b”;
(2)PhpParser\Node\Expr,表达式节点,是可以返回一个值的语言结构,如$var和func();
(3)PhpParser\Node\Scalar,常量节点,可以用来表示任何常量值。
又比如,在Eclipse JDT语法分析器中,定义的部分节点类型有:
(1)ExpressionStatement,语句表达式,表示执行一段普通的语句,如“object.toString()”;
(2)VariableDeclaration,变量定义,表示定义一个变量,如“int a=1;”;
(3)IfStatement,条件表达式,是一个包含if/else的分支结构,如“if(a){objectA.toString();}else{objectB.toString();}”。
在实际应用时,由于不同类型的节点,表达的含义不同,比如语句节点、常量节点等,通常为语句的基本节点,在从父节点至子节点进行解析时,遇到该类型的节点后,即可停止继续对节点进行拆解;而对于条件语句节点,比如if语句节点,由于该类节点会包含条件子节点及执行语句子节点等,因此,需要对该节点之后的各节点进行继续解析,以确定当前执行语句中的多个分支语句。也就是说,本实施例中,在对抽象语法树进行解析时,从父节点至末端子节点,可以根据抽象语法树中每个节点的类型,来确定执行链的起止位置及拆分方式,从而生成多条子执行链。
举例而言,以如图2(a)所示的抽象语法树为例,根据每个节点的节点类型,从父节点stmts_list开始进行遍历,至节点“stmt_while”时,由于该节点为循环语句,即该节点之后的各节点需要进行进一步拆解,以组成当前执行语句的各分支语句。进一步的,对于节点oper_ne(!=),该节点的节点类型为condition,则可以确定该节点所在的分支语句结束,即节点stmt_while-oper_ne(!=)组成了一条执行语句;而对于节点stmt_if,其节点类型为while_body,则可以确定该节点对应3条子执行链,并进一步根据每一条子执行链中包括的节点的节点类型,对子执行链进行进一步拆解,得到更加细化的子执行链。之后,再将stmt_if包含的各子执行链与stmt_while节点对应的执行语句进行合并,即可得到以stmt_while为父节点的其它各执行链。
在本申请实施例一种可能的实现方式中,依次根据每个节点对应的节点类型,生成多条子执行链时,可以先依次判断每个节点对应的节点类型是否为预设的节点类型,即判断每个节点是否为需要继续拆解的节点。其中,预设的节点类型包括但不限于块(Block)、if/else语句、switch/case语句、try/catch语句、循环语句(for、while、EnhancedFor等)、表达式等。如果任一节点对应的节点类型为预设的节点类型,则对任一节点所在的结构块中每个子节点的代码信息进行解析,以生成与任一节点所在的结构块对应的子执行链集合,其中,子执行链集合中包括多条子执行链;如果节点的节点类型不是预设的节点类型中的任一种,则对任一节点所在的结构块的代码信息进行解析,以生成与任一节点所在的结构块对应的执行语句。
仍以图2(a)所示的抽象语法树为例,对于节点stmt_if,其节点类型为while_body,属于预设的节点类型中的一种,则对该节点所在的结构块中的每个子节点的代码信息进行解析,以获取该结构块对应的子执行链集合。其中,节点stmt_if所在的结构块,指的是以该节点为父节点的树形结构,包括子节点oper_gt(>)、节点类型为if_body的节点assign(=)、节点类型为else_body的节点assign(=),以及这三个节点之后的多个子节点,在图2(a)中,曲线内的多个节点构成的树形结构,即为节点stmt_if所在的结构块。从图2(a)中可以看出,该结构体中还包括节点类型分别为if_body和else_body的两个节点assign(=),则进一步对这两个节点分别所在的结构块中的每个子节点的代码信息进行解析,获取结构块对应的子执行链集合。对于节点oper_ne(!=),其节点类型为condition,不是预设的节点类型,则直接对该节点所在的结构块(该节点之后包括两个子节点,分别为variable(b)和constant(0))的代码信息进行解析,得到对应的执行语句。
步骤202,根据多条子执行链中的节点间的关系,将多条子执行链进行合并处理,生成至少一条总执行链。
本实施例中,得到多条子执行链之后,可以根据多条子执行链中的节点间的关系,对多条子执行链进行合并处理,得到至少一条总执行链。
以如图2(a)所示的抽象语法树为例,根据图2(a)所示的抽象语法树,节点stmt_if对应两条子执行链,分别为节点类型为if_body的节点所在的结构块对应的对应的子执行链,以及节点类型为else_body的节点所在的结构块对应的对应的子执行链;节点stmt_while也对应两条子执行链,分别为while条件满足时对应的子执行链和while条件不满足时对应的子执行链。节点类型分别为if_body和else_body的两个节点assign(=),均为节点stmt_if的子节点,而节点stmt_if是节点stmt_while的子节点,则可以将节点stmt_if所在的结构块对应的子执行链合并至节点stmt_while所在的结构块对应的子执行链,根据排列组合的方式,可以得到四条总执行链。
在本申请实施例一种可能的实现方式中,对于组合或嵌套的顺序结构,可以将基础结构块的执行链组合在一起,得到整体的执行链。如图4(a)所示,对于一条e1→e2→…→ex→…→en的主执行链,其中,e2语句可以继续拆解为两条子执行链,分别为e2_11→e2_12→…→e2_1x→…→e2_1n和e2_21→e2_22→…→e2_2x→…→e2_2n,则将拆解后的子执行链合并至主执行链,得到如图4(b)所示的两条总执行链。进一步地,合并子执行链得到的新执行链中,可能仍包括可继续拆解的语句,则可以继续对可拆解语句进行拆解,得到子执行链后合并至主执行链,得到新的主执行链,即子执行链的拆解过程是一个递归过程,直至无可拆解语句后,得到最终的总执行链。
进一步地,如图3所示,步骤103可以包括:
步骤203,对多条子执行链及至少一条总执行链分别进行遍历,以确定源码中是否包含缺陷代码。
本实施例中,得到总执行链之后,可以对多条子执行链和得到的至少一条总执行链分别进行遍历分析,以确定源码中是否包含缺陷代码。
本实施例的静态源码扫描方法,通过由父节点至末端子节点依次根据每个节点的节点类型,生成多条子执行链,根据多条子执行链中的节点间的关系,将多条子执行链进行合并处理,生成至少一条总执行链,进而对多条子执行链和至少一条总执行链分别进行遍历,能够检测出单一的子执行链正常但多个子执行链合并后出现异常的情况,提高缺陷代码排查的全面性,提高代码扫描的准确性。
能够理解的是,在程序运行的过程中,不同条件下执行的路径不同。从而,在本申请实施例一种可能的实现方式中,执行链集合中包含的执行链,还可以包括各节点的节点内容和状态信息,进而对执行链中的各执行链进行遍历来分析缺陷代码时,可以根据执行链中各节点的节点内容和/或状态信息,来确定源码是否包含缺陷代码。从而,本申请提出了另一种静态源码扫描方法,图5为本申请实施例所提供的又一种静态源码扫描方法的流程示意图。
如图5所示,在如图1所示实施例的基础上,步骤103可以包括以下步骤:
步骤301,对每条执行链进行遍历,以确定每条执行链中各节点间的节点内容和/或状态信息是否匹配。
其中,节点内容,是指节点对应的源代码中的具体执行内容,比如节点对应的方法、变量取值等。另外,由于执行链包含了程序运行期间的可能状态,则在表示执行链时,可以标注出对应语句的状态信息,其中,状态信息可以用中括号“[]”标识在执行链中。
例如,对于包含一个与(&&)表达式的条件表达式,if(LeftExpression&&RightExpression)If Body else Else Body,其对应的执行链有3条,分别为:
[true]Left Expression→[true]Right Expression→If Body
[true]Left Expression→[false]Right Expression→Else Body
[false]Left Expression→Else Body
本实施中,对于执行链集合中的每一条执行链进行遍历时,可以根据执行链中标注的每个节点的内容、状态信息,来确认每条执行链中每个节点的节点内容和状态信息,是否与其他节点的节点内容、和状态信息匹配。
其中,节点间的内容和状态信息是否匹配,是指同一执行链中,各节点对同一内容的定义应当一致、且同一变量的执行状态与各节点定义的该变量的状态,应当一致。
举例来说,在如下的执行语句中:e2_11→e2_12→…→e2_1x→…→e2_1n,若节点e2_11对应的节点内容为X==null,且节点e2_11的状态信息为true,即节点e2_11指示了变量X为空变量,若节点e2_1x的节点内容中调用了变量X的任意一个方法,由于空变量调用方法时会抛出空指针异常,从而可以确定节点e2_1x的节点内容,与其它节点的节点内容有冲突。
步骤302,若任一条执行链中至少一个节点内容和/或状态信息未与其它节点的节点内容和/或状态信息匹配,则确定源码包含缺陷代码。
本实施例中,对于任一条执行链,当执行链中至少一个节点的状态信息与前后节点状态信息冲突时,则确定源码包含缺陷代码。比如,对于前述的条件与表达式,其对应的一条执行链为[true]LeftExpression→[true]RightExpression→IfBody,其中有状态[true]LeftExpression,如果IfBody节点中包含与此状态冲突的节点状态,如[false]LeftExpression,则认为这两个节点的状态信息发生冲突,进而确定源码包含缺陷代码。
进一步的,对于任一条执行链,当执行链中的节点状态与节点内容有冲突时,则确定源码包含缺陷代码。比如,对于前述的条件与表达式,其对应的一条执行链为[false]LeftExpression→ElseBody,其中LeftExpression节点的状态信息为false,此时,如果ElseBody节点的节点内容中包含只有在节点LeftExpression的状态为true条件下才能执行的内容,则说明该执行链中的节点状态与节点内容未匹配,进而确定源码包含缺陷代码。
进一步的,对于任一条执行链,当节点内容前后有冲突时,则确定源码包含缺陷代码。例如执行链中,某个节点之后,出现了与此节点操作内容互斥的内容,则说明该执行链中包含节点内容互相冲突的节点,进而确定源码包含缺陷代码。
通过上述分析可知,在对执行链进行遍历时,需要分别判断执行链中各节点间的状态信息是否匹配、各节点间的节点内容是否匹配、及各节点间的状态信息与节点内容是否匹配,进而才能确定该执行链对应的源码是否包含缺陷代码。
进一步地,在本申请实施例一种可能的实现方式中,每条执行链中还可以包括对应的源代码行信息,以便于确定源代码中的缺陷代码。从而,如图5所示,步骤302之后,还可以包括:
步骤303,根据任一执行链对应的源代码行信息,确定源码中的缺陷代码。
本实施例中,在生成执行链时,将执行链对应的源代码行信息携带在执行链中,则确定执行链中至少一个节点的状态信息异常后,可以进一步根据该执行链中包含的源代码行信息,确定源代码中的缺陷代码,源代码中,该源代码行信息对应的代码,即为缺陷代码。
本实施例的静态代码扫描方法,通过在执行链中携带各节点的状态信息,对每条执行链进行遍历,来确定每条执行链中各节点间的状态信息是否异常,并在任一执行链中至少一个节点的节点内容和/或状态信息,与其他节点的节点内容和/或状态信息未匹配时,确定源码含缺陷信息,实现了根据节点的节点内容和状态来检测缺陷代码,提高了缺陷代码识别的便捷性和效率;并且通过在执行链中携带源代码行信息,从而在确定任一条执行链中至少一个节点的节点内容和/或状态信息与其他节点的节点内容和/或状态信息未匹配之后,根据源代码行信息,确定源码中的缺陷代码,实现了缺陷代码的快速定位,提高了缺陷代码检测效率。
为了实现上述实施例,本申请还提出一种静态源码扫装置。
图6为本申请实施例所提供的一种静态源码扫描装置的结构示意图。
如图6所示,该静态源码扫描装置50可以包括:获取模块510、生成模块520,以及遍历模块530。其中,
获取模块510,用于获取待扫描源码对应的抽象语法树。
本实施例中,可以在获取模块510中植入语法分析器,利用语法分析器,将待扫描源码转换为对应的抽象语法树。其中,语法分析器比如可以为ANTLR、PHP-Parser、EclipseJDT、Clang、JavaCC等。
生成模块520,用于对抽象语法树中的代码信息进行解析,生成与抽象语法树对应的执行链集合,其中,执行链集合中每条执行链分别与源码中的一条执行路径对应。
遍历模块530,用于对执行链集合中的每条执行链进行遍历,以确定源码中是否包含缺陷代码。
进一步地,在本申请实施例一种可能的实现方式中,如图7所示,在如图6所示实施例的基础上,生成模块520包括:
生成单元521,用于由父节点至末端子节点,依次根据每个节点对应的节点类型,生成多条子执行链,其中,每条子执行链中包括至少一个节点。
在本申请实施例一种可能的实现方式中,生成单元521具体用于,依次判断每个节点对应的节点类型,是否为预设的节点类型;若任一节点对应的节点类型为预设的节点类型,则对任一节点所在的结构块中每个子节点的代码信息进行解析,以生成与任一节点所在的结构块对应的子执行链;否则,对任一节点所在的结构块的代码信息进行解析,以生成与任一节点所在的结构块对应的执行语句。
合并单元522,用于根据多条子执行链中的节点间的关系,将多条子执行链进行合并处理,生成至少一条总执行链。
本实施例中,遍历模块530具体用于对多条子执行链及至少一条总执行链分别进行遍历。
通过由父节点至末端子节点依次根据每个节点的节点类型,生成多条子执行链,根据多条子执行链中的节点间的关系,将多条子执行链进行合并处理,生成至少一条总执行链,进而对多条子执行链和至少一条总执行链分别进行遍历,能够检测出单一的子执行链正常但多个子执行链合并后出现异常的情况,提高缺陷代码排查的全面性,提高代码扫描的准确性。
在本申请实施例一种可能的实现方式中,执行链中包括各节点的状态信息,从而,如图8所示,在如图6所示实施例的基础上,遍历模块530包括:
遍历单元531,用于对每条执行链进行遍历,以确定每条执行链中各节点间的状态信息是否异常。
确定单元532,用于在任一条执行链中至少一个节点的状态信息异常时,确定源码含缺陷代码。
通过在执行链中携带各节点的状态信息,对媒体执行链进行遍历,来确定每条执行链中各节点间的状态信息是否异常,并在任一执行链中至少一个节点的状态信息异常时,确定源码含缺陷信息,实现了根据节点的状态来检测缺陷代码,提高了缺陷代码识别的便捷性和效率。
进一步地,每条执行链中还可以包括对应的源代码行信息。从而,如图8所示,该静态源码扫描装置50还可以包括:
确定模块540,用于根据任一执行链对应的源代码行信息,确定源码中的缺陷代码。
通过在执行链中携带源代码行信息,在确定任一条执行链中至少一个节点的状态信息异常之后,根据源代码行信息,确定源码中的缺陷代码,实现了缺陷代码的快速定位,提高了缺陷代码检测效率。
需要说明的是,前述对静态源码扫描方法实施例的解释说明也适用于该实施例的静态源码扫描装置,其实现原理类似,此处不再赘述。
本实施例的静态源码扫描装置,通过获取待扫描源码对应的抽象语法树,对抽象语法树中的代码信息进行解析,生成与抽象语法树对应的执行链集合,进而对执行链集合中的每条执行链进行遍历,以确定源码中是否包含缺陷代码。由此,通过将源码转换为抽象语法树,而抽象语法树自身包含了源码的所有信息,从而可以直接根据抽象语法树获取所有可能的执行链,进而对每条执行链进行遍历,即可确定缺陷代码,分析过程简单、可靠,提高了分析效率。
为了实现上述实施例,本申请还提出一种计算机设备,包括:处理器和存储器。其中,处理器通过读取存储器中存储的可执行程序代码来运行与可执行程序代码对应的程序,以用于实现如前述实施例所述的静态源码扫描方法。
图9为本申请实施例所提供的计算机设备的结构示意图,示出了适于用来实现本申请实施方式的示例性计算机设备90的框图。图9显示的计算机设备90仅仅是一个示例,不应对本申请实施例的功能和使用范围带来任何限制。
如图9所示,计算机设备90以通用计算机设备的形式表现。计算机设备90的组件可以包括但不限于:一个或者多个处理器或者处理单元906,系统存储器910,连接不同系统组件(包括系统存储器910和处理单元906)的总线908。
总线908表示几类总线结构中的一种或多种,包括存储器总线或者存储器控制器,外围总线,图形加速端口,处理器或者使用多种总线结构中的任意总线结构的局域总线。举例来说,这些体系结构包括但不限于工业标准体系结构(Industry StandardArchitecture;以下简称:ISA)总线,微通道体系结构(Micro Channel Architecture;以下简称:MAC)总线,增强型ISA总线、视频电子标准协会(Video Electronics StandardsAssociation;以下简称:VESA)局域总线以及外围组件互连(Peripheral ComponentInterconnection;以下简称:PCI)总线。
计算机设备90典型地包括多种计算机系统可读介质。这些介质可以是任何能够被计算机设备90访问的可用介质,包括易失性和非易失性介质,可移动的和不可移动的介质。
系统存储器910可以包括易失性存储器形式的计算机系统可读介质,例如随机存取存储器(Random Access Memory;以下简称:RAM)911和/或高速缓存存储器912。计算机设备90可以进一步包括其它可移动/不可移动的、易失性/非易失性计算机系统存储介质。仅作为举例,存储系统913可以用于读写不可移动的、非易失性磁介质(图9未显示,通常称为“硬盘驱动器”)。尽管图9中未示出,可以提供用于对可移动非易失性磁盘(例如“软盘”)读写的磁盘驱动器,以及对可移动非易失性光盘(例如:光盘只读存储器(Compact Disc ReadOnly Memory;以下简称:CD-ROM)、数字多功能只读光盘(Digital Video Disc Read OnlyMemory;以下简称:DVD-ROM)或者其它光介质)读写的光盘驱动器。在这些情况下,每个驱动器可以通过一个或者多个数据介质接口与总线908相连。系统存储器910可以包括至少一个程序产品,该程序产品具有一组(例如至少一个)程序模块,这些程序模块被配置以执行本申请各实施例的功能。
计算机可读的信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括——但不限于——电磁信号、光信号或上述的任意合适的组合。计算机可读的信号介质还可以是计算机可读存储介质以外的任何计算机可读介质,该计算机可读介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。
计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括——但不限于——无线、电线、光缆、RF等等,或者上述的任意合适的组合。
可以以一种或多种程序设计语言或其组合来编写用于执行本申请操作的计算机程序代码,所述程序设计语言包括面向对象的程序设计语言—诸如Java、Smalltalk、C++,还包括常规的过程式程序设计语言—诸如“C”语言或类似的程序设计语言。程序代码可以完全地在用户计算机上执行、部分地在用户计算机上执行、作为一个独立的软件包执行、部分在用户计算机上部分在远程计算机上执行、或者完全在远程计算机或服务器上执行。
具有一组(至少一个)程序模块9140的程序/实用工具914,可以存储在例如系统存储器910中,这样的程序模块9140包括但不限于操作系统、一个或者多个应用程序、其它程序模块以及程序数据,这些示例中的每一个或某种组合中可能包括网络环境的实现。程序模块9140通常执行本申请所描述的实施例中的功能和/或方法。
计算机设备90也可以与一个或多个外部设备10(例如键盘、指向设备、显示器100等)通信,还可与一个或者多个使得用户能与该终端设备90交互的设备通信,和/或与使得该计算机设备90能与一个或多个其它计算设备进行通信的任何设备(例如网卡,调制解调器等等)通信。这种通信可以通过输入/输出(I/O)接口902进行。并且,计算机设备90还可以通过网络适配器900与一个或者多个网络(例如局域网(Local Area Network;以下简称:LAN),广域网(Wide Area Network;以下简称:WAN)和/或公共网络,例如因特网)通信。如图9所示,网络适配器900通过总线908与计算机设备90的其它模块通信。应当明白,尽管图9中未示出,可以结合计算机设备90使用其它硬件和/或软件模块,包括但不限于:微代码、设备驱动器、冗余处理单元、外部磁盘驱动阵列、RAID系统、磁带驱动器以及数据备份存储系统等。
处理单元906通过运行存储在系统存储器910中的程序,从而执行各种功能应用以及数据处理,例如实现前述实施例中提及的静态源码扫描方法。
为了实现上述实施例,本申请还提出一种非临时性计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时,实现如前述实施例所述的静态源码扫描方法。
为了实现上述实施例,本申请还提出一种计算机程序产品,当所述计算机程序产品中的指令由处理器执行时,实现如前述实施例所述的静态源码扫描方法。
在本说明书的描述中,参考术语“一个实施例”、“一些实施例”、“示例”、“具体示例”、或“一些示例”等的描述意指结合该实施例或示例描述的具体特征、结构、材料或者特点包含于本申请的至少一个实施例或示例中。在本说明书中,对上述术语的示意性表述不必须针对的是相同的实施例或示例。而且,描述的具体特征、结构、材料或者特点可以在任一个或多个实施例或示例中以合适的方式结合。此外,在不相互矛盾的情况下,本领域的技术人员可以将本说明书中描述的不同实施例或示例以及不同实施例或示例的特征进行结合和组合。
此外,术语“第一”、“第二”仅用于描述目的,而不能理解为指示或暗示相对重要性或者隐含指明所指示的技术特征的数量。由此,限定有“第一”、“第二”的特征可以明示或者隐含地包括至少一个该特征。在本申请的描述中,“多个”的含义是至少两个,例如两个,三个等,除非另有明确具体的限定。
流程图中或在此以其他方式描述的任何过程或方法描述可以被理解为,表示包括一个或更多个用于实现定制逻辑功能或过程的步骤的可执行指令的代码的模块、片段或部分,并且本申请的优选实施方式的范围包括另外的实现,其中可以不按所示出或讨论的顺序,包括根据所涉及的功能按基本同时的方式或按相反的顺序,来执行功能,这应被本申请的实施例所属技术领域的技术人员所理解。
在流程图中表示或在此以其他方式描述的逻辑和/或步骤,例如,可以被认为是用于实现逻辑功能的可执行指令的定序列表,可以具体实现在任何计算机可读介质中,以供指令执行系统、装置或设备(如基于计算机的系统、包括处理器的系统或其他可以从指令执行系统、装置或设备取指令并执行指令的系统)使用,或结合这些指令执行系统、装置或设备而使用。就本说明书而言,“计算机可读介质”可以是任何可以包含、存储、通信、传播或传输程序以供指令执行系统、装置或设备或结合这些指令执行系统、装置或设备而使用的装置。计算机可读介质的更具体的示例(非穷尽性列表)包括以下:具有一个或多个布线的电连接部(电子装置),便携式计算机盘盒(磁装置),随机存取存储器(RAM),只读存储器(ROM),可擦除可编辑只读存储器(EPROM或闪速存储器),光纤装置,以及便携式光盘只读存储器(CDROM)。另外,计算机可读介质甚至可以是可在其上打印所述程序的纸或其他合适的介质,因为可以例如通过对纸或其他介质进行光学扫描,接着进行编辑、解译或必要时以其他合适方式进行处理来以电子方式获得所述程序,然后将其存储在计算机存储器中。
应当理解,本申请的各部分可以用硬件、软件、固件或它们的组合来实现。在上述实施方式中,多个步骤或方法可以用存储在存储器中且由合适的指令执行系统执行的软件或固件来实现。如,如果用硬件来实现和在另一实施方式中一样,可用本领域公知的下列技术中的任一项或他们的组合来实现:具有用于对数据信号实现逻辑功能的逻辑门电路的离散逻辑电路,具有合适的组合逻辑门电路的专用集成电路,可编程门阵列(PGA),现场可编程门阵列(FPGA)等。
本技术领域的普通技术人员可以理解实现上述实施例方法携带的全部或部分步骤是可以通过程序来指令相关的硬件完成,所述的程序可以存储于一种计算机可读存储介质中,该程序在执行时,包括方法实施例的步骤之一或其组合。
此外,在本申请各个实施例中的各功能单元可以集成在一个处理模块中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个模块中。上述集成的模块既可以采用硬件的形式实现,也可以采用软件功能模块的形式实现。所述集成的模块如果以软件功能模块的形式实现并作为独立的产品销售或使用时,也可以存储在一个计算机可读取存储介质中。
上述提到的存储介质可以是只读存储器,磁盘或光盘等。尽管上面已经示出和描述了本申请的实施例,可以理解的是,上述实施例是示例性的,不能理解为对本申请的限制,本领域的普通技术人员在本申请的范围内可以对上述实施例进行变化、修改、替换和变型。

Claims (7)

1.一种静态源码扫描方法,其特征在于,包括:
获取待扫描源码对应的抽象语法树;
对所述抽象语法树中的代码信息进行解析,生成与所述抽象语法树对应的执行链集合,其中,执行链集合中每条执行链分别与源码中的一条执行路径对应,所述执行链中包括各节点的节点内容和状态信息;
对所述执行链集合中的每条执行链进行遍历,以确定所述源码中是否包含缺陷代码;
其中,所述对所述执行链集合中的每条执行链进行遍历,以确定所述源码中是否包含缺陷代码,包括:
对每条执行链进行遍历,以确定每条执行链中各节点间的节点内容和/或状态信息是否匹配;
若任一条执行链中至少一个节点的节点内容和/或状态信息未与其它节点的节点内容和/或状态信息匹配,则确定所述源码含缺陷代码;
所述对所述抽象语法树中的代码信息进行解析,生成与所述抽象语法树对应的执行链集合,包括:
由父节点至末端子节点,依次根据每个节点对应的节点类型,确定执行链的起止位置及拆分方式,生成多条子执行链,其中,每条子执行链中包括至少一个节点;生成多条子执行链之后,根据每一条子执行链中包括的节点的节点类型,对子执行链进行进一步拆解,得到更加细化的子执行链;
根据所述多条子执行链中的节点间的关系,将所述多条子执行链进行合并处理,生成至少一条总执行链;
所述对所述执行链集合中的每条执行链进行遍历,包括:
对所述多条子执行链及所述至少一条总执行链分别进行遍历。
2.如权利要求1所述的方法,其特征在于,所述依次根据每个节点对应的节点类型,生成多条子执行链,包括:
依次判断每个节点对应的节点类型,是否为预设的节点类型;
若任一节点对应的节点类型为预设的节点类型,则对所述任一节点所在的结构块中每个子节点的代码信息进行解析,以生成与所述任一节点所在的结构块对应的子执行链集合;
否则,对所述任一节点所在的结构块的代码信息进行解析,以生成与所述任一节点所在的结构块对应的执行语句。
3.如权利要求1所述的方法,其特征在于,所述每条执行链中包括对应的源代码行信息;
所述若任一条执行链中至少一个节点的节点内容和/或状态信息未与其它节点的节点内容和/或状态信息匹配之后,还包括:
根据所述任一条执行链对应的源代码行信息,确定所述源码中的缺陷代码。
4.一种静态源码扫描装置,其特征在于,包括:
获取模块,用于获取待扫描源码对应的抽象语法树;
生成模块,用于对所述抽象语法树中的代码信息进行解析,生成与所述抽象语法树对应的执行链集合,其中,执行链集合中每条执行链分别与源码中的一条执行路径对应,所述执行链中包括各节点的节点内容和状态信息;
遍历模块,用于对所述执行链集合中的每条执行链进行遍历,以确定所述源码中是否包含缺陷代码;
其中,所述遍历模块包括:
遍历单元,用于对每条执行链进行遍历,以确定每条执行链中各节点间的状态信息是否异常;
确定单元,用于若任一条执行链中至少一个节点的节点内容和/或状态信息未与其它节点的节点内容和/或状态信息匹配,则确定所述源码含缺陷代码;
所述生成模块,包括:
生成单元,用于由父节点至末端子节点,依次根据每个节点对应的节点类型,确定执行链的起止位置及拆分方式,生成多条子执行链,其中,每条子执行链中包括至少一个节点;生成多条子执行链之后,根据每一条子执行链中包括的节点的节点类型,对子执行链进行进一步拆解,得到更加细化的子执行链;
合并单元,用于根据所述多条子执行链中的节点间的关系,将所述多条子执行链进行合并处理,生成至少一条总执行链;
所述遍历模块,具体用于:
对所述多条子执行链及所述至少一条总执行链分别进行遍历。
5.如权利要求4所述的装置,其特征在于,所述生成单元,具体用于:
依次判断每个节点对应的节点类型,是否为预设的节点类型;
若任一节点对应的节点类型为预设的节点类型,则对所述任一节点所在的结构块中每个子节点的代码信息进行解析,以生成与所述任一节点所在的结构块对应的子执行链;
否则,对所述任一节点所在的结构块的代码信息进行解析,以生成与所述任一节点所在的结构块对应的执行语句。
6.一种计算机设备,其特征在于,包括处理器和存储器;
其中,所述处理器通过读取所述存储器中存储的可执行程序代码来运行与所述可执行程序代码对应的程序,以用于实现如权利要求1-3中任一项所述的静态源码扫描方法。
7.一种非临时性计算机可读存储介质,其上存储有计算机程序,其特征在于,该程序被处理器执行时实现如权利要求1-3中任一项所述的静态源码扫描方法。
CN201810915002.1A 2018-08-13 2018-08-13 静态源码扫描方法、装置、计算机设备及存储介质 Active CN109117633B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201810915002.1A CN109117633B (zh) 2018-08-13 2018-08-13 静态源码扫描方法、装置、计算机设备及存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201810915002.1A CN109117633B (zh) 2018-08-13 2018-08-13 静态源码扫描方法、装置、计算机设备及存储介质

Publications (2)

Publication Number Publication Date
CN109117633A CN109117633A (zh) 2019-01-01
CN109117633B true CN109117633B (zh) 2022-11-04

Family

ID=64853182

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201810915002.1A Active CN109117633B (zh) 2018-08-13 2018-08-13 静态源码扫描方法、装置、计算机设备及存储介质

Country Status (1)

Country Link
CN (1) CN109117633B (zh)

Families Citing this family (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN110231937B (zh) * 2019-05-20 2024-10-15 平安科技(深圳)有限公司 脚本缺陷扫描方法、装置、计算机设备和存储介质
CN112069052B (zh) * 2019-06-11 2024-04-12 腾讯科技(深圳)有限公司 一种异常对象检测方法、装置、设备及存储介质
CN112527623A (zh) * 2019-09-19 2021-03-19 北京奇虎科技有限公司 代码扫描方法、装置、计算设备及计算机存储介质
CN111240772B (zh) * 2020-01-22 2024-06-18 腾讯科技(深圳)有限公司 一种基于区块链的数据处理方法、装置及存储介质
CN111475809B (zh) * 2020-04-09 2023-10-20 杭州奇盾信息技术有限公司 脚本混淆检测方法、装置、计算机设备和存储介质
CN111813675A (zh) * 2020-07-08 2020-10-23 北京嘀嘀无限科技发展有限公司 Ssa结构解析方法、装置、电子设备和存储介质
CN113268243B (zh) * 2021-05-11 2024-02-23 网易(杭州)网络有限公司 内存预测方法及装置、存储介质、电子设备
CN113778710B (zh) * 2021-09-01 2024-04-02 杭州视洞科技有限公司 一种网关树形执行链
CN114637686A (zh) * 2022-03-30 2022-06-17 阿里巴巴(中国)有限公司 静态代码扫描方法以及装置

Family Cites Families (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101661543B (zh) * 2008-08-28 2015-06-17 西门子(中国)有限公司 软件源代码安全漏洞的检测方法及检测装置
CN102231134A (zh) * 2011-07-29 2011-11-02 哈尔滨工业大学 基于静态分析的冗余代码缺陷检测方法
WO2016085272A1 (ko) * 2014-11-28 2016-06-02 주식회사 파수닷컴 소스 코드의 오류 검출에 있어서 오경보 저감 방법, 이를 위한 컴퓨터 프로그램, 그 기록매체
CN104850493A (zh) * 2015-04-24 2015-08-19 百度在线网络技术(北京)有限公司 一种检测源代码漏洞的方法和装置
CN106547520B (zh) * 2015-09-16 2021-05-28 腾讯科技(深圳)有限公司 一种代码路径分析方法及装置
CN106445804B (zh) * 2016-08-24 2019-04-05 北京奇虎测腾安全技术有限公司 一种基于序列化中间表示的源代码云检测系统及方法
CN106371997B (zh) * 2016-09-07 2020-01-10 网易(杭州)网络有限公司 一种代码检查方法及装置

Also Published As

Publication number Publication date
CN109117633A (zh) 2019-01-01

Similar Documents

Publication Publication Date Title
CN109117633B (zh) 静态源码扫描方法、装置、计算机设备及存储介质
US8972955B2 (en) Reducing network trips for remote expression evaluation
US6434742B1 (en) Symbol for automatically renaming symbols in files during the compiling of the files
Moha et al. Automatic generation of detection algorithms for design defects
US8495591B2 (en) Parsing of declarations in all branches of preprocessor conditionals
US9158514B2 (en) Method and apparatus for providing change-related information
US9152731B2 (en) Detecting a broken point in a web application automatic test case
CN112100072B (zh) 应用程序代码的静态检测方法、装置、设备及介质
US9122540B2 (en) Transformation of computer programs and eliminating errors
US7530056B1 (en) Method and system for detecting runtime defects in a program by comparing correct and incorrect runs
US10176077B2 (en) Generating breakpoints for cross-layer debugging
US9134977B2 (en) Compiler operation for handling conditional statements
CA2684348A1 (en) Algorithm complexity identification
JP2014219969A (ja) ソフトウェアプログラムを解析する方法及びシステム並びに非一時的なコンピュータ可読媒体
EP2972880B1 (en) Kernel functionality checker
US10599554B2 (en) Dynamic instrumentation based on detected errors
US11656869B2 (en) Using big code to construct code conditional truth tables
RU2656580C9 (ru) Определение порядка инициализации статических объектов
CN112395198B (zh) 一种基于区分子图挖掘的软件缺陷发现方法
US20140089738A1 (en) System and method for identifying source of run-time execution failure
US8756580B2 (en) Instance-based field affinity optimization
US9710360B2 (en) Optimizing error parsing in an integrated development environment
CN112100059B (zh) 一种c语言的指针类型分析方法
CN115080113A (zh) 项目代码检测方法和装置、可读存储介质、电子设备
CN114691197A (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