Frama-C生成关于指针比较的令人困惑的断言

时间:2017-05-18 20:14:23

标签: frama-c

我得到的断言对我来说没有意义。

代码:

$('#datetimepicker1').disable()

Frama-C输出:

struct s {
    int pred;
};

/*@ assigns \result \from \nothing;
    ensures \valid(\result);
*/
struct s *get(void);

int main(void)
{
    return !get()->pred;
}

我做错了什么或者它是Frama-C中的错误?

1 个答案:

答案 0 :(得分:3)

这不是一个真正的错误,虽然这种行为也不是真的令人满意。我建议您在GUI(frama-c-gui -val frama-ptr.c)中观察分析,特别是 Values 标签中第12行的tmp->pred值。

Value before:
 ∈
{{ garbled mix of &{alloced_return_get}
 (origin: Library function {c/ptrcmp.c:12}) }}

这是一个非常不精确的值,因为函数get的返回值是指针而生成。 Eva插件生成虚拟变量(alloced_return_get),并使用虚拟内容(garbled mix of &{alloced_return_get})填充它。即使字段pred是整数,分析器也假定(不精确)指针也可以存在。这就是发出指针比较警报的原因。

至少有两种方法可以避免这种情况:

  • 使用选项-val-warn-undefined-pointer-comparison pointer,以便仅在涉及带指针类型的左值的比较中发出指针比较警报。但是,字段pred的内容仍然不准确。

  • get添加适当的正文,可能使用malloc编写,以便字段pred获得更准确的值。

更一般地说,Eva / Value插件需要精确的功能规格,没有机身;见手册第7.2节。对于返回指针的函数,您无法编写令人满意的规范:您需要编写allocates子句,而这些子句当前不是由Eva / Value处理的。因此,我建议你为get写一个正文。