【问题标题】:Suppress [value] messages in the log of Frama-C's Value Analysis抑制 Frama-C 的价值分析日志中的 [value] 消息
【发布时间】:2015-02-13 16:15:01
【问题描述】:

我想使用 Frama-C(批处理模式)中 Value 插件的分析结果来进一步评估函数中的变量。但是,输出似乎很大,有很多 [value] 标签,我只需要来自 [value] ====== VALUES COMPUTED ====== 的部分,每个函数末尾都有计算值。 Frama-C 是否支持允许我这样做的选项?

【问题讨论】:

    标签: frama-c


    【解决方案1】:

    您可能会发现命令行选项frama-c -no-val-show-initial-state -no-val-show-progress … 使输出更符合您的口味。

    使用后一个选项时,您可能会喜欢-val-print-callstacks,它会打印每次发出消息时消息对应的调用堆栈,因为该上下文不再可用于前一个日志中的行。

    为了说明,回答时Frama-C的开发版本默认显示如下信息:

    int x;
    
    /*@ assigns x; */
    void f(void);
    
    void g(int y) {
      f();
      x += y;
    }
    
    int main(void) {
      g(1);
    }
    

    frama-c -val t.c分析:

    [value] Analyzing a complete application starting at main
    [value] Computing initial state
    [value] Initial state computed
    [value] Values of globals at initialization
      x ∈ {0}
    [value] computing for function g <- main.
            Called from t.c:12.
    [value] computing for function f <- g <- main.
            Called from t.c:7.
    [value] using specification for function f
    t.c:3:[value] warning: no \from part for clause 'assigns x;' of function f
    [value] Done for function f
    t.c:8:[kernel] warning: signed overflow. assert x+y ≤ 2147483647;
    [value] Recording results for g
    [value] Done for function g
    [value] Recording results for main
    [value] done for function main
    [value] ====== VALUES COMPUTED ======
    [value] Values at end of function g:
      x ∈ [-2147483647..2147483647]
    [value] Values at end of function main:
      x ∈ [-2147483647..2147483647]
      __retres ∈ {0}
    

    frama-c -val t.c -no-val-show-initial-state -no-val-show-progress分析:

    [value] 从 main 开始分析一个完整的应用程序 [value] 计算初始状态 [值] 初始状态计算 [值] 使用函数 f 的规范 t.c:3:[value] 警告:没有 \from 子句“分配 x;”的部分函数 f t.c:8:[kernel] 警告:签名溢出。断言 x+y ≤ 2147483647; [值] 为函数 main 完成 [值] ====== 计算的值 ====== [值] 函数 g 末尾的值: x ∈ [-2147483647..2147483647] [value] 函数 main 末尾的值: x ∈ [-2147483647..2147483647] __retres ∈ {0}

    并且添加选项-val-show-callstack意味着对于第8行的警报,上下文如下所示:

    t.c:8:[kernel] warning: signed overflow. assert x+y ≤ 2147483647;
                      stack: g :: t.c:12 <- main
    

    【讨论】:

    • 能否请您告诉我是否有任何选项可以设置 FramaC 值分析 not 来检查缓冲区溢出、除以 0 或其他隐式断言的有效性?因为我只想知道变量的最终值。
    • @TrúcNguyễnLâm 这是不可能的。分析必须假设这些事情不会发生。 y = 0; x = 100 / y; 之后的x 的值是多少?在int *p = 0; z = *p; 之后z 的值是多少?这些错误必须与实际结果分开。但是您可以忽略这些消息,如果需要,只查看这些值。事实上,许多“派生分析”都是这样做的,并提供仅适用于已定义的程序执行的结果。 Perl 脚本应该足以将它们分开。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-26
    • 1970-01-01
    • 2015-06-03
    • 2017-12-07
    • 2015-07-15
    相关资源
    最近更新 更多