Static analysis 给定函数f的代码,如何静态地确定x是否影响f(x)?

Static analysis 给定函数f的代码,如何静态地确定x是否影响f(x)?,static-analysis,Static Analysis,如果我有一些函数的代码f(为了简单起见,它只接受一个输入),我需要确定输入x是否会影响输出f(x),也就是说,如果f是下面定义的常量函数 如果f的输出是不变的w.r.tx,则将f定义为常量函数。这应该适用于所有输入。例如,如果我们有f(x)=0次方x,除了x=0,它可能会输出错误,对于所有输入,它可能会输出0。所以f不是一个常数函数 为了简单起见,我只能对代码进行静态分析,并假设代码是Java源代码。 这是可能的吗?这显然至少和解决停止问题一样困难(作为练习留下证据),所以答案是“不”,这是不可

如果我有一些函数的代码
f
(为了简单起见,它只接受一个输入),我需要确定输入
x
是否会影响输出
f(x)
,也就是说,如果
f
是下面定义的常量函数

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

为了简单起见,我只能对代码进行静态分析,并假设代码是Java源代码。
这是可能的吗?

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

因为你会将非终止函数称为非常量,所以这里将你的问题简化为停止问题:

void does_it_halt(...);

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

询问
f
是否为常量等同于询问
是否停止。因此,你所要求的是不可能的,因为停顿问题是无法确定的。

几乎可以肯定这是可能的。在大多数情况下。那里没有奇怪的事情发生

对于普通函数,是一种普通的、有用的函数,它实际上返回值,而不是做自己的小事情

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

使用蛮力来磨碎它可能会奏效,除非你使用的是四倍精度的x值或类似大小的东西,因为这样蛮力可能需要几年的时间。虽然在这一点上,它不再是真正的静态分析

静态分析通常意味着让计算机通过查看代码来告诉您,而不是您自己查看代码(至少不是很多)。许多语言中都有这样的算法,包括一些免费的甚至是开源的。
某些事情可以完成的最终证明是它已经完成了。

好吧,除了Java中的
0^x
就是
0 xor x
,它总是
x
。对不起,我打错了。。我指的是权力。我更正了帖子。如果
f
没有终止,它应该输出什么?如果(;;)的(x==1)是
;否则返回0一个常量函数?@nneonno我称之为非常量函数。实际上,我想检查从输入到输出是否存在
数据依赖关系
。我们可以说“可能是常量”。(分析时间由参数延长)对。如果你允许“可能”的答案,这是一个完全可以解决的问题——问题是你愿意接受多少“可能”的答案。例如,这个简单的实现会返回所有输入的
maybe