【问题标题】:Frama-C: Get slice for C assert statementFrama-C:获取 C 断言语句的切片
【发布时间】:2016-03-14 14:52:35
【问题描述】:

有没有办法使用Frama-C 的切片插件来计算特定C assert 语句的切片?

例如,给定以下代码:

int main() {
    double a=3;
    double b=4;
    double c=123;

    assert(b>=0);

    double d=a/b;
    c=a;

    return 0;
}

我想为assert(b>=0); 获取以下切片:

int main() {
    double b=4;

    assert(b>=0);

    return 0;
}

【问题讨论】:

    标签: frama-c program-slicing


    【解决方案1】:

    如果您可以将断言重写为 ACSL 断言,则可以使用选项 -slice-assert main

    int main() {
        double a=3;
        double b=4;
        double c=123;
    
        //@ assert(b>=0);
    
        double d=a/b;
        c=a;
    
        return 0;
    }
    

    (在这种情况下,除法也将被删除,因为它不影响断言。)

    void main(void)
    {
      double b;
      b = (double)4;
      /*@ assert b ≥ 0; */ ;
      return;
    }
    

    或者,您也可以使用-slice-calls assertassert 函数的调用进行切片。

    void main(void)
    {
      double b;
      b = (double)4;
      assert(b >= (double)0);
      return;
    }
    

    如果您想对特定断言进行切片(如果函数中有多个),则必须使用切片编译指示或编程 API(不推荐)。

    【讨论】:

    • 我需要对代码中的特定语句进行切片(因此我假设有多个语句)。所以我想开发一个 Frama-C 插件来完成这项工作。你会建议这样做吗?或者这就是你所说的“programmatic API (not recommended)”?或者,我可以使用正则表达式预处理 Frama-C 预处理的代码。
    • 另外我猜如果代码中有多个断言语句并且我想对特定的语句进行切片,那么将该语句转换为 ACSL 断言就足够了,不是吗?
    • 对于这种事情,也许你应该使用frama-c.com/slicing.html 中描述的切片编译指示。基本上,只需写/*@ slice pragma stmt; */,并使用选项-slice-pragma
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-24
    相关资源
    最近更新 更多