问题描述
我正在开发一个 frama-c 插件,它使用切片插件作为库来删除自动生成的代码中未使用的位。不幸的是,切片插件丢弃了一堆实际使用的堆栈值。只要它们的地址包含在传递给抽象外部功能的结构中,就可以使用它们。
简单的例子
这是一个更简单的示例,它模拟了我拥有的相同的一般结构。
/* Abstract external function */
void some_function(int* ints[]);
int main() {
int i;
int *p = &i;
int *a[] = { &p };
some_function(a);
return 0;
}
frama-c-gui -slice-calls some_function experiment_slicing.c
当使用(我还没有弄清楚在没有 gui 的情况下调用命令行时如何查看切片输出)对这个示例进行切片时,它会删除除声明int *a[];
和对some_function
.
尝试修复
我尝试通过添加 ACSL 注释来修复它。但是,我认为合理的规范(见下文)不起作用
/*@ requires \valid(ints) && \valid(ints[0]);
*/
void some_function(int* ints[]);
然后我尝试了一个具有所需行为的分配(见下文)。然而,这不是一个正确的规范,因为该函数实际上从未写入指针,而是需要读取它以获得正确的功能。我担心如果我继续使用这种不正确的规范,它会导致奇怪的问题。
/*@ requires \valid(ints) && \valid(ints[0]);
assigns *ints;
*/
void some_function(int* ints[]);