对于C(或C类)程序是否有任何“几乎可用”的静态分析工具可以自动推断循环终止,至少对于非常简单的程序?
我环顾四周,发现了一些研究文章,一些原型,甚至一些工具(例如Frama-C)试图从带注释的源代码推断一些终止属性,但我期待找到至少有一个简单的工具,你可以给它一个C程序,它会输出:loop #N terminates
/ does not terminate
/ unknown
。
(我知道这在一般情况下是不可判定的,但对于某些类的循环,半算法是可能的。)
我也对那些适用于除C以外的命令式语言的工具感兴趣,例如Java。
编辑:只是我的问题的更新,我发现LoopFrog,建立在goto-cc之上,这似乎是我正在寻找的方向,但我仍然没有有时间真正了解其输出意味着什么。如果它是我的问题的答案,我会在这里发布更新。
答案 0 :(得分:1)
我不知道您是否阅读过这两篇博文(1,2),但其中一篇是“简单”
您正在寻找的工具可以是一个脚本,它同时启动Frama-C的价值分析,作为一个普通的声音抽象解释器(能够推断出程序的结束是无法到达的)并且选择-obviously-terminates
(在在哪种情况下,它可以推断程序的所有执行都终止)。在这两种情况下,您可能都希望使用超时。对于使用选项-obviously-terminates
的分析,超时是强制性的,因为如果分析的程序本身不会终止,则分析无法终止。
根据我写的这些博文,您应该能够诊断出以下示例,并非所有这些示例都是微不足道的:
char x, y;
main()
{
x = input();
y = input();
while (x>0 && y>0)
{
if (input() == 1)
{
x = x - 1;
y = input();
}
else
y = y - 1;
}
}
终止
char x, y;
main()
{
x = input();
y = input();
while (x>0 && y>0)
{
// Frama_C_dump_each();
if (input())
{
x = x - 1;
y = x;
}
else
{
x = y - 2;
y = x + 1;
}
}
}
终止
char x;
main(){
x = input();
while (x > 0)
{
Frama_C_dump_each();
if (x > 11)
x = x - 12;
else
x = x + 1;
}
}
终止
unsigned char u;
int main(){
while (u * u != 17)
{
u = u + 1;
}
return u;
}
不会终止。
但是,这些示例中涉及的选项-obviously-terminates
最初并不是为此用途而设计的(它更像是对某种程序进行分析的优化)。我没有意识到,在极少数情况下,当设置此选项时,分析可能会终止,而分析的程序本身不会终止。如果您愿意从源代码重新编译,可以通过在文件obviously_terminates
中将变量true
设置为false
(而不是state_set.ml
)来解决此问题。如果您有理由认为此脚本不是您正在寻找的解决方案,那么请不要理会:正如我所说,问题似乎很少见。我只是在尝试确定程序是否以更多competitive setting终止时才注意到它。