【发布时间】:2015-02-13 16:15:01
【问题描述】:
我想使用 Frama-C(批处理模式)中 Value 插件的分析结果来进一步评估函数中的变量。但是,输出似乎很大,有很多 [value] 标签,我只需要来自 [value] ====== VALUES COMPUTED ====== 的部分,每个函数末尾都有计算值。 Frama-C 是否支持允许我这样做的选项?
【问题讨论】:
标签: frama-c
我想使用 Frama-C(批处理模式)中 Value 插件的分析结果来进一步评估函数中的变量。但是,输出似乎很大,有很多 [value] 标签,我只需要来自 [value] ====== VALUES COMPUTED ====== 的部分,每个函数末尾都有计算值。 Frama-C 是否支持允许我这样做的选项?
【问题讨论】:
标签: frama-c
您可能会发现命令行选项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分析:
并且添加选项-val-show-callstack意味着对于第8行的警报,上下文如下所示:
t.c:8:[kernel] warning: signed overflow. assert x+y ≤ 2147483647;
stack: g :: t.c:12 <- main
【讨论】:
y = 0; x = 100 / y; 之后的x 的值是多少?在int *p = 0; z = *p; 之后z 的值是多少?这些错误必须与实际结果分开。但是您可以忽略这些消息,如果需要,只查看这些值。事实上,许多“派生分析”都是这样做的,并提供仅适用于已定义的程序执行的结果。 Perl 脚本应该足以将它们分开。