如何在静态分析中找到循环迭代器?变量作为迭代器有什么不同的条件?
在像for(i = 0; i < n; i++);
这样的超简化for循环中,我们可以假设,lhs的初始化表达式是迭代器。但是,如何在while循环中找到迭代器或者在for循环中找到更复杂的迭代器呢?
我准备好了以下概念:
答案 0 :(得分:2)
通常没有循环迭代器。例如,单个迭代器变量可能不足(例如,可以同时从两端遍历数组),循环的终止可以取决于外部数据(例如,用户输入)并且有用无限循环(迭代器无用)。
但是,某些启发式方法可用于识别迭代器表达式。对于循环,他们经常表达两个属性:进度和终止。进度通常与使用依赖于此变量的值更新同一变量有关,例如:
i++; // For indexed structures
p = p -> next; // For linked structures
终止通常与进度表达式与某个常量(意为“循环常量”)的比较有关,例如:
i <= n; // For scalar values
p == null; // For pointers
通常可能有几个进度表达式,因此有几个终止常量,并且可以在终止表达式中使用几个进度变量。
因此,基本策略是:
但请记住,有些循环没有进度表达式,有些循环没有终止条件,变量更新可以是间接的,并且存在别名。