我的最后一个问题(Understanding Frama-C slicer results)是一个精确的例子,但正如我所说,我的目标是知道是否可以用Frama-C做一些条件切片(向前和向后)。有可能吗?
更确切地说,我无法获得该程序的精确切片:
/*@ requires a >= b;
@ assigns \nothing;
@ ensures \result == a;
*/
int example4_instr1(int a, int b){
int max = a;
if(a < b)
max = b;
return max;
}
通过使用好的参数/选项,是否有可能在这种情况下得到我想要的/在一般情况下?
答案 0 :(得分:2)
正如Pascal在他的answer to your previous question中提到的,Frama-C的向后和向前切片是基于称为价值分析的分析结果。这种分析是非关系型的;这意味着它只保留有关变量数值范围的信息,但不包括例如两个变量之间的差异。因此,它无法跟踪您的不平等a >= b
。这解释了为什么似乎遵循了测试if (a < b)
的两个分支。
如果没有来自用户的更多信息(但是,在此示例中,您可以编写的任何内容都无助于值分析)或其他分析,则向后切片必须考虑if
可能是也可能不是拍摄。不幸的是,这导致了一个程序,没有任何东西被切掉。