为什么 while 循环基于类型检查 (w/ tc_expr) 条件表达式?

Why are while loops predicated on typechecking (w/ tc_expr) the condition expression?

似乎 tc_expr 仅限于输入上下文的知识,没有别的,所以不可能安全地 "typecheck" 一个需要堆状态知识的表达式,例如指针取消引用作为 while 循环的条件。为什么会这样,我是否有可能证明一个循环是正确的,例如:

char *t = ...;
...
while (*t != 0)
{
    ...
    t++;
}

我认为 while 循环可以选择性地用 tc_expr 的变体来证明,它确实允许通过考虑堆上下文和类型上下文来取消引用指针。我怀疑这个想法是循环条件应该是一个“纯”表达式,但我最终很好奇这是否真的是一个必要的约束。

P.S。我意识到我可以将其重写为 for 循环。我的问题仍然存在,因为我知道 VST 允许我证明这种循环,尽管语法不同。

第 1 个答案: 这是一个设计决策,无论是哪种方式,我们发现如果表达式,很多事情会更简单(并且更符合分离逻辑的精神)不访问内存。

第 2 个答案:可以按原样编写此 while 循环。然后使用带有 -normalize 标志的 clightgen(无论如何你应该总是使用它),然后你就可以验证它了。然而,在这种情况下,循环形式将不是(严格来说)Clight "while" 循环,它会在循环体中间有它的循环测试(if (?) then /*skip*/; else break;);所以你将使用 forward_loop 来证明它,而不是 forward_while.