似乎这tc_expr
仅限于对类型上下文的了解,因此无法安全地“类型检查”需要了解堆状态的表达式,例如作为 while 循环条件的指针取消引用。为什么会这样,我是否有可能证明正确的循环,例如:
char *t = ...;
...
while (*t != 0)
{
...
t++;
}
我认为 while 循环可以有选择地通过一种变体来证明tc_expr
,它允许通过考虑堆上下文和键入上下文来取消引用指针。我怀疑这种想法是循环条件应该是一个“纯”表达式,但我最终很好奇这是否真的是一个必要的约束。
PS我意识到我可以将其重写为for循环。我的问题仍然存在,知道 VST 允许我证明这种循环,尽管语法不同。