给定函数f的代码,如何静态判断x是否影响f(x)?

时间:2012-09-19 23:55:46

标签: static-analysis

如果我有一些函数f的代码(为了简单起见,它接受一个输入),我需要确定输入x是否影响输出f(x),即if { {1}}是下面定义的常量函数。

如果f的输出是w.r.t f的不变量,则将f定义为常量函数。这应该适用于所有输入。因此,例如,如果我们有x,它可以为除x = 0之外的所有输入输出0,其中它可能输出错误。所以f(x) = 0 power x不是一个常数函数。

我只能对代码进行静态分析,并假设代码是Java源代码以简化。 这可能吗?

3 个答案:

答案 0 :(得分:1)

这显然至少与解决停机问题(作为练习留下的证据)一样难,所以答案是“不”,这是不可能的。

答案 1 :(得分:1)

几乎可以肯定。在多数情况下。哪里没有奇怪的事情发生。

对于普通函数,实际返回值的普通,有用的类型,而不是做自己的小事,是的。

对于一个简单的函数,不是递归的,没有那种肮脏,手动做,我可能会使静态分析等效于符号图,在那里我检查代码并确定可能可能是边界条件等(例如代码中有if (x < 0),所以我检查函数的x值接近0)。如果这种尝试注定要失败,请在我尝试使用之前告诉我。

使用蛮力磨掉它可能会起作用,除非你正在使用四倍精度x值或类似大小的东西,因为那时蛮力可能需要数年时间。虽然在那时它不再是静态分析了。

静态分析通常意味着让计算机通过查看代码告诉您,而不是您自己查看(至少不是很多)。存在以多种语言执行此操作的算法,wikipedia具有这样的列表,包括一些免费或甚至开源。 可以做某事的最终证据就是它已经完成了。

答案 2 :(得分:0)

由于您将非终止函数称为非常量函数,因此这是从问题减少到停止问题:

void does_it_halt(...);

int f(int x) {
    if(x == 1) {
        does_it_halt();
    }
    return 0;
}

询问f是否恒定等同于询问does_it_halt是否停止。因此,你所要求的是不可能的,因为停止问题是不可判定的。