Я хочу использовать результат анализа плагина Value во Frama-C (пакетный режим) для дальнейшей оценки переменных в функциях. Однако вывод кажется большим с большим количеством тегов [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] Analyzing a complete application starting at main [value] Computing initial state [value] Initial state computed [value] using specification for function f t.c:3:[value] warning: no \from part for clause 'assigns x;' of function f t.c:8:[kernel] warning: signed overflow. assert x+y ≤ 2147483647; [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}
А добавление опции -val-show-callstack
означает, что для тревоги в строке 8 контекст показан ниже:
t.c:8:[kernel] warning: signed overflow. assert x+y ≤ 2147483647;
stack: g :: t.c:12 <- main
person
Pascal Cuoq
schedule
13.02.2015
Не могли бы вы сказать мне, есть ли возможность установить анализ значений FramaC не для проверки правильности переполнения буфера, деления на 0 или других неявных утверждений? Так как я просто хочу знать значение переменных в конце.
- person Trúc Nguyễn Lâm; 25.02.2015
@TrúcNguyễnLâm Это невозможно. Анализ должен предполагать, что этого не происходит. Каково значение
x
после y = 0; x = 100 / y;
? Каково значение z
после int *p = 0; z = *p;
? Эти ошибки должны быть отделены от реальных результатов. Но вы можете игнорировать сообщения и смотреть только на значения, если хотите. На самом деле, многие «производные анализы» делают это и дают результаты, применимые только к определенным исполнениям программы. Perl-скрипта должно быть достаточно, чтобы разделить их.
- person Pascal Cuoq; 25.02.2015