Closed
Description
Fuzzer generated code:
#![feature(const_hash)]
extern crate core;
use core::ptr;
use std::collections::hash_map::DefaultHasher;
use std::hash::{Hash, Hasher};
static mut H: DefaultHasher = DefaultHasher::new();
pub fn fn10() {
let mut _11 = 0;
let mut _29 = 0;
let p = core::ptr::addr_of_mut!(_29);
unsafe { fn14(_11, p) };
}
pub unsafe fn fn14(mut _2: isize, mut _3: *mut isize) {
let r = core::ptr::addr_of_mut!(_2);
*r = fn15(r, _3);
fn18();
}
pub unsafe fn fn15(mut _2: *mut isize, mut _3: *mut isize) -> isize {
let mut _4: *mut isize = ptr::null_mut();
let mut _7: *mut *mut isize = ptr::null_mut();
let mut _13: *mut isize = ptr::null_mut();
let mut _16: *mut isize = ptr::null_mut();
let mut _9: ((bool, i128), (f32, i128), [u128; 8], u32) = ((false, 0), (0., 0), [0; 8], 0);
_4 = core::ptr::addr_of_mut!((*_3));
fn16();
'bb1: loop {
let ret = *_4;
_7 = core::ptr::addr_of_mut!(_2);
_9.3 = 3178558635_u32 % 2879763616_u32;
_9.0 = (false, 1);
'bb3: loop {
(*_7) = core::ptr::addr_of_mut!((*_2));
_16 = core::ptr::addr_of_mut!((*_2));
match _9.0 .1 {
0 => continue 'bb1,
1 => 'bb5: loop {
_4 = _2;
_9.2 = [279331277471898888451578203748788445758_u128; 8];
_7 = core::ptr::addr_of_mut!(_13);
loop {
_9.1 = (0., 2);
(*_16) = f64::NEG_INFINITY as isize;
match _9.1 .1 {
0 => continue 'bb5,
2 => {
_16 = core::ptr::addr_of_mut!((*_4));
match _9.3 {
0 => continue 'bb5,
_ => return ret,
}
}
_ => continue 'bb3,
}
}
},
_ => continue 'bb3,
}
}
}
}
pub fn fn16() {
let mut _23 = [1849_i16; 7];
_23[2] = 13917_i16;
let _32 = _23;
unsafe {
0.hash(&mut H);
_32.hash(&mut H);
}
}
pub fn fn18() {
let mut _8: [i16; 8] = [0; 8];
let _5 = -10_i128;
let _9 = [(-1414_i16); 7];
unsafe {
_9[0].hash(&mut H);
_8.hash(&mut H);
1_i128.hash(&mut H);
}
}
pub fn main() {
fn10();
unsafe {
println!("hash: {}", H.finish());
}
}
This should output 15917201677548574216
: https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=a51ce49127180037639732b4a990ddbe.
But on -Zmir-opt-level=0 -Copt-level>=1
it prints something different. -Zmir-opt-level>=1
masks the bug.
% rustc -Zmir-opt-level=0 -Copt-level=0 repro.rs && ./repro
hash: 15917201677548574216
% rustc -Zmir-opt-level=0 -Copt-level=1 repro.rs && ./repro
hash: 2617855399195014552
This is only reproducible on aarch64-apple-darwin
, but not on x86_64-apple-darwin
or aarch64-unknown-linux-gnu
. The reproducer is very sensitive to small changes. For instance, changing the length of _23
in fn16
to 8
prevents the bug. For these reasons I suspect it's an Apple Silicon specific calling convention bug leading to some stack corruption.
Metadata
Metadata
Assignees
Labels
Area: Code generation parts specific to LLVM. Both correctness bugs and optimization-related issues.Category: This is a bug.Issue: A soundness hole (worst kind of bug), see: https://en.wikipedia.org/wiki/SoundnessArmv8-A or later processors in AArch64 modeOperating system: macOSHigh priorityRelevant to the compiler team, which will review and decide on the PR/issue.Working group: LLVM backend code generationIssue expected to be fixed by the next major LLVM upgrade, or backported fixes