Page 19 - 《软件学报》2020年第10期
P. 19

高凤娟  等:基于污点分析的数组越界缺陷的静态检测方法                                                      2995


         找到了 16 行的 s.arr[i]应满足 i<15 的边界检查,第 16 行的 s.arr[i]将从待检查数组集合中移除.也就是说,Block4
         的 InState 是 16 行的 tmp[i]中的,i<3.然后继续向上分析 Block5,在 Block5 中遇到 for 语句时,16 行的 tmp[i]中的
         i 恰好为循环变量,转换为循环越界问题处理,即在循环上方检测循环上界 n 是否会超出数组 tmp 的长度,即检测
         n<4.Block6 中的待检测数组信息 OutState 为 16 行的 tmp[i]中的 n<4,11 行的 s.noisy[n]中的 n<12.当遇到 Block6
         中的赋值语句时,待检测数组信息将更新为 16 行的 tmp[i]中 m<4,11 行的 s.noisy[n]中的 m<12.因此,当遇到函数
         f 的入口时,待检测数组信息不为空.如果配置的检测深度为 1,那么将报告数组越界警告.否则,将执行过程间的
         后向数据流分析.
             在函数 main 中,根据实参更新待检测数组信息为 16 行的 tmp[i]中的 argc<5,11 行的 s.noisy[n]中的 argc<13.
         if 语句的条件为 argc+2<15,使用简单匹配方法,则 11 行的 p.noisy[n]的数组边界检查条件 n<12 可以被满足,因
         此,简单匹配方法中的警报“test.c,line 11,p.noisy[n],n<12”为误报.但是 12 行的循环上界 n 应小于 11 才可以保证
         15 行的 arr[i]中的 i<10,因此,简单匹配方法和约束求解方法中的警报“test.c,line 12,arr[i],n<11”为真警报.
             因此,当使用简单匹配方法进行判断时,无法匹配可以处理的模式,将会报告:
                                        test.c,line 11,s.noisy[n],n<12;
                                        test.c,line 16,tmp[i],i<3;
             当使用约束求解方法进行判断时,可得!((argc+2<15)→(argc<13))≡UNSAT,!((argc+2<15)→(argc<5))≡
         SAT,因此将会报告:
                                             test.c,line 16,tmp[i],i<3;

         3    实现和实验评估

             本文扩展了我们的前期工作           [16,17] ,实现了一个面向数组越界缺陷检测的全自动跨平台的静态分析工具
         Carraybound,优化了按需污点分析,并增加了按需指针分析,从而以此来分析数组长度的区间,引入了定理证明
         器 Z3 [15] ,在数组越界检测过程中用以解决约束求解问题,工具的架构如图 6 所示.该工具可以在 Linux 和
         Windows 系统上运行,底层依赖于 Clang 3.6 和约束求解器 Z3,由数组长度区间分析、按需污点分析和数组越界
         缺陷检测共 3 个模块组成.提供了可配置的功能实现用户按需调节检测精度,用户可以配置函数层数来控制执
         行过程间数据流分析的深度,并通过内存优化、求解优化等措施提升了工具的效率.



















                                       Fig.6    Architecture of Carraybound
                                          图 6   Carraybound 工具架构
         3.1   实现优化
             内存优化.大规模程序总是包含大量 AST 文件.如果一次性读入所有 AST 文件,包含 AST 文件的所有内容,
         将会消耗大量内存.这将会严重制约 Carraybound 对大规模程序的支持.比如,PHP-5.6.16 包含 25 万行源代码和
         211 个 AST 文件,当我们尝试一次性读入所有 AST 文件时,在 2GB 内存的机器上将无法运行.为了支持在有限
   14   15   16   17   18   19   20   21   22   23   24