我正在尝试使用 Frama-C 来验证包括动态内存分配的 C 代码的安全属性。当前版本的 ACSL 规范语言 (1.8) 似乎能够表达很多关于动态分配内存的内容。然而,大部分这些东西还没有在 Frama-C Neon 中实现。
假设我们采用以下代码片段:
#include <stdlib.h>
/*@ requires \valid(p) && \valid(q) && \separated(p, q);
@ ensures \valid(q);
@*/
void test(char *p, char *q) {
free(p);
}
int main(void) {
char *p = (char *) malloc(10);
char *q = (char *) malloc(10);
test(p, q);
return 0;
}
因此,main 分配了两个内存块,并将指向它们的指针传递给函数测试。测试释放 p 指向的块,但不释放 q 指向的块。假设我想证明在测试结束时,指针 q 仍然有效。我将如何进行?
看来我必须自己建模堆:公理化一些谈论堆的谓词,并使用它们来指定 malloc 和 free,模仿 ACSL 的未实现部分。最简单的方法是什么,以便我可以验证上面的示例?