我想知道Frama-C是否实现了与指针相关的某种类型检查。例如,请考虑以下事项:
int x[10];
void * v = x;
//@ assert isOfTypeInt(x, 10)
//@ assert isOfTypeInt(v, 10)
在精神上有什么类似的东西吗?
查看ACSL手册,有很多方法可以检查内存和指针的使用(其中一部分是在Frama-C Oxygen中实现的)。我没有找到任何一般支持来处理类型信息。我们可以使用frama-c插件吗?
谢谢, 爱德华
答案 0 :(得分:2)
在ACSL中确实没有这样的东西。事实上,C中的内存位置实际上并没有与它们相关的类型信息:如果我们忽略了潜在的对齐约束,则任何4字节的块都可以用来存储32位整数。
也就是说,Frama-C是一个可扩展的平台,它总是可以编写一个插件来满足特定需求。对于示例中的x
等纯变量,可以在AST中相应vtype
的{{1}}字段中直接访问声明的类型。对于指针,例如varinfo
,应该可以利用Value的结果来查看它们可能指向的位置并使用它来获取适当的类型信息(主要问题是决定当Value不精确时应该做什么,以及给出了几个不同类型的潜在位置。