C VST型双关
ISO 99标准支持所谓的“类型双关”。下面是一个小例子:C VST型双关,c,coq,formal-verification,verifiable-c,C,Coq,Formal Verification,Verifiable C,ISO 99标准支持所谓的“类型双关”。下面是一个小例子: char *f(const char *x) { union { const char *x; char *y; } t; t.x = x; return t.y; } 如您所见,这里我们使用union type通过访问第二个字段(使用相同的类型但不使用const)来摆脱const修饰符 VST: 如果您运行这个coq代码,您将到达无法验证的目标(在注释中提到),在这个目标中,VST检查我们是否试图
char *f(const char *x) {
union {
const char *x;
char *y;
} t;
t.x = x;
return t.y;
}
如您所见,这里我们使用union type通过访问第二个字段(使用相同的类型但不使用const
)来摆脱const
修饰符
VST:
如果您运行这个coq代码,您将到达无法验证的目标(在注释中提到),在这个目标中,VST检查我们是否试图从union获取初始化字段。情况如下:
ENTAIL Delta,
PROP ( )
LOCAL (lvar _t (Tunion __136 noattr) v_t; temp _x x)
SEP (data_at Tsh (Tunion __136 noattr) (inl x) v_t; data_at_ Tsh (tptr tschar) x)
|-- local (liftx (tc_val (tptr tschar) Vundef))
通过蕴涵者将其转换为False
代码>战术
因此,问题是:
1) 为什么VST将并集表示为不相交和
2) VST是否不支持此功能(类型双关)
3) 除了编辑C代码之外,这个问题还有其他解决办法吗
ENTAIL Delta,
PROP ( )
LOCAL (lvar _t (Tunion __136 noattr) v_t; temp _x x)
SEP (data_at Tsh (Tunion __136 noattr) (inl x) v_t; data_at_ Tsh (tptr tschar) x)
|-- local (liftx (tc_val (tptr tschar) Vundef))