我试图做两件事
问题1:Frama-C返回的切片不会返回与标准相关的确切语句 - 主要是if
和else
语句。
问题2:如何将切片语句映射回源代码?切片时程序会发生变化(例如:int a=9
变成切片代码int a;
和a = 9;
中的2个语句。)我对切片感觉很好但是我可以用来映射的信息是什么这些回到源代码中的语句。
这是源代码。
void main(){
int ip1 = 9;
int ip2 = 3;
int option = 1;
int result = math(option,ip1,ip2);
//@ slice pragma expr ((option == 1) || !(result == (ip1+ip2)));
}
int math(int option, int a, int b){
int answer = 0;
if (option == 1){
answer = a+b;
}else{
if (option == 2) {
answer = a-b;
}else { // a ^ b
for(int i=0 ;i<b; i++){
answer=answer*a;
}
}
}
return answer;
}
我使用以下命令获取切片。
frama-c t.c -slicing-level 3 -slice-pragma main -slice-print
我从frama-c获得的切片是:
void main(void)
{
int ip1;
int ip2;
int option;
int result;
ip1 = 9;
ip2 = 3;
option = 1;
result = math_slice_1(ip1,ip2);
/*@ slice pragma expr option≡1∨!(result≡ip1+ip2); */ ;
return;
}
int math_slice_1(int a, int b)
{
int answer;
answer = a + b;
return answer;
}
问题1:
我没有得到切片中的if
和else
条件。我该怎么做才能得到它们?
我期待以下切片:
int math_slice_1(int a, int b)
{
int answer;
if (option == 1){
answer = a + b;
}
return answer;
}
问题2:
源代码包含:int ip1 = 9;
但切片代码有:
int ip1;
ip1 = 9;
如何将这两个切片语句映射回源代码语句。
答案 0 :(得分:3)
对于问题1,测试被切除,因为它始终为真,因为主函数中option
设置为1。如果你想保持测试,你必须使option
成为一个条目(例如外部全局变量或main
的参数),但是,math
中没有任何要切片的内容。 1}} function ...切片试图只保留严格必要的内容,而且测试不在你的情况下。