Consistently use LLVM lifetime markers during codegen
Ensure that inliner inserts lifetime markers if they have been emitted during codegen. Otherwise if allocas from inlined functions are merged together, lifetime markers from one function might invalidate load & stores performed by the other one.
This commit is contained in:
parent
23ffeea307
commit
bbb63d4554
7 changed files with 50 additions and 13 deletions
31
src/test/ui/sanitize/issue-72154-lifetime-markers.rs
Normal file
31
src/test/ui/sanitize/issue-72154-lifetime-markers.rs
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
// Regression test for issue 72154, where the use of AddressSanitizer enabled
|
||||
// emission of lifetime markers during codegen, while at the same time asking
|
||||
// always inliner pass not to insert them. This eventually lead to a
|
||||
// miscompilation which was subsequently detected by AddressSanitizer as UB.
|
||||
//
|
||||
// needs-sanitizer-support
|
||||
// only-x86_64
|
||||
//
|
||||
// compile-flags: -Copt-level=0 -Zsanitizer=address
|
||||
// run-pass
|
||||
|
||||
pub struct Wrap {
|
||||
pub t: [usize; 1]
|
||||
}
|
||||
|
||||
impl Wrap {
|
||||
#[inline(always)]
|
||||
pub fn new(t: [usize; 1]) -> Self {
|
||||
Wrap { t }
|
||||
}
|
||||
}
|
||||
|
||||
#[inline(always)]
|
||||
pub fn assume_init() -> [usize; 1] {
|
||||
[1234]
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let x: [usize; 1] = assume_init();
|
||||
Wrap::new(x);
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue