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.tx
,则将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
。