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

overflowing left shift can lead to pseudo-byte with hidden bits #23551

Closed
pnkfelix opened this issue Mar 20, 2015 · 4 comments
Closed

overflowing left shift can lead to pseudo-byte with hidden bits #23551

pnkfelix opened this issue Mar 20, 2015 · 4 comments

Comments

@pnkfelix
Copy link
Member

Here is some strange code uncovered by a test I wrote for #23536:

fn id<T>(x: T) -> T { x }

fn main() {
    let spot: Option<i8>;
    let x = 1_i8 << id(8_i8);
    spot = Some(x);
    assert_eq!(spot.unwrap(), 0);
    println!("so we stored a zero byte ... but:");
    assert_eq!(x, 0);
}

Even in the playpen, this prints:

so we stored a zero byte ... but:
thread '<main>' panicked at 'assertion failed: `(left == right) && (right == left)` (left: `0`, right: `0`)', <anon>:9
playpen: application terminated with error code 101

Note those "crazy, non-matching" left and right values.

(Presumably something with LLVM's low-level code is leaving x in a register, thus yielding hidden high-order bits after the shift is done; those need to be masked away before we attempt to compare with another register.)

@pnkfelix
Copy link
Member Author

Ah, this may be hitting an Undefined Behavior scenario in LLVM ... in particular, doing this instead:

    let x = 2_i8 << id(7_i8);

does not seem to yield the same bug.

@pnkfelix
Copy link
Member Author

okay so this is probably a duplicate of #10183. It is just surprising because it implies that the limit on shift operations is not just 32 or 64 bits, but in fact can be as little as 8 bits (i.e. for an i8/u8).

@pnkfelix
Copy link
Member Author

closing as duplicate as #10183

@nikomatsakis
Copy link
Contributor

@pnkfelix indeed the limit is the number of bits in the value being shifted, and I agree this is a dup

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

No branches or pull requests

2 participants