一种基于动态符号执行的软件缺陷检测方法技术

技术编号:14482022 阅读:69 留言:0更新日期:2017-01-25 23:59
本发明专利技术公开了一种基于动态符号执行的软件缺陷检测方法。其包括下列步骤:对待检测的软件的源程序中的变量添加符号化标识,然后对源程序进行编译处理得到底层虚拟机LLVM中间码;根据指令类型,对LLVM中间码进行分类插桩处理,插入符号执行和缺陷检测指令;将插桩处理后的LLVM中间码编译生成可执行文件;基于生成的可执行文件,进行动态符号执行与缺陷检测:基于动态符号执行对源程序的各个分支进行软件缺陷检测。本发明专利技术的实施,能全面地检测程序中各个分支中潜在的缺陷,且缺陷检测效率高。

【技术实现步骤摘要】

本专利技术属于计算机领域,具体涉及一种基于动态符号执行的软件缺陷检测方法
技术介绍
源程序经过编译器clang编译可以生成LLVM(底层虚拟机)中间码,根据不同的LLVM中间码指令类型进行分类插桩,插桩操作需要使用LLVM官方源码的API接口。其中,插桩即利用LLVM官方源码的API接口在源程序编译得到的LLVM中间码中插入预设指令,通常包括符号执行和缺陷提取指令等。符号执行技术包括传统符号执行、选择性符号执行和动态符号执行。传统的符号执行技术通过使用符号变量代替真实变量模拟程序的执行,目标程序并不真实运行,因此符号执行得到的程序中的约束条件信息不够精确;选择性符号执行可以只对程序员感兴趣的代码进行符号执行,其它地方都使用真实值执行,因此选择性符号执行具有更高的灵活性;动态符号执行技术与前两者都有所不同,动态符号执行是在程序真实执行的过程中同时进行符号执行,符号执行是在插桩后的桩函数内执行完成,即在真实执行的过程中通过桩函数收集约束相关信息生成路径约束条件,然后通过约束求解器(如SMT(SatisfiabilityModuloTheories)求解器)对其中一条约束条件取非构造出一条新的程序执行路径并求解得到满足这条新路径的输入案例,其中,使用约束求解器求解,即求解得到满足对应约束条件的程序输入变量值。由于动态符号执行是在程序真实执行过程中收集约束条件,因此,收集到的约束条件更加精确,生成的测试案例有效性更高。软件质量问题在软件使用非常普遍的今天已经越来越受到人们的重视,软件缺陷检测也日益被越来越多的研究者和软件厂商关注,由于软件质量问题造成重大损失的事件也是不胜枚举。常见的软件开发工具如visualstudio、eclipse等可以检查出一些软件程序中存在的语法错误和一些简单的逻辑错误,无法深入准确地分析程序执行过程中所有可能存在的错误,就算是专业的程序缺陷检测工具如valgrind也只能检测程序一次运行过程中所在路径上的错误,无法更加全面地检测程序中各个分支中潜在的缺陷。常规的软件测试也很难发现程序中隐藏较深的缓冲区溢出和内存泄露等错误,由于生成的测试案例对程序分支覆盖度的限制也无法非常全面高效地检测程序中的缺陷。
技术实现思路
本专利技术基于动态符号执行,在动态符号执行生成的测试案例对应的每条分支路径上进行缺陷检测。因此,本专利技术的基于动态符号执行的软件缺陷检测方法包括以下步骤:步骤1:对待检测的软件的源程序中的变量添加符号化标识,然后对源程序进行编译处理得到底层虚拟机LLVM中间码;步骤2:根据指令类型,对LLVM中间码进行分类插桩处理,插入符号执行和缺陷检测指令;步骤3:将插桩处理后的LLVM中间码编译生成可执行文件;步骤4:基于生成的可执行文件,进行动态符号执行与缺陷检测:401:基于测试案例运行可执行文件(每次运行可执行文件中的对应程序的一条分支路径)生成执行结果,即生成对应的条件表达式,包括符号执行约束条件表达式集合、缺陷检测条件表达式集合。其中,测试案例的初始值为随机输入。在基于测试案例运行可执行文件时,可能只生成符号执行约束条件表达式集合,也可能同时生成符号执行约束条件表达式集合和缺陷检测条件表达式集合;若当前执行结果存在缺陷检测条件表达式集合,则将当前生成的符号执行约束条件表达式集合和缺陷检测条件表达式集合作为一个队列元素存入预设队列L中(队列L用于软件缺陷判定),实现队列L的更新;在生成执行结果后,并行执行步骤402、403,即基于生成的符号执行约束条件表达式集合执行步骤402;在执行步骤403时,若队列L有更新,则基于更新后的队列L执行步骤403;若无更新,则直接基于原有的队列L执行步骤403;402:判断所有生成的符号执行约束条件表达式是否均已取非,若是,则测试案例生成结束,并设置软件检测结束标识;否则,将其中一个符号执行约束条件表达式取非并通过第一约束求解器进行测试案例求解,若有解,则将当前求解结果作为测试案例并执行步骤401;若无解,则继续执行步骤402;403:判断队列L是否为空,若为空,则检测是否存在软件检测结束标识,若是,则结束软件缺陷检测;若否,则继续执行步骤403;若队列L不为空,则从队列L中取出一个队列元素A并执行步骤404,其中队列元素A包括符号执行约束条件表达式集合S和缺陷条件表达式集和R;步骤404:从集合R中取出一个未被求解的缺陷条件表达式r,将r与集合S合并得到新的条件表达式集合(r∩S)并通过第二约束求解器进行缺陷判定求解,若有解,则显示对应r的缺陷类型;若无解,则判断集合R是否为空,若是,则执行步骤403;否则,执行步骤404。本专利技术基于动态符号执行,在动态符号执行生成的测试案例对应的每条分支路径上进行缺陷检测,能全面地检测程序中各个分支中潜在的缺陷。同时,由于程序执行一条路径上很多个地方都可能存在缺陷,所以一次符号执行求解可能会得到很多个缺陷检测条件表达式,因此在符号执行的基础上缺陷约束条件表达式的求解又会花费很多时间。为了解决这个问题,本专利技术采用多线程技术将符号执行约束条件表达式求解和缺陷检测条件表达式求解分离,分别在两个不同的线程(本专利技术的第一约束求解器和第二约束求解器)上并行执行,从而大大提高求解效率,提高软件缺陷检测效率。进一步的,本专利技术中对LLVM中间码进行分类插桩处理具体为:若当前指令是主函数入口的第一条指令,则在当前指令之前插入第一桩函数,第一桩函数用于读入符号化变量的值;若当前指令为主函数的最后一条指令,则在当前指令之前插入第二桩函数,第二桩函数用于检测内存泄漏;若当前指令为非主函数(普通函数)的第一条指令,则在当前指令之前插入第三桩函数,第三桩函数用于标记所述普通函数;若当前指令为分配指令,则判断分配指令是否用于申请数组空间,若是,则插入第四桩函数,第四桩函数用于传递数组信息;若当前指令为加载指令,则插入第五桩函数,第五桩函数用于获取加载指令参数的地址;若当前指令为存储指令,则插入第六桩函数,第六桩函数用于提取存储指令的参数、并存储符号执行产生的新的符号变量;若当前指令为二元运算指令,则插入第七桩函数,第七桩函数用于加载二元运算指令的参数,用符号值模拟二元指令运算;若当前指令为比较指令,则插入第八桩函数,第八桩函数用于加载比较指令的参数,模拟比较指令的比较运算;若当前指令为分支指令,则插入第九桩函数,第九桩函数用于标记当前程序分支;若当前指令为返回指令,则插入第十桩函数,第十桩函数用于加载返回指令的参数、并处理返回指令的返回结果;若当前指令为函数调用指令,则判断调用函数是否为分配内存或释放内存,若是,则插入第十一桩函数,第十一桩函数用于检测内存多次释放;否则插入第十二桩函数,第十二桩函数用于加载调用函数的参数并对函数返回结果做处理;若当前指令为转换指令,则插入第十三桩函数,第十三桩函数用于描述转换关系;若当前指令为取元素指令,则插入第十四桩函数,第十四桩函数用于检测所取元素是否存在数组或指针越界。即根据取元素指令的参数获取访问空间的范围和当前访问的位置然后比较当前访问的空间是否在合法的区域,如果是则没有发生越界,否则发生越界。综上所述,由于采用了上述方案,本专利技术的有益效果是:能全面地检测程序中各个分支中潜在的缺陷,且缺陷本文档来自技高网
...

