Fix base Invariant query lval and offset handling #861
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.
In #855 (comment) an issue was revealed with base invariant dereferenced pointer offsets. The behavior of appending offsets to lvals as they're traversed was added in #819, but due to messy lval and offset handling in this code, I believe I did it incorrectly at the time.
Behavior before #819
s.f(field on a struct) started from variablestraversing to.fand starting from lvals. The field was not appended to lval, so field invariant was incorrectly abouts.p = &s.fstarted dereferencing from variablestraversing to.fand starting from lval*p. The field was not appended to lval, so dereferenced invariant was correctly abouts.f.Current behavior after #819
s.f(field on a struct) started from variablestraversing to.fand starting from lvals. The field was appended to lval, so field invariant was correctly abouts.f.p = &s.fstarted dereferencing from variablestraversing to.fand starting from lval*p. The field was appended to lval, so dereferenced invariant was incorrectly abouts.f.f, which is non-existent.Behavior after this PR
s.f(field on a struct) starts from variablestraversing to.fand starting from lvals.f(note change). The field is not appended to lval, so field invariant is correctly abouts.f.p = &s.fstarts dereferencing from variablestraversing to.fand starting from lval*p. The field is not appended to lval, so dereferenced invariant is correctly abouts.f.In conclusion, the fix is to revert back to not appending offsets to lvals when traversing them for the invariant, so dereferenced invariants are correct. But to fix queries for specific lvals, the key is to start with the precise lval (and not append offsets) instead of starting with just the variable (and appending offsets).
The situation should be analogous with unions.