[发明专利]C/C++程序中不可达代码的静态检测方法及系统有效
申请号: | 201811101415.2 | 申请日: | 2018-09-20 |
公开(公告)号: | CN109446066B | 公开(公告)日: | 2020-11-03 |
发明(设计)人: | 马森;张世琨;马骁;高庆;郜成胜 | 申请(专利权)人: | 北京大学;北京北大软件工程股份有限公司 |
主分类号: | G06F11/36 | 分类号: | G06F11/36 |
代理公司: | 北京路浩知识产权代理有限公司 11002 | 代理人: | 王莹;吴欢燕 |
地址: | 100871*** | 国省代码: | 北京;11 |
权利要求书: | 查看更多 | 说明书: | 查看更多 |
摘要: | |||
搜索关键词: | c++ 程序 不可 代码 静态 检测 方法 系统 | ||
1.一种C/C++程序中不可达代码的静态检测方法,其特征在于,包括:
构建待检测C/C++程序的控制依赖图和值依赖图;
在所述值依赖图上进行常量分析,并根据常量分析的结果更新所述控制依赖图;
对更新后的所述控制依赖图中所有守卫结点的约束表达式的可满足性进行求解;
若存在不可满足的约束表达式,则从所述控制依赖图中获取与所述不可满足的约束表达式相对应的守卫结点的所有直接和间接后继结点所对应的程序代码;
其中,所述构建待检测C/C++程序的控制依赖图和值依赖图的步骤进一步包括:
制作待检测C/C++程序的控制流图;
基于所述控制流图构建所述待检测C/C++程序的控制依赖图,基于所述控制流图构建所述待检测C/C++程序的值依赖图;
其中,所述基于所述控制流图构建所述待检测C/C++程序的控制依赖图的步骤进一步包括:
根据所述控制流图生成所述待检测C/C++程序的逆控制流图,构建所述逆控制流图的必经结点树,通过计算所述逆控制流图的必经结点边界构建所述待检测C/C++程序的控制依赖图的有向边;
在所述控制依赖图的每个条件判断结点的分支后插入守卫结点,并计算所有守卫结点的约束表达式;
其中,所述基于所述控制流图构建所述待检测C/C++程序的值依赖图的步骤进一步包括:
分析所述控制流图中的变量定义、内存分配、形式参数、实际参数和返回语句,构建所述待检测C/C++程序的值依赖图的结点;
在所述控制流图上进行到达定值分析和指向分析,根据分析结果构建所述值依赖图的边;
通过计算所述值依赖图的各不同结点之间的到达条件来构建守卫,并将到达条件标注在所述值依赖图的相应边上;
去掉所述值依赖图中到达条件无法满足的边;
其中,所述在所述值依赖图上进行常量分析,并根据常量分析的结果更新所述控制依赖图的步骤进一步包括:
在所述值依赖图上对所述待检测C/C++程序中的变量进行常量传播和折叠分析,所述常量传播和折叠分析的结果为存在常量值的变量和/或表达式以及相对应的常量值;
遍历所述控制依赖图中各守卫结点的约束表达式,将所述约束表达式中包含的所述存在常量值的变量和/或表达式替换为相对应的常量值;
其中,所述在所述值依赖图上进行常量分析,并根据常量分析的结果更新所述控制依赖图的步骤还包括:
在所述值依赖图上进行值集分析和区间分析,获得存在取值集合或区间范围的变量;
遍历所述控制依赖图中各守卫结点的约束表达式,对所述约束表达式中包含的所述存在取值集合或区间范围的变量,根据所述约束表达式中含有的原子表达式的数量、集合大小和区间范围确定分析代价,将分析代价可接受的变量用取值集合或区间范围的形式进行表达后加入至守卫约束中。
2.根据权利要求1所述的方法,其特征在于,所述对更新后的所述控制依赖图中所有守卫结点的约束表达式的可满足性进行求解的步骤进一步包括:
利用SMT约束求解器求解更新后的所述控制依赖图中所有守卫结点的约束表达式的可满足性。
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于北京大学;北京北大软件工程股份有限公司,未经北京大学;北京北大软件工程股份有限公司许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/201811101415.2/1.html,转载请声明来源钻瓜专利网。