【技术保护点】
一种基于动态符号执行的软件缺陷检测方法,其特征在于,包括下列步骤:步骤1:对待检测的软件的源程序中的变量添加符号化标识,然后对源程序进行编译处理得到底层虚拟机LLVM中间码;步骤2:根据指令类型,对LLVM中间码进行分类插桩处理,插入符号执行和缺陷检测指令;步骤3:将插桩处理后的LLVM中间码编译生成可执行文件;步骤4:基于生成的可执行文件,进行动态符号执行与缺陷检测:401:基于测试案例运行可执行文件,生成符号执行约束条件表达式集合,或符号执行约束条件表达式集合和缺陷检测条件表达式集合,其中测试案例的初始值为随机输入;若存在缺陷检测条件表达式集合,则将当前生成的符号执行约束条件表达式集合和缺陷检测条件表达式集合作为一个队列元素存入预设队列L中;402:判断所有生成的符号执行约束条件表达式是否均已取非,若是,则测试案例生成结束,并设置软件检测结束标识;否则,将其中一个符号执行约束条件表达式取非并通过第一约束求解器进行测试案例求解,若有解,则将当前求解结果作为测试案例并执行步骤401;若无解,则继续执行步骤402;403:判断队列L是否为空,若为空,则检测是否存在软件检测结束标识,若是,则结束软件缺陷检测;若否,则继续执行步骤403;若队列L不为空,则从队列L中取出一个队列元素A并执行步骤404,其中队列元素A包括符号执行约束条件表达式集合S和缺陷条件表达式集和R;步骤404:从集合R中取出一个未被求解的缺陷条件表达式r,将r与集合S合并得到新的条件表达式集合并通过第二约束求解器进行缺陷判定求解,若有解,则显示对应r的缺陷类型;若无解,则判断集合R是否为空,若是,则执行步骤403;否则,执行步骤404。...

