Подавить сообщения [значение] в журнале анализа стоимости Frama-C.

Я хочу использовать результат анализа плагина Value во Frama-C (пакетный режим) для дальнейшей оценки переменных в функциях. Однако вывод кажется большим с большим количеством тегов [value], мне нужна только часть из [value] ====== VALUES COMPUTED ====== с вычисленными значениями в конце каждой функции. Поддерживает ли Frama-C опции, которые позволяют мне это сделать?


person Trúc Nguyễn Lâm    schedule 13.02.2015    source источник


Ответы (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
comment
Не могли бы вы сказать мне, есть ли возможность установить анализ значений FramaC не для проверки правильности переполнения буфера, деления на 0 или других неявных утверждений? Так как я просто хочу знать значение переменных в конце. - person Trúc Nguyễn Lâm; 25.02.2015
comment
@TrúcNguyễnLâm Это невозможно. Анализ должен предполагать, что этого не происходит. Каково значение x после y = 0; x = 100 / y;? Каково значение z после int *p = 0; z = *p;? Эти ошибки должны быть отделены от реальных результатов. Но вы можете игнорировать сообщения и смотреть только на значения, если хотите. На самом деле, многие «производные анализы» делают это и дают результаты, применимые только к определенным исполнениям программы. Perl-скрипта должно быть достаточно, чтобы разделить их. - person Pascal Cuoq; 25.02.2015