Coq VST 内部结构复制

Yar*_*ick 2 c formal-verification coq verifiable-c

Coq 8.10.1 的 VST(验证软件工具链)2.5v 库遇到问题:

VST 的最新工作提交出现错误,即“不支持内部结构复制”。最小的例子:

struct foo {unsigned int a;};
struct foo f() {
struct foo q;
return q; }
Run Code Online (Sandbox Code Playgroud)

启动证明时出现错误:

错误:策略失败:表达式 (_q)%expr 包含内部结构复制,这是可验证 C(级别 97)当前不支持的 C 功能。

这是由于floyd/forward.vcheck_normalized中的:

Fixpoint check_norm_expr (e: expr) : diagnose_expr :=
match e with
| Evar _ ty => diagnose_this_expr (access_mode ty) e
...
Run Code Online (Sandbox Code Playgroud)

所以,问题是:

1) 存在哪些建议的解决方法?

2)这个限制的原因是什么?

3) 从哪里可以获得不支持的功能列表?

小智 5

1) 解决方法是将 C 程序更改为逐字段复制。

2) 原因是 C 结构复制的极其复杂且依赖于目标 ISA 的实现/语义,尤其是在参数传递和函数返回方面。

3)参考手册第 4 章(“可验证的 C 和 clightgen”)的前 10 行列出了不支持的功能的简短列表,但不幸的是,struct-by-copy 并不在该列表中。这是一个错误。