【技术特征摘要】
1.一种基于动态符号执行的软件缺陷检测方法,其特征在于,包括下列步骤:步骤1:对待检测的软件的源程序中的变量添加符号化标识,然后对源程序进行编译处理得到底层虚拟机LLVM中间码;步骤2:根据指令类型,对LLVM中间码进行分类插桩处理,插入符号执行和缺陷检测指令;步骤3:将插桩处理后的LLVM中间码编译生成可执行文件;步骤4:基于生成的可执行文件,进行动态符号执行与缺陷检测:401:基于测试案例运行可执行文件,生成符号执行约束条件表达式集合,或符号执行约束条件表达式集合和缺陷检测条件表达式集合,其中测试案例的初始值为随机输入;若存在缺陷检测条件表达式集合,则将当前生成的符号执行约束条件表达式集合和缺陷检测条件表达式集合作为一个队列元素存入预设队列L中;402:判断所有生成的符号执行约束条件表达式是否均已取非,若是,则测试案例生成结束,并设置软件检测结束标识;否则,将其中一个符号执行约束条件表达式取非并通过第一约束求解器进行测试案例求解,若有解,则将当前求解结果作为测试案例并执行步骤401;若无解,则继续执行步骤402;403:判断队列L是否为空,若为空,则检测是否存在软件检测结束标识,若是,则结束软件缺陷检测;若否,则继续执行步骤403;若队列L不为空,则从队列L中取出一个队列元素A并执行步骤404,其中队列元素A包括符号执行约束条件表达式集合S和缺陷条件表达式集和R;步骤404:从集合R中取出一个未被求解的缺陷条件表达式r,将r与集合S合并得到新的条件表达式集合并通过第二约束求解器进行缺陷判定求解,若有解,则显示对应r的缺陷类型;若无解,则判断集合R是否为空,若是,则执行步骤403;否则,执行步骤404。2...

【专利技术属性】
技术研发人员:郭文生杨霞汪勇张少鑫刘维飞武琼袁艺杨姗刘小平包灵廖士钞杨拯
申请(专利权)人:电子科技大学
类型:发明
国别省市:四川;51

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

1