CN109446066A - C/c++程序中不可达代码的静态检测方法及系统 - Google Patents

C/c++程序中不可达代码的静态检测方法及系统 Download PDF

Info

Publication number
CN109446066A
CN109446066A CN201811101415.2A CN201811101415A CN109446066A CN 109446066 A CN109446066 A CN 109446066A CN 201811101415 A CN201811101415 A CN 201811101415A CN 109446066 A CN109446066 A CN 109446066A
Authority
CN
China
Prior art keywords
dependency graph
program
analysis
graph
value
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.)
Granted
Application number
CN201811101415.2A
Other languages
English (en)
Other versions
CN109446066B (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 Beida Software Engineering Ltd By Share Ltd
Peking University
Original Assignee
Beijing Beida Software Engineering Ltd By Share Ltd
Peking University
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 Beida Software Engineering Ltd By Share Ltd, Peking University filed Critical Beijing Beida Software Engineering Ltd By Share Ltd
Priority to CN201811101415.2A priority Critical patent/CN109446066B/zh
Publication of CN109446066A publication Critical patent/CN109446066A/zh
Application granted granted Critical
Publication of CN109446066B publication Critical patent/CN109446066B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3604Software analysis for verifying properties of programs
    • G06F11/3608Software 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

本发明实施例提供一种C/C++程序中不可达代码的静态检测方法及系统,其中,所述方法包括:构建待检测C/C++程序的控制依赖图和值依赖图;在所述值依赖图上进行常量分析,并根据常量分析的结果更新所述控制依赖图;对更新后的所述控制依赖图中所有守卫结点的约束表达式的可满足性进行求解;若存在不可满足的约束表达式,则从所述控制依赖图中获取与所述不可满足的约束表达式相对应的守卫结点的所有直接和间接后继结点所对应的程序代码。本发明可以检测千万行级的代码,检测速度可达到每小时百万行以上,并且检测精度超过利用符号执行技术的检测精度,具有较低的误报率和漏报率。

Description

C/C++程序中不可达代码的静态检测方法及系统
技术领域
本发明涉及程序分析技术领域,更具体地,涉及一种C/C++程序中不可达代码的静态检测方法及系统。
背景技术
不可达代码可以分为不可到达代码(Unreachable code)和不可行代码(Infeasible code)两类,其中,不可到达代码是指在语法上不允许被访问的代码;不可行代码是指在语法上允许被访问但是语义上可以保证无论给出什么输入,实际都不会到达的代码。也有人认为不可到达代码是一种特殊类型的不可行代码。现有技术已经可以检测第一类不可达代码——不可到达代码,并且能够保证检测是快速和精确的。
近年来有很多关于第二类不可达代码——不可行代码的自动检测技术的研究,由莱斯定理(Rice’s Theorem)可知,不可行代码的检测本质上是不可判定问题,即不存在一种检测方法可以自动检测出程序中的不可行代码,且不存在误报和漏报。因此这些研究都从不同角度做了权衡,可将现有的可达性分析技术按照分析方法分为以下四类:
模式匹配:首先提出几种常见的造成不可达代码的缺陷模式,然后通过在控制流图上匹配特定的模式检测不可达代码。约80%的不可达代码都是由固定的四到六种缺陷模式导致的,所以通过匹配这些缺陷模式,就可以检测出大部分不可达代码。
定理证明:将“找出所有不可达代码”问题转化成“找出所有可以被可行路径覆盖的语句”问题,然后再证明所有可行路径可以通过特定的最小子集重复的应用定理证明得到。
抽象解释:通过在控制流图上使用一系列的路径不敏感的前向和后向的抽象解释器运行结果,来发现控制流图中的路径是否可以在实际运行中被执行到。
符号执行:程序使用符号值而非具体输入作为程序输入,到达每个条件时得到相应的路径约束,然后通过约束求解器判断是否有具体值可以通过该条件,若没有则该条件下的代码则为不可达代码。
通过比较上述四种方法可以发现,定理证明方法最精确,能检测出程序中所有的不可达代码且没有误报,然而可检测规模太小,速度很慢,难以实际应用。模式匹配方法检测速度最快,但是有限的模式必然无法覆盖所有情况,存在大量的漏报。抽象解释方法漏报率略低于模式匹配,但是速度很慢。符号执行的优点在于可以检测规模很大的代码,速度也最快,因此实际应用最广。但是利用符号执行技术检测不可达代码,漏报率偏高且存在误报。
发明内容
为了解决在保证检测效率的基础上现有符号执行技术漏报率偏高和存在较多误报的问题,本发明实施例提供一种C/C++程序中不可达代码的静态检测方法及系统。
根据本发明实施例的第一个方面,提供一种C/C++程序中不可达代码的静态检测方法,包括:
构建待检测C/C++程序的控制依赖图和值依赖图;
在所述值依赖图上进行常量分析,并根据常量分析的结果更新所述控制依赖图;
对更新后的所述控制依赖图中所有守卫结点的约束表达式的可满足性进行求解;
若存在不可满足的约束表达式,则从所述控制依赖图中获取与所述不可满足的约束表达式相对应的守卫结点的所有直接和间接后继结点所对应的程序代码。
根据本发明实施例的第二个方面,提供一种C/C++程序中不可达代码的静态检测系统,包括:
依赖模型构建模块,用于构建待检测C/C++程序的控制依赖图和值依赖图;
常量分析模块,用于在所述值依赖图上进行常量分析,并根据常量分析的结果更新所述控制依赖图;
约束求解模块,用于对更新后的所述控制依赖图中所有守卫结点的约束表达式的可满足性进行求解;
不可达代码获取模块,用于若存在不可满足的约束表达式,则从所述控制依赖图中获取与所述不可满足的约束表达式相对应的守卫结点的所有直接和间接后继结点所对应的程序代码。
根据本发明实施例的第三个方面,提供一种电子设备,包括:
至少一个处理器;以及
与所述处理器通信连接的至少一个存储器,其中:
所述存储器存储有可被所述处理器执行的程序指令,所述处理器调用所述程序指令能够执行第一方面的各种可能的实现方式中任一种实现方式所提供的C/C++程序中不可达代码的静态检测方法。
根据本发明实施例的第四个方面,提供一种非暂态计算机可读存储介质,所述非暂态计算机可读存储介质存储计算机指令,所述计算机指令使所述计算机执行第一方面的各种可能的实现方式中任一种实现方式所提供的C/C++程序中不可达代码的静态检测方法。
本发明实施例提出的C/C++程序中不可达代码的静态检测方法及系统,可以检测千万行级的代码,检测速度可达到每小时百万行以上,并且检测精度超过利用符号执行技术的检测精度,具有较低的误报率和漏报率。
附图说明
图1为本发明实施例提供的C/C++程序中不可达代码的静态检测方法的流程示意图;
图2为本发明实施例提供的基于控制流图构建待检测C/C++程序的控制依赖图的流程示意图;
图3为本发明实施例提供的第二类不可达代码的示例图;
图4为本发明实施例提供的图3中所示代码的控制依赖图;
图5为本发明实施例提供的基于控制流图构建待检测C/C++程序的值依赖图的流程示意图;
图6为本发明实施例提供的图3中所示代码的值依赖图;
图7为本发明实施例提供的C/C++程序中不可达代码的静态检测系统的结构示意图;
图8为本发明实施例提供的电子设备的结构示意图。
具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整的描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他的实施例,都属于本发明保护的范围。
如图1所示,为本发明一实施例提供的一种C/C++程序中不可达代码的静态检测方法的流程示意图,包括:
S101,构建待检测C/C++程序的控制依赖图和值依赖图。
具体地,要对C/C++程序进行不可达代码检测,首先要构建该待检测C/C++程序的控制依赖图和值依赖图。其中,控制依赖图(Control Dependence Graph,CDG)的定义如下:在待检测C/C++程序的控制流图中,如果可以从结点x转移到u或v,从u有一条路径可以不经过y而到达exit结点,并且从v到exit的每条路径都经过y,那么可得出结论y控制依赖(control-dependent)于x,在控制依赖图中,如果y控制依赖于x,则有一条x到y的边。即控制依赖图是在程序控制流图的基础上构建的能够反映控制流图中的结点之间的控制依赖关系的图。值依赖图(Value Dependence Graph,VDG)的定义如下:值依赖图是一种有向图,其可表示为VDG=(N,NS,E),其中,N为结点集,每个结点对应程序中的一条语句,NS为选择语句结点集,NS包含于N,包括分支选择语句和循环选择语句,边集E={<n1,ns1,...,nsi,n2>|n1,n2∈N,ns1,nsi∈Ns},n1为n2的值依赖源点,ns1,...,nsi为可选节点,即n1可以直接到达n2。由此可知,值依赖图的边反映了各结点之间值依赖关系。构建待检测C/C++程序的控制依赖图和值依赖图,可以将程序中的控制依赖关系和数据依赖关系表达出来,便于进行代码可达性分析。
S102,在所述值依赖图上进行常量分析,并根据常量分析的结果更新所述控制依赖图。
具体地,在待检测C/C++程序的值依赖图上进行常量分析,可以获得待检测C/C++程序大部分变量的取值或范围。根据常量分析的结果去更新控制依赖图是指利用这些确定的取值或范围去替换控制依赖图中各守卫结点的约束表达式,使得控制依赖图中许多分支有了确定的结果,以减少后续不可达代码分析的。
常量分析包括常量传播、常量折叠、值集分析和区间分析等技术手段。
S103,对更新后的所述控制依赖图中所有守卫结点的约束表达式的可满足性进行求解。
可利用现有的约束求解器来对控制依赖图中所有守卫结点的约束表达式的可满足性进行求解,若存在约束表达式不可满足,则表明对应代码在程序中不可达。
S104,若存在不可满足的约束表达式,则从控制依赖图中获取与所述不可满足的约束表达式相对应的守卫结点的所有直接和间接后继结点所对应的程序代码。
在控制依赖图中,若存在不可满足的约束表达式,则获取所述控制依赖图中与所述不可满足的约束表达式相对应的守卫结点的所有直接和间接后继结点,然后再利用在控制依赖图中记录的代码信息,得到这些后继结点对应的原计算机程序代码,即为原程序中的不可达代码。
本发明实施例提供的一种C/C++程序中不可达代码的静态检测方法,首先通过构建待检测程序的值依赖图和控制依赖图将程序中的控制依赖关系和数据依赖关系表达出来,便于进行代码可达性分析,然后在值依赖图上进行常量分析,得到了大部分变量的值或范围,使得控制依赖图中很多分支在后续分析过程中得到了确定的结果,能有效地提升检测精度;然后对约束表达式的可满足性进行求解,获取不可达代码。本发明实施例可以检测千万行级的代码,检测速度可达到每小时百万行以上,并且具有较低的误报率和漏报率。
基于上述实施例的内容,构建待检测C/C++程序的控制依赖图和值依赖图的具体步骤包括:
制作待检测C/C++程序的控制流图;
基于待检测C/C++程序的控制流图构建待检测C/C++程序的控制依赖图,基于所述控制流图构建待检测C/C++程序的值依赖图。
首先通过现有技术制作出待检测C/C++程序的控制流图,再在控制流图的基础上去构建控制依赖图和值依赖图。
其中,如图2所示,为本发明实施例提供的基于控制流图构建待检测C/C++程序的控制依赖图的流程示意图,即基于控制流图构建待检测C/C++程序的控制依赖图的步骤具体包括:
S201,根据所述控制流图生成所述待检测C/C++程序的逆控制流图,构建所述逆控制流图的必经结点树,通过计算所述逆控制流图的必经结点边界构建所述待检测C/C++程序的控制依赖图的有向边;
具体地,生成当前待检测程序控制流图G的逆控制流图G’:只要G中有边x→y,G’中就有边y→x,并且G’中的起始结点对应于G的终止结点;构建G’的必经结点树,树的根结点对应G’的起始结点;计算G’中的结点的必经结点边界DFG’;只要x∈DFG’[y],控制依赖图就有边x→y;经过以上步骤,就可以获得初步的控制依赖图。
S202,在所述控制依赖图的每个条件判断结点的分支后插入守卫结点,并计算所有守卫结点的约束表达式。
这一步骤的目的是构建守卫,在初步的控制依赖图中,对每个条件判断结点,在其True分支和False分支后插入守卫结点;
以起始结点为守卫结点的起点,其约束表达式为true,自顶向下遍历初步的控制依赖图中所有守卫结点,计算各守卫结点的约束表达式。约束表达式即到达条件。
如图3所示,为第二类不可达代码的示例,当x>2时函数必然在第4行返回,第6行a+b值为3,所以第5行条件x==3永远不可满足,导致第6行是不可行代码。如图4所示,为依据上述步骤构建的图3中所示代码的控制依赖图。其中,椭圆代表计算机程序中的代码或到达条件,有向边代表代码和到达条件之间的控制依赖关系,R0,R1,R2,R3,R4表示守卫结点,以守卫结点R2为例,椭圆中R2:后面的表达式X>2即为约束表达式。图4中T代表True,F代表False。
如图5所示,为本发明实施例提供的基于控制流图构建待检测C/C++程序的值依赖图的流程示意图,即基于控制流图构建待检测C/C++程序的值依赖图的步骤具体包括:
S501,分析所述控制流图中的变量定义、内存分配、形式参数、实际参数和返回语句,构建所述待检测C/C++程序的值依赖图的结点;
即分析待检测程序中各变量的定义和使用关系,以此值依赖图的节点。
S502,在所述控制流图上进行到达定值分析和指向分析,根据分析结果构建所述值依赖图的边;
具体地,在程序的控制流图上进行到达定值分析,根据分析结果,构建值依赖图的边;
在程序的控制流图上对指针类型的变量作指向分析,得到指针变量的别名,在值依赖图中添加别名导致的边。
S503,通过计算所述值依赖图的各不同结点之间的到达条件来构建守卫,并将到达条件标注在所述值依赖图的相应边上;
构建守卫即计算值依赖图中结点与结点之间的到达条件,并将计算获得的到达条件相应地标注在对应的边上。
S504,去掉所述值依赖图中到达条件无法满足的边。
这一步是对通过步骤S501至S503获得的值依赖图进行精化分析,去掉到达条件无法满足的边。
如图6所示,为依据上述各步骤构建的图3中所示代码的值依赖图。其中,矩形代表待检测程序中变量的定义,椭圆代表待检测程序中变量的使用,有向边代表变量值的依赖关系。
本发明实施例提供的一种C/C++程序中不可达代码的静态检测方法,在值依赖图的构建过程中预先对值依赖图中的所有边做了精化分析,去掉了条件无法满足的边,降低了后续对值依赖图进行常量分析的计算量,从而能够提高整个不可达代码静态检测的效率。
基于上述各实施例的内容,所述在值依赖图上进行常量分析,并根据常量分析的结果更新所述控制依赖图的步骤进一步包括:
在所述值依赖图上对所述待检测C/C++程序中的变量进行常量传播和折叠分析,所述常量传播和折叠分析的结果为存在常量值的变量和/或表达式以及相对应的常量值;
遍历所述控制依赖图中各守卫结点的约束表达式,将所述约束表达式中包含的所述存在常量值的变量和/或表达式替换为相对应的常量值。
例如,对图6所示的值依赖图,对第2行两个结点经常量传播分析得出变量a的常量值为1,变量b的常量值为2;对第5行结点经常量折叠分析得出表达式a+b常量值为3;将结果带入图4所示的控制依赖图中,守卫结点R1和R3的约束表达式中的x==a+b可以简化为switch x==3。
本发明实施例通过在待检测程序的值依赖图上进行常量传播和常量折叠分析,得到了大部分变量的确定值,使得很多分支在后续分析过程中得到了确定的结果,相对于符号执行技术大幅减少了路径数和状态数,可有效提升检测精度。
本发明另一实施例,在上述实施例的基础上,不仅采用常量传播和常量折叠技术,还在值依赖图上进行值集分析和区间分析。因此,所述在所述值依赖图上进行常量分析,并根据常量分析的结果更新所述控制依赖图的步骤还包括:
在所述值依赖图上进行值集分析和区间分析,获得存在取值集合或区间范围的变量;
遍历所述控制依赖图中各守卫结点的约束表达式,对所述约束表达式中包含的所述存在取值集合或区间范围的变量,根据所述约束表达式中含有的原子表达式的数量、集合大小和区间范围确定分析代价,将分析代价可接受的变量用取值集合或区间范围的形式进行表达后加入至守卫约束中。
对值依赖图进行值集分析和区间分析,有助于降低后续约束求解计算的复杂度。
在一个实施例中,利用SMT约束求解器求解更新后的所述控制依赖图中所有守卫结点的约束表达式的可满足性。SMT约束求解器是目前自动求解能力最强的求解器,还有自动求解器SAT,能力比SMT弱。还可以用定理证明工具coq,能力更强,但是速度慢,证明过程需要手动参与。
SMT求解过程中,根据步骤S102的分析结果决定是否进行更深层次的分析,即通过约束表达式含有的原子表达式数量和变量的取值范围预估求解难度。对较低深度即可求解的问题,减少了分析状态数。对较高深度才能求解的问题,通过预估难度,可以得到那些求解代价小的问题的结果。
利用SMT约束求解器求解控制依赖图中所有守卫结点的约束表达式的可满足性,若约束表达式不可满足,则表明对应代码在程序中不可达。例如图4中守卫结点R1的约束表达式(!(x>2)&&(x==3))是不可满足的,所以图4中该守卫结点R1所有后继对应的程序代码是不可达代码。
本发明实施例提供的一种C/C++程序中不可达代码的静态检测方法,通过构建待检测程序的值依赖图和控制依赖图,在值依赖图的构建过程中预先对值依赖图中的所有边做了精化分析,去掉了条件无法满足的边;然后,基于值依赖图的常量分析,得到了大部分变量的值或范围,使得很多分支在后续分析过程中得到了确定的结果。本发明实施例结合上述两种分析,相对于符号执行技术大幅减少了路径数和状态数,有效地提升了检测精度;然后利用SMT求解器对约束表达式的可满足性进行求解,最终获取不可达代码,检测速度较快。
如图7所示,为本发明实施例提供的C/C++程序中不可达代码的静态检测系统的结构示意图,该系统用于在前述各实施例中实现C/C++程序中不可达代码的静态检测方法。因此,在前述各C/C++程序中不可达代码的静态检测方法实施例中的描述和定义,可以用于本发明实施例中各个执行模块的理解。由图7可知,该系统包括:依赖模型构建模块701、常量分析模块702、约束求解模块703和不可达代码获取模块704,其中,
依赖模型构建模块701,用于构建待检测C/C++程序的控制依赖图和值依赖图;
常量分析模块702,用于在所述值依赖图上进行常量分析,并根据常量分析的结果更新所述控制依赖图;
约束求解模块703,用于对更新后的所述控制依赖图中所有守卫结点的约束表达式的可满足性进行求解;
不可达代码获取模块704,用于若存在不可满足的约束表达式,则从所述控制依赖图中获取与所述不可满足的约束表达式相对应的守卫结点的所有直接和间接后继结点所对应的程序代码。
其中,所述依赖模型构建模块701进一步包括:
控制流图创建子模块,用于制作待检测C/C++程序的控制流图;
控制依赖图创建子模块,用于基于所述控制流图构建所述待检测C/C++程序的控制依赖图;
值依赖图创建子模块,用于基于所述控制流图构建所述待检测C/C++程序的值依赖图。
其中,所述控制依赖图创建子模块具体用于:
根据所述控制流图生成所述待检测C/C++程序的逆控制流图,构建所述逆控制流图的必经结点树,通过计算所述逆控制流图的必经结点边界构建所述待检测C/C++程序的控制依赖图的有向边;
在所述控制依赖图的每个条件判断结点的分支后插入守卫结点,并计算所有守卫结点的约束表达式。
其中,所述值依赖图创建子模块具体用于:
分析所述控制流图中的变量定义、内存分配、形式参数、实际参数和返回语句,构建所述待检测C/C++程序的值依赖图的结点;
在所述控制流图上进行到达定值分析和指向分析,根据分析结果构建所述值依赖图的边;
通过计算所述值依赖图的各不同结点之间的到达条件来构建守卫,并将到达条件标注在所述值依赖图的相应边上;
去掉所述值依赖图中到达条件无法满足的边。
所述常量分析模块702具体用于:
在所述值依赖图上对所述待检测C/C++程序中的变量进行常量传播和折叠分析,所述常量传播和折叠分析的结果为存在常量值的变量和/或表达式以及相对应的常量值;
遍历所述控制依赖图中各守卫结点的约束表达式,将所述约束表达式中包含的所述存在常量值的变量和/或表达式替换为相对应的常量值。
所述常量分析模块702还用于:
在所述值依赖图上进行值集分析和区间分析,获得存在取值集合或区间范围的变量;
遍历所述控制依赖图中各守卫结点的约束表达式,对所述约束表达式中包含的所述存在取值集合或区间范围的变量,根据所述约束表达式中含有的原子表达式的数量、集合大小和区间范围确定分析代价,将分析代价可接受的变量用取值集合或区间范围的形式进行表达后加入至守卫约束中。
所述约束求解模块703具体用于:
利用SMT约束求解器求解更新后的所述控制依赖图中所有守卫结点的约束表达式的可满足性。
本发明实施例提供的C/C++程序中不可达代码的静态检测系统,可以检测千万行级的代码,检测速度可达到每小时百万行以上,并且检测精度超过利用符号执行技术的检测精度,具有较低的误报率和漏报率。
为检测本发明实施例所提供的方法对不可达代码检测的精度,选取了10个SPEC2000或SPEC 2006中的项目分别采用本发明和国际著名工具Klocwork进行测试,其结果如表1所示。运行结果说明,本发明在针对不可达代码的检测中,正确报出了727个结果,多于Klocwork的715个;而误报个数仅有19个,低于Klocwork的28个。本发明的误报率和漏报率都显著低于Klocwork。
表1不可达代码检测精度对比数据
为检测本发明的检测效率,选取了6个著名的50万行-150万行C/C++工程进行测试,结果如表2所示。运行结果说明,本发明的检测速度达到每小时百万行以上。
表2本发明在不同项目上的检测效率数据
如图8所示,为本发明实施例提供的电子设备的结构示意图,包括:处理器(processor)801、存储器(memory)802和总线803;
其中,处理器801及存储器802分别通过总线803完成相互间的通信;处理器801用于调用存储器802中的程序指令,以执行上述实施例所提供的C/C++程序中不可达代码的静态检测方法,例如包括:构建待检测C/C++程序的控制依赖图和值依赖图;在所述值依赖图上进行常量分析,并根据常量分析的结果更新所述控制依赖图;对更新后的所述控制依赖图中所有守卫结点的约束表达式的可满足性进行求解;若存在不可满足的约束表达式,则从所述控制依赖图中获取与所述不可满足的约束表达式相对应的守卫结点的所有直接和间接后继结点所对应的程序代码。
本发明又一实施例,提供一种非暂态计算机可读存储介质,所述非暂态计算机可读存储介质存储计算机指令,所述计算机指令使所述计算机执行如上述各实施例所提供的C/C++程序中不可达代码的静态检测方法,例如包括:构建待检测C/C++程序的控制依赖图和值依赖图;在所述值依赖图上进行常量分析,并根据常量分析的结果更新所述控制依赖图;对更新后的所述控制依赖图中所有守卫结点的约束表达式的可满足性进行求解;若存在不可满足的约束表达式,则从所述控制依赖图中获取与所述不可满足的约束表达式相对应的守卫结点的所有直接和间接后继结点所对应的程序代码。
本领域普通技术人员可以理解:实现上述方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成,前述的程序可以存储于一计算机可读取存储介质中,该程序在执行时,执行包括上述方法实施例的步骤;而前述的存储介质包括:ROM、RAM、磁碟或者光盘等各种可以存储程序代码的介质。
以上所描述的C/C++程序中不可达代码的静态检测设备等实施例仅仅是示意性的,其中作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性的劳动的情况下,即可以理解并实施。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到各实施方式可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件。基于这样的理解,上述技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行各个实施例或者实施例的某些部分方法。
最后,本发明的方法仅为较佳的实施方案,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

Claims (10)

1.一种C/C++程序中不可达代码的静态检测方法,其特征在于,包括:
构建待检测C/C++程序的控制依赖图和值依赖图;
在所述值依赖图上进行常量分析,并根据常量分析的结果更新所述控制依赖图;
对更新后的所述控制依赖图中所有守卫结点的约束表达式的可满足性进行求解;
若存在不可满足的约束表达式,则从所述控制依赖图中获取与所述不可满足的约束表达式相对应的守卫结点的所有直接和间接后继结点所对应的程序代码。
2.根据权利要求1所述的方法,其特征在于,所述构建待检测C/C++程序的控制依赖图和值依赖图的步骤进一步包括:
制作待检测C/C++程序的控制流图;
基于所述控制流图构建所述待检测C/C++程序的控制依赖图,基于所述控制流图构建所述待检测C/C++程序的值依赖图。
3.根据权利要求2所述的方法,其特征在于,所述基于所述控制流图构建所述待检测C/C++程序的控制依赖图的步骤进一步包括:
根据所述控制流图生成所述待检测C/C++程序的逆控制流图,构建所述逆控制流图的必经结点树,通过计算所述逆控制流图的必经结点边界构建所述待检测C/C++程序的控制依赖图的有向边;
在所述控制依赖图的每个条件判断结点的分支后插入守卫结点,并计算所有守卫结点的约束表达式。
4.根据权利要求2所述的方法,其特征在于,所述基于所述控制流图构建所述待检测C/C++程序的值依赖图的步骤进一步包括:
分析所述控制流图中的变量定义、内存分配、形式参数、实际参数和返回语句,构建所述待检测C/C++程序的值依赖图的结点;
在所述控制流图上进行到达定值分析和指向分析,根据分析结果构建所述值依赖图的边;
通过计算所述值依赖图的各不同结点之间的到达条件来构建守卫,并将到达条件标注在所述值依赖图的相应边上;
去掉所述值依赖图中到达条件无法满足的边。
5.根据权利要求1所述的方法,其特征在于,所述在所述值依赖图上进行常量分析,并根据常量分析的结果更新所述控制依赖图的步骤进一步包括:
在所述值依赖图上对所述待检测C/C++程序中的变量进行常量传播和折叠分析,所述常量传播和折叠分析的结果为存在常量值的变量和/或表达式以及相对应的常量值;
遍历所述控制依赖图中各守卫结点的约束表达式,将所述约束表达式中包含的所述存在常量值的变量和/或表达式替换为相对应的常量值。
6.根据权利要求5所述的方法,其特征在于,所述在所述值依赖图上进行常量分析,并根据常量分析的结果更新所述控制依赖图的步骤还包括:
在所述值依赖图上进行值集分析和区间分析,获得存在取值集合或区间范围的变量;
遍历所述控制依赖图中各守卫结点的约束表达式,对所述约束表达式中包含的所述存在取值集合或区间范围的变量,根据所述约束表达式中含有的原子表达式的数量、集合大小和区间范围确定分析代价,将分析代价可接受的变量用取值集合或区间范围的形式进行表达后加入至守卫约束中。
7.根据权利要求1所述的方法,其特征在于,所述对更新后的所述控制依赖图中所有守卫结点的约束表达式的可满足性进行求解的步骤进一步包括:
利用SMT约束求解器求解更新后的所述控制依赖图中所有守卫结点的约束表达式的可满足性。
8.一种C/C++程序中不可达代码的静态检测系统,其特征在于,包括:
依赖模型构建模块,用于构建待检测C/C++程序的控制依赖图和值依赖图;
常量分析模块,用于在所述值依赖图上进行常量分析,并根据常量分析的结果更新所述控制依赖图;
约束求解模块,用于对更新后的所述控制依赖图中所有守卫结点的约束表达式的可满足性进行求解;
不可达代码获取模块,用于若存在不可满足的约束表达式,则从所述控制依赖图中获取与所述不可满足的约束表达式相对应的守卫结点的所有直接和间接后继结点所对应的程序代码。
9.一种电子设备,其特征在于,包括:
至少一个处理器;以及
与所述处理器通信连接的至少一个存储器,其中:
所述存储器存储有可被所述处理器执行的程序指令,所述处理器调用所述程序指令能够执行如权利要求1至7任一所述的方法。
10.一种非暂态计算机可读存储介质,其特征在于,所述非暂态计算机可读存储介质存储计算机指令,所述计算机指令使所述计算机执行如权利要求1至7任一所述的方法。
CN201811101415.2A 2018-09-20 2018-09-20 C/c++程序中不可达代码的静态检测方法及系统 Active CN109446066B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201811101415.2A CN109446066B (zh) 2018-09-20 2018-09-20 C/c++程序中不可达代码的静态检测方法及系统

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201811101415.2A CN109446066B (zh) 2018-09-20 2018-09-20 C/c++程序中不可达代码的静态检测方法及系统

Publications (2)

Publication Number Publication Date
CN109446066A true CN109446066A (zh) 2019-03-08
CN109446066B CN109446066B (zh) 2020-11-03

Family

ID=65532632

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201811101415.2A Active CN109446066B (zh) 2018-09-20 2018-09-20 C/c++程序中不可达代码的静态检测方法及系统

Country Status (1)

Country Link
CN (1) CN109446066B (zh)

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN110321458A (zh) * 2019-05-21 2019-10-11 国家电网有限公司 一种基于控制流图的数据流分析方法及装置
CN112286831A (zh) * 2020-12-30 2021-01-29 中国电力科学研究院有限公司 多重循环的数据流分析方法、系统、设备及存储介质
CN114510722A (zh) * 2022-02-17 2022-05-17 北京大学 增量代码的静态检测方法及检测系统
CN114780109A (zh) * 2022-05-20 2022-07-22 厦门大学 Python项目第三方库依赖自动化解析与安装方法

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102110051A (zh) * 2010-12-31 2011-06-29 北京邮电大学 应用程序切片技术的静态缺陷检测方法
CN105786715A (zh) * 2016-04-08 2016-07-20 南京大学 一种程序静态自动分析方法
US20180088916A1 (en) * 2016-09-28 2018-03-29 Intel Corporation Modifying applications for incremental checkpoints

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102110051A (zh) * 2010-12-31 2011-06-29 北京邮电大学 应用程序切片技术的静态缺陷检测方法
CN105786715A (zh) * 2016-04-08 2016-07-20 南京大学 一种程序静态自动分析方法
US20180088916A1 (en) * 2016-09-28 2018-03-29 Intel Corporation Modifying applications for incremental checkpoints

Non-Patent Citations (3)

* Cited by examiner, † Cited by third party
Title
吴方君: "《Z形式规约切片的研究》", 31 December 2006, 中国科学技术大学出版社 *
李慧贤: "过程内控制依赖的计算", 《计算机工程与应用》 *
潘丽丽: "基于关键分支的不可行路径确定方法", 《北京工业大学学报》 *

Cited By (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN110321458A (zh) * 2019-05-21 2019-10-11 国家电网有限公司 一种基于控制流图的数据流分析方法及装置
CN110321458B (zh) * 2019-05-21 2021-10-15 国家电网有限公司 一种基于控制流图的数据流分析方法及装置
CN112286831A (zh) * 2020-12-30 2021-01-29 中国电力科学研究院有限公司 多重循环的数据流分析方法、系统、设备及存储介质
CN114510722A (zh) * 2022-02-17 2022-05-17 北京大学 增量代码的静态检测方法及检测系统
CN114510722B (zh) * 2022-02-17 2023-01-06 北京大学 增量代码的静态检测方法及检测系统
CN114780109A (zh) * 2022-05-20 2022-07-22 厦门大学 Python项目第三方库依赖自动化解析与安装方法
CN114780109B (zh) * 2022-05-20 2024-06-04 厦门大学 Python项目第三方库依赖自动化解析与安装方法

Also Published As

Publication number Publication date
CN109446066B (zh) 2020-11-03

Similar Documents

Publication Publication Date Title
CN109446066A (zh) C/c++程序中不可达代码的静态检测方法及系统
JP5608203B2 (ja) 要求ベーステスト生成
KR102418287B1 (ko) 하전 입자선 장치 및 하전 입자선 검사 시스템
Burov Complex ontology management using task models
Li et al. Code-coverage guided prioritized test generation
Kessentini et al. Automated metamodel/model co-evolution using a multi-objective optimization approach
Satish et al. Extracting the combinatorial test parameters and values from UML sequence diagrams
Jönsson et al. Impact analysis
CN103236978A (zh) As拓扑顶层自治系统结点的确定方法和装置
Lakra et al. Application of metaheuristic techniques in software quality prediction: a systematic mapping study
CN103309805A (zh) xUnit框架下面向对象软件中测试目标的自动化选择方法
US20090187889A1 (en) Method and system for inconsistency resolution with cycle detection in a model-driven software environment
Boucher et al. Transforming workflow models into automated end-to-end acceptance test cases
Liu et al. Using contracts and boolean queries to improve the quality of automatic test generation
da Silva et al. On-the-fly verification of discrete event simulations by means of simulation purposes.
Bansal et al. A model based approach to test case generation for testing the navigation behavior of dynamic web applications
Agarwal et al. Automatic Test Data Generation-Achieving Optimality Using Ant-Behaviour
Malinao et al. A metric for user requirements traceability in sequence, class diagrams, and lines-of-code via robustness diagrams
Khatun et al. An automatic test suite regeneration technique ensuring state model coverage using UML diagrams and source syntax
Laokok et al. An approach for test case generation from a static call graph for object-oriented programming
Rodriguez et al. Automatic generation of GUI test cases using Ant Colony Optimization and Greedy algorithm.
CN109308262A (zh) 一种软件缺陷定位方法以及装置
Mireslami et al. A system-level approach for model-based verification of distributed software systems
Sethi et al. Autonlu: Detecting, root-causing, and fixing nlu model errors
Spichkova et al. A Human-Centred Framework for Supporting Agile Model-Based Testing.

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