如何获取数据和使用Frama-c控制依赖性切片

时间:2014-08-06 21:13:32

标签: c slice frama-c program-slicing

我试图做两件事

  1. 根据条件获取动态后向切片。
  2. 将切片语句映射回实际的源代码。
  3. 问题1:Frama-C返回的切片不会返回与标准相关的确切语句 - 主要是ifelse语句。

    问题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: 我没有得到切片中的ifelse条件。我该怎么做才能得到它们?

    我期待以下切片:

        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;
    

    如何将这两个切片语句映射回源代码语句。

1 个答案:

答案 0 :(得分:3)

对于问题1,测试被切除,因为它始终为真,因为主函数中option设置为1。如果你想保持测试,你必须使option成为一个条目(例如外部全局变量或main的参数),但是,math中没有任何要切片的内容。 1}} function ...切片试图只保留严格必要的内容,而且测试不在你的情况下。