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

Finding Loop Iterator in static Analysis

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

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

我已经准备好了以下概念:

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

然而,可以使用一些试探法来识别 iterator 表达式。对于循环,他们经常表达两个属性:progresstermination。进度通常与同一变量的更新有关,其值取决于该变量,例如:

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

终止通常与进度表达式与某个常量(意思是"constant for the loop")的比较有关,例如:

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

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

因此,基本策略是:

  1. 从循环的退出条件收集所有变量。
  2. 检查它们中的哪些在循环体中被修改并依赖于它们自己。

但请记住,有些循环没有进度表达式,有些没有终止条件,变量更新可以是间接的并且存在别名。