Мне дан этот код C (детали кода, включая возможные ошибки, не очень важны):
int read_leb128(char **ptr, char *end) {
int r = 0;
int s = 0;
char b;
do {
if ((intptr_t)*ptr >= (intptr_t)end) (exit(1));
b = *(*ptr)++;
r += (b & (char)0x7f) << s;
s += 7;
} while (b & (char)0x80);
return r;
}
и я хочу использовать некоторые формальные методы, чтобы исключить опасные ошибки.
В частности, я хотел бы убедиться, что эта функция не изменяет никаких значений, кроме *ptr
, и только считывает память с *ptr
по end
(не включительно).
Похоже, что Frama-C — хороший фреймворк для такой проверки, поэтому я начал добавлять аннотации. :
/*@
requires \valid(ptr);
requires \valid_read((*ptr) + (0 .. (end-*ptr)));
assigns *ptr;
*/
Похоже, что подключаемый модуль Frama-C, проверяющий недействительный доступ к памяти, называется Eva, но его запуск в этих файлах по-прежнему печатает:
[eva:alarm] foo.c:33: Warning:
out of bounds read. assert \valid_read(tmp);
(tmp from *ptr++)
Я просто ожидаю слишком многого от инструмента, или Frama-C может это проверить?
Это Фрама-С 19.0 (Калий).