C VST型双关

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检查我们是否试图

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检查我们是否试图从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))