Проблема в том, что по умолчанию, в Eva, malloc
может дать сбой .Чтобы избежать этого, выберите один из следующих вариантов:
- использовать параметр
-no-val-alloc-returns-null
, который предполагает, что malloc
никогда не завершится с ошибкой; - исправит код для добавления теста, например,
if (!p) exit(1);
Подробное объяснение
Тот факт, что после malloc
есть два возможных выполнения, не сразу виден в командной строке.GUI иногда помогает при проверке таких случаев, но мы также можем добавить вызов к Frama_C_show_each(p)
после вызова к malloc
:
char *p = malloc(2);
Frama_C_show_each_p(p);
...
Теперь, после запуска frama-c -val
, мы получаем следующую строку:
[value] mall.c:6: Frama_C_show_each_p: {{ NULL ; &__malloc_main_l5 }}
При анализе учитываются две различные возможности (malloc
не удалось и возвращено NULL
; или malloc
выполнено и возвращена новая база).
Аварийный сигналWarning: out of bounds write. assert \valid(p + 0);
относится к первому случаю, в котором свойство недействительно .Анализ останавливается для этой ветви, что усложняет наблюдение за тем, что произошло, поскольку после этого у нас есть одна ветвь, как мы и ожидали.