Repository navigation
Incremental SMT2: fix shift extension for mismatched widths - #9283
Open
tautschnig wants to merge 1 commit into
Open
tautschnig wants to merge 1 commit into
tautschnig wants to merge 1 commit into
Conversation
tautschnig
requested review from
TGWDB,
kroening and
peterschrammel
as code owners
October 28, 2026 11:05
There was a problem hiding this comment.
Copilot was unable to review this pull request because the user who requested the review has insufficient remaining quota.
An organization owner can choose the repository organization as the billing source for reviews requested by members with a paid Copilot license. Learn about Copilot code review billing. Review the Copilot code review billing settings.
When the shift operand and distance have different bit widths, the incremental SMT2 backend extended them according to their type signedness (extension_for_type). This is wrong for shifts: the shift kind determines how the operand should be extended, and the distance is always treated as unsigned. Specifically: - lshr of a signed operand was sign-extended (wrong: should zero-extend to avoid shifting sign bits into the result); - ashr of an unsigned operand was zero-extended (wrong: should sign-extend to shift copies of the MSB into the result); - A signed distance was sign-extended (wrong: shift distances are unsigned in the CBMC IR, per the SAT backend semantics). Fix: always zero-extend the distance; extend the operand according to the shift kind (sign-extend for ashr, zero-extend for lshr and shl). The C front end only produces lshr for unsigned and ashr for signed operands, so the default configuration is not affected. The bug affects producers of GOTO programs that create shift expressions with the "opposite" combination (e.g. lshr of a signed value). Related to diffblue#9177/PR diffblue#9178 which fixes the same class of bug in the non-incremental SMT2 backend. Reported by Jeroen Robben (https://reports.robben.io/methodology/). Fixes diffblue#9362 Co-authored-by: Kiro <kiro-agent@users.noreply.github.com>
tautschnig
force-pushed
the
kiro/rr-2-32-incr-smt2-shift-width
branch
from
October 28, 2026 11:39
07ced79 to
0fa58a0
Compare
Collaborator
|
Same comment as in the other shift PR. |
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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.
When the shift operand and distance have different bit widths, the
incremental SMT2 backend extended them according to their type
signedness (extension_for_type). This is wrong for shifts: the shift
kind determines how the operand should be extended, and the distance
is always treated as unsigned.
Specifically:
to avoid shifting sign bits into the result);
sign-extend to shift copies of the MSB into the result);
unsigned in the CBMC IR, per the SAT backend semantics).
Fix: always zero-extend the distance; extend the operand according to
the shift kind (sign-extend for ashr, zero-extend for lshr and shl).
The C front end only produces lshr for unsigned and ashr for signed
operands, so the default configuration is not affected. The bug affects
producers of GOTO programs that create shift expressions with the
"opposite" combination (e.g. lshr of a signed value).
Related to #9177/PR #9178 which fixes the same class of bug in the
non-incremental SMT2 backend.
Fixes #9362
Found by Jeroen Robben's specification-conformance pipeline (https://reports.robben.io/methodology/).