Fix C2PO witness invariant generation #1868
Draft
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Inspired by #1710 (comment), I wondered what invariants C2PO analysis even generates. Turns out, none! Which is surprising, because it does implement the
Invariantquery.I have no idea what's happening in the C2PO domain, but its pseudo-variable handling logic somehow even messes up normal program variables:
Var.to_varinfo (NormalVar var)returns something different fromvar. And that variable is such that the temp-ness and in-scope checks cause everything to be filtered out.I'm not sure why it does things the way it does and what should happen with non-
NormalVar.It then outputs some interesting invariants:
z == x + -1(which makes sense) and*x == *(z + 1)(which I guess is somehow derived from the former). The latter seems redundant.z != *x(where bothxandzare of typelong*). The comparison oflong*andlongis strange. But I'm also not sure if it's even true:zis just freshly allocated, so it's pointer value (cast tolong) may equal an arbitrary integer.