当前位置: 首页 > 专利查询>南京大学专利>正文

一种基于路径遍历的代码验证方法、装置、介质及设备制造方法及图纸

技术编号:37986619 阅读:9 留言:0更新日期:2023-06-30 10:01
本发明专利技术公开了一种基于路径遍历的代码验证方法、装置、介质及设备。该方法通过对循环体步进分解的方式,在控制流图中找出所有从程序入口至所述目标语句的路径长度不超过K的路径,组成路径集合;然后遍历路径,对所遍历的路径进行可达验证;在对路径进行可达验证时,通过对表达式简化计算将数组变量简化成数组元素,结合变量的约束替换,将关于数组变量的操作展开成关于数组元素的SMT约束表达式,从而使得SMT约束求解能够处理数组相关的变量,同时也降低了SMT约束求解的复杂度,免去了不可达路径片段的求解分析,从而提高了分析效率。从而提高了分析效率。从而提高了分析效率。

【技术实现步骤摘要】
一种基于路径遍历的代码验证方法、装置、介质及设备


[0001]本专利技术涉及软件安全和软件验证领域。

技术介绍

[0002]专利文献CN 105808429 A公开了一种面向线性约束代码的有界可达性验证方法。该文献所记载的技术方案存在以下缺陷:第一是无法对数组进行处理,只能验证不带有数组的简单程序;第二是SMT约束存在约束变量混淆问题,为解决该混淆问题,使得该技术方案需要求解不可达路径片段;第三是效率低,需要求解不可达路径片段,然后再基于不可达路径片段进行分析,步骤复杂,且求解不可达路径片段耗时过长。

技术实现思路

[0003]本专利技术所要解决的问题:现有技术下代码可达验证的缺陷。
[0004]为解决上述问题,本专利技术采用的方案如下:根据本专利技术的一种基于路径遍历的代码验证方法,包括如下步骤:步骤S1:获取源代码及目标语句;所述目标语句是所述源代码中的代码语句;步骤S2:将所述源代码转换成控制流图;步骤S3:通过对循环体步进分解的方式,在控制流图中找出所有从程序入口至所述目标语句的路径长度不超过K的路径,组成路径集合;步骤S4:逐个遍历路径集合中的路径,对所遍历的路径进行可达验证;若当前路径可达,结束验证;若当前路径不可达则对路径集合中的下一条路径进行可达验证,直到路径集合中所有路径进行了可达验证;所述步骤S4中,所述对路径进行验证包括如下步骤:步骤S41:按顺序遍历当前路径的各个路径节点,根据当前路径节点所对应的源代码,按顺序抽取关于程序变量的表达式,组成第一表达式队列;步骤S42:根据第一表达式队列的顺序,依据当前表达式之前的赋值语句的表达式对表达式进行简化计算得到第二表达式队列;步骤S43:通过分析程序变量的作用域范围剔除掉第二表达式队列中的无关表达式得到第三表达式序列:若目标语句在程序变量的作用域范围之外,则在第二表达式队列中剔除该程序变量所对应的表达式;若程序变量的赋值语句之间不存在被引用的表达式,则删除该程序变量前序的赋值语句;步骤S44:根据程序变量赋值操作的次数序号结合数组变量的元素偏移量构建约束变量,将第三表达式队列中各个表达式的程序变量替换成约束变量后形成对应的SMT约束表达式,组成SMT约束编码;步骤S45:通过SMT约束求解器对SMT约束编码进行SMT约束求解,若SMT约束编码存
在解,则表示当前路径可达,否则表示当前路径不可达。
[0005]根据本专利技术的一种基于路径遍历的代码验证装置,包括如下模块:模块M1,用于:获取源代码及目标语句;所述目标语句是所述源代码中的代码语句;模块M2,用于:将所述源代码转换成控制流图;模块M3,用于:通过对循环体步进分解的方式,在控制流图中找出所有从程序入口至所述目标语句的路径长度不超过K的路径,组成路径集合;模块M4,用于:逐个遍历路径集合中的路径,对所遍历的路径进行可达验证;若当前路径可达,结束验证;若当前路径不可达则对路径集合中的下一条路径进行可达验证,直到路径集合中所有路径进行了可达验证;所述模块M4中,所述对路径进行验证包括如下模块:模块M41,用于:按顺序遍历当前路径的各个路径节点,根据当前路径节点所对应的源代码,按顺序抽取关于程序变量的表达式,组成第一表达式队列;模块M42,用于:根据第一表达式队列的顺序,依据当前表达式之前的赋值语句的表达式对表达式进行简化计算得到第二表达式队列;模块M43,用于:通过分析程序变量的作用域范围剔除掉第二表达式队列中的无关表达式得到第三表达式序列:若目标语句在程序变量的作用域范围之外,则在第二表达式队列中剔除该程序变量所对应的表达式;若程序变量的赋值语句之间不存在被引用的表达式,则删除该程序变量前序的赋值语句;模块M44,用于:根据程序变量赋值操作的次数序号结合数组变量的元素偏移量构建约束变量,将第三表达式队列中各个表达式的程序变量替换成约束变量后形成对应的SMT约束表达式,组成SMT约束编码;模块M45,用于:通过SMT约束求解器对SMT约束编码进行SMT约束求解,若SMT约束编码存在解,则表示当前路径可达,否则表示当前路径不可达。
[0006]根据本专利技术的一种介质;该介质存储有可以被机器所读取的程序指令集;当该介质内所存储的程序指令集被机器读取并执行时可以实现根上述的基于路径遍历的代码验证方法。
[0007]根据本专利技术的一种设备;该设备包括处理器和存储器;所述存储器内存储有程序指令集;当所述存储器内所存储的程序指令集被所述处理器加载并执行时可以实现上述的基于路径遍历的代码验证方法。
[0008]本专利技术的技术效果如下:通过对表达式的简化和无关剔除,降低了SMT约束编码的复杂度,从而降低了SMT约束求解的复杂度;通过对表达式简化计算将数组变量简化成数组元素,结合变量的约束替换,将关于数组变量的操作展开成关于数组元素的SMT约束表达式,从而使得SMT约束求解能够处理数组相关的变量;通过对表达式变量的约束替换,使得SMT约束表达式扁平化,使得SMT约束能够表述更多的有关源代码程序的信息,从而免去了不可达路径片段的求解。
附图说明
[0009]图1是本专利技术实施例的核心步骤流程图。
[0010]图2是本专利技术示例的源程序代码的控制流图。
[0011]图3是本专利技术设备实施例的结构示意图。
实施方式
[0012]下面结合附图对本专利技术做进一步详细说明。
[0013]本实施例涉及一种设备,具体来说是一种电子设备,参照图3,至少包括相连的处理器100和存储器200。其中处理器100通常为通用计算机处理器,能够执行计算机程序指令,存储器200通常是一种可断电后存储不丢失的介质,包括但不限于磁盘、磁带、闪存等。该介质也就是本专利技术前述所指的介质。存储器200通常用来存储计算机程序指令集和数据。处理器100通过加载存储器200所存储的程序指令集实现其相应的自动化功能。具体到本实施例中,处理器100通过加载执行存储器200所存储的程序指令集实现本专利技术所指的基于路径遍历的代码验证方法。本专利技术的基于路径遍历的代码验证方法包括以下步骤:数据接收步骤、控制流图构建步骤、路径构建步骤以及路径可达分析步骤。
[0014]数据接收步骤,也就是前述的步骤S1中的获取源代码及目标语句。该步骤表示本专利技术的输入为源代码和目标语句。源代码和目标语句如何获取以及所采用的具体形式不是本专利技术所讨论的范畴,不再赘述。此外,这里的源代码可以是任意语言的程序代码,比如可以是C语言、C++、Java、Phython、Go等等。目标语句是源代码中指定位置的代码语句,通常可以用行号表示。下述是一段C语言的示例代码,作为本实施例后续的分析处理过程的示意:01 extern void abort(void)02 extern void __VERIFIER_assert(int cond) { if(!cond) { ERROR:abort();}};03 extern int __VERIFIER_nondet_int(void);0405 #define N 506 int main() {07...

