在静态分析中查找循环迭代器

时间:2015-09-25 02:48:42

标签: c loops static-analysis

如何在静态分析中找到循环迭代器?变量作为迭代器有什么不同的条件?

在像for(i = 0; i < n; i++);这样的超简化for循环中,我们可以假设,lhs的初始化表达式是迭代器。但是,如何在while循环中找到迭代器或者在for循环中找到更复杂的迭代器呢?

我准备好了以下概念:

  • 达到定义
  • 范围值
  • 控制流程图

1 个答案:

答案 0 :(得分:2)

通常没有循环迭代器。例如,单个迭代器变量可能不足(例如,可以同时从两端遍历数组),循环的终止可以取决于外部数据(例如,用户输入)并且有用无限循环(迭代器无用)。

但是,某些启发式方法可用于识别迭代器表达式。对于循环,他们经常表达两个属性:进度终止。进度通常与使用依赖于此变量的值更新同一变量有关,例如:

i++; // For indexed structures
p = p -> next; // For linked structures

终止通常与进度表达式与某个常量(意为“循环常量”)的比较有关,例如:

i <= n; // For scalar values
p == null; // For pointers

通常可能有几个进度表达式,因此有几个终止常量,并且可以在终止表达式中使用几个进度变量。

因此,基本策略是:

  1. 从循环的退出条件中收集所有变量。
  2. 检查哪一个在循环体中被修改,并依赖于它们自己。
  3. 但请记住,有些循环没有进度表达式,有些循环没有终止条件,变量更新可以是间接的,并且存在别名。