Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add unchecked/SIMD bitshift checks and disable CBMC flag #2630

Merged
merged 8 commits into from
Jul 31, 2023

Conversation

reisnera
Copy link
Contributor

Description of changes:

The CBMB flag --undefined-shift-check is too strict. In particular, it flags shifting a negative value as being incorrect, which is not the case for Rust where shifts are valid unless the shift distance is negative or larger than the bit width of the value being shifted.

This PR disables the CBMC flag and adds checks to Kani both for the unchecked shift BinOps as well as SIMD shift intrinsics.

Resolved issues:

Resolves #2374 - shifting a negative value now works.
Resolves #1963 - SIMD shifts now have the same checks as non-SIMD-shifts, namely that the shift distance is not negative or larger than the bit width of the value being shifted.

Related RFC:

n/a

Call-outs:

The changes in intrinsic.rs could probably be more DRY but I'm not sure it's worth it.

Testing:

  • How is this change tested?
    I believe existing tests cover this PR.

  • Is this a refactor change?
    No

Checklist

  • Each commit message has a non-empty body, explaining why the change was made
  • Methods or procedures are documented
  • Regression or unit tests are included, or existing tests cover the modified code
  • My PR is restricted to a single feature or bugfix

By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 and MIT licenses.

Checks are now implemented in Kani
Remove tests for shifting a negative value as that is not UB in rust.
@reisnera reisnera requested a review from a team as a code owner July 27, 2023 19:28
Copy link
Contributor

@celinval celinval left a comment

Choose a reason for hiding this comment

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

It looks pretty good. Can you please add a test to ensure that CBMC does the expected thing for shift with negative values?

Something like:

#[kani::proof]
#[kani::unwind(32)]
fn check_shl() {
    let val : i32 = kani::any();
    let dist = kani::any_where(|d: &u8| *d < 32); 
    assert_eq!(val << dist, val.wrapping_mul(2_i32.wrapping_pow(dist.into())));
}

you might also want to add a modified version of the test you created in the issue description.

reisnera and others added 2 commits July 27, 2023 19:50
@reisnera
Copy link
Contributor Author

Will work on adding the tests when I can! Also, my clock somehow got out of sync so I apologize about any incorrect date/timestamps on these commits.

@celinval celinval added the Z-BenchCI Tag a PR to run benchmark CI label Jul 28, 2023
@reisnera reisnera requested a review from celinval July 29, 2023 03:36
Copy link
Contributor

@celinval celinval left a comment

Choose a reason for hiding this comment

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

Thanks

Copy link
Contributor

@adpaco-aws adpaco-aws left a comment

Choose a reason for hiding this comment

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

Thank you, @reisnera !

my clock somehow got out of sync so I apologize about any incorrect date/timestamps on these commits.

No worries, we use the "squash and merge" option for PRs.

@adpaco-aws adpaco-aws enabled auto-merge (squash) July 31, 2023 21:29
@adpaco-aws adpaco-aws merged commit 7fc9fa7 into model-checking:main Jul 31, 2023
12 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Z-BenchCI Tag a PR to run benchmark CI
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Unexpected failed check for negative left shift operand simd_shl and simd_shr don't check overflow cases
3 participants