C中静态循环终止检测工具

时间:2012-11-29 11:13:14

标签: c static-analysis

对于C(或C类)程序是否有任何“几乎可用”的静态分析工具可以自动推断循环终止,至少对于非常简单的程序?

我环顾四周,发现了一些研究文章,一些原型,甚至一些工具(例如Frama-C)试图从带注释的源代码推断一些终止属性,但我期待找到至少有一个简单的工具,你可以给它一个C程序,它会输出:loop #N terminates / does not terminate / unknown

(我知道这在一般情况下是不可判定的,但对于某些类的循环,半算法是可能的。)

我也对那些适用于除C以外的命令式语言的工具感兴趣,例如Java。

编辑:只是我的问题的更新,我发现LoopFrog,建立在goto-cc之上,这似乎是我正在寻找的方向,但我仍然没有有时间真正了解其输出意味着什么。如果它是我的问题的答案,我会在这里发布更新。

1 个答案:

答案 0 :(得分:1)

我不知道您是否阅读过这两篇博文(12),但其中一篇是“简单” 您正在寻找的工具可以是一个脚本,它同时启动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终止时才注意到它。