我得到的断言对我来说没有意义。
代码:
$('#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中的错误?
答案 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
写一个正文。