【技术保护点】

【技术特征摘要】
1.一种基于路径遍历的代码验证方法,其特征在于,包括如下步骤:步骤S1:获取源代码及目标语句;所述目标语句是所述源代码中的代码语句;步骤S2:将所述源代码转换成控制流图;步骤S3:通过对循环体步进分解的方式,在控制流图中找出所有从程序入口至所述目标语句的路径长度不超过K的路径,组成路径集合;步骤S4:逐个遍历路径集合中的路径,对所遍历的路径进行可达验证;若当前路径可达,结束验证;若当前路径不可达则对路径集合中的下一条路径进行可达验证,直到路径集合中所有路径进行了可达验证;所述步骤S4中,所述对路径进行验证包括如下步骤:步骤S41:按顺序遍历当前路径的各个路径节点,根据当前路径节点所对应的源代码,按顺序抽取关于程序变量的表达式,组成第一表达式队列;步骤S42:根据第一表达式队列的顺序,依据当前表达式之前的赋值语句的表达式对表达式进行简化计算得到第二表达式队列;步骤S43:通过分析程序变量的作用域范围剔除掉第二表达式队列中的无关表达式得到第三表达式序列:若目标语句在程序变量的作用域范围之外,则在第二表达式队列中剔除该程序变量所对应的表达式;若程序变量的赋值语句之间不存在被引用的表达式,则删除该程序变量前序的赋值语句;步骤S44:根据程序变量赋值操作的次数序号结合数组变量的元素偏移量构建约束变量,将第三表达式队列中各个表达式的程序变量替换成约束变量后形成对应的SMT约束表达式,组成SMT约束编码;步骤S45:通过SMT约束求解器对SMT约束编码进行SMT约束求解,若SMT约束编码存在解,则表示当前路径可达,否则表示当前路径不可达。2.一种基于路径遍历的代码验证装置,其特征在于,包括如下模块:模块M1,用于:获取源代码及目标语句;所述目标语句是所述源代码中的代码语句;模块M2,用于:将所述源代码转换成控制流图;模块M3,用于:通过对循环体步进分解的方...

【专利技术属性】
技术研发人员:卜磊谢准一郭骁孙羽马乐之赵建华李宣东
申请(专利权)人:南京大学
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1