Page 10 - 《软件学报》2020年第10期
P. 10
2986 Journal of Software 软件学报 Vol.31, No.10, October 2020
下所示.
① idx=idx % size;
② if (idx>=size||idx<0)…
③ assert (idx>=0 && idx<size);
程序中也可能存在一些复杂的约束和表达式实现了对数组下标的范围限制,比如按位操作、包含多个运算
符的线性运算,甚至是非线性约束.这些情况会加大分析难度,导致传统方法无法精准地检查出程序中的数组越
界缺陷.
Fig.2 Example code of test.c Fig.3 Buffer overflow vs. array index out of bound
图 2 test.c 代码示例 图 3 缓冲区溢出和数组下标越界关系图
1.2 污点分析
污点分析是检测程序漏洞的常用技术 [7,9,10] .如果攻击者向程序输入一些恶意数据,而程序没有进行恰当的
防护,则可能会导致系统处于不安全的状态.这些受外部输入影响的数据在污染分析中标记为污染.外部输入包
括用户或文件的输入、主函数的参数.污点分析尝试识别程序中那些会被用户输入污染的变量,并最终追溯到
可能会导致程序缺陷的语句.如果在该语句之前,未经检查就直接使用被污染的数据,则视为一个程序缺陷.污
点分析分为静态污点分析和动态污点分析.其中,动态污点分析需要执行程序,无法保证对源码的覆盖率.静态
污点分析主要依赖于程序抽象语法树和控制流图进行数据流分析,不需要实际执行程序.因此静态污点分析可
以实现比动态污点分析更高的源代码覆盖率.但静态污点分析可能因缺乏运行时信息而产生误报和漏报.
1.3 数据流分析
数据流分析通常用于静态代码分析,是一种基于控制流图来收集数据流信息的技术.对程序进行数据流分
析的一种简单方法是为控制流图的每个节点建立数据流方程,并通过在每个节点上重复计算输入的输出来反
复迭代,直到整个系统到达不动点 [11,12] .前向数据流分析和后向数据流分析是数据流分析的两种不同方法.前向