Skip to content

Incremental SMT2: fix shift extension for mismatched widths - #9283

Open
tautschnig wants to merge 1 commit into
diffblue:developfrom
tautschnig:kiro/rr-2-32-incr-smt2-shift-width
Open

tautschnig wants to merge 1 commit into
diffblue:developfrom
tautschnig:kiro/rr-2-32-incr-smt2-shift-width

Conversation

@tautschnig

@tautschnig tautschnig commented Oct 28, 2026 •

Copy link
Copy Markdown
Collaborator

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 #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/).

  • Each commit message has a non-empty body, explaining why the change was made.
  • Methods or procedures I have added are documented, following the guidelines provided in CODING_STANDARD.md.
  • n/a The feature or user visible behaviour I have added or modified has been documented in the User Guide in doc/cprover-manual/
  • Regression or unit tests are included, or existing tests cover the modified code (in this case I have detailed which ones those are in the commit message).
  • n/a My commit message includes data points confirming performance improvements (if claimed).
  • My PR is restricted to a single feature or bugfix.
  • n/a White-space or formatting changes outside the feature-related changed lines are in commits of their own.

Copilot AI balanced review requested due to automatic review settings October 28, 2026 11:05

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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
tautschnig force-pushed the kiro/rr-2-32-incr-smt2-shift-width branch from 07ced79 to 0fa58a0 Compare October 28, 2026 11:39
@kroening

Copy link
Copy Markdown
Collaborator

Same comment as in the other shift PR.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Incremental SMT2 backend extends shift operands by type signedness instead of shift kind when widths differ

3 participants