Several functions perform out-of-bounds memory accesses (which is UB) · Issue #559 · rust-lang/compiler-builtins (original) (raw)
I found this code which openly admits to doing OOB accesses:
// This will read (but won't use) bytes out of bound. |
---|
// cfg needed because not all targets will have atomic loads that can be lowered |
// (e.g. BPF, MSP430), or provided by an external library (e.g. RV32I) |
#[cfg(target_has_atomic_load_store = "ptr")] |
let mut prev_word = core::intrinsics::atomic_load_unordered(src_aligned); |
#[cfg(not(target_has_atomic_load_store = "ptr"))] |
let mut prev_word = core::ptr::read_volatile(src_aligned); |
This code also looks suspicious, e.g. if this is used to implement 2-byte atomic accesses then there is OOB here:
// Generic atomic read-modify-write operation |
---|
unsafe fn atomic_rmw<T, F: Fn(u32) -> u32, G: Fn(u32, u32) -> u32>(ptr: *mut T, f: F, g: G) -> u32 { |
let aligned_ptr = align_ptr(ptr); |
let (shift, mask) = get_shift_mask(ptr); |
loop { |
let curval_aligned = intrinsics::atomic_load_unordered(aligned_ptr); |
let curval = extract_aligned(curval_aligned, shift, mask); |
let newval = f(curval); |
let newval_aligned = insert_aligned(curval_aligned, newval, shift, mask); |
if __kuser_cmpxchg(curval_aligned, newval_aligned, aligned_ptr) { |
return g(curval, newval); |
} |
} |
} |
// Generic atomic compare-exchange operation |
unsafe fn atomic_cmpxchg<T>(ptr: *mut T, oldval: u32, newval: u32) -> u32 { |
let aligned_ptr = align_ptr(ptr); |
let (shift, mask) = get_shift_mask(ptr); |
loop { |
let curval_aligned = intrinsics::atomic_load_unordered(aligned_ptr); |
let curval = extract_aligned(curval_aligned, shift, mask); |
if curval != oldval { |
return curval; |
} |
let newval_aligned = insert_aligned(curval_aligned, newval, shift, mask); |
if __kuser_cmpxchg(curval_aligned, newval_aligned, aligned_ptr) { |
return oldval; |
} |
} |
} |
I haven't done a thorough audit so there might be more. I found these by grepping for atomic_load_unordered
.