【发布时间】:2020-05-04 13:42:08
【问题描述】:
问题描述
我正在开发一个 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[]);
【问题讨论】:
标签: c frama-c program-slicing acsl