Skip to content

Commit

Permalink
Test RefCell aliasing
Browse files Browse the repository at this point in the history
  • Loading branch information
cuviper committed May 13, 2022
1 parent 2b8041f commit 15d8c00
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 0 deletions.
14 changes: 14 additions & 0 deletions src/test/codegen/noalias-refcell.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
// compile-flags: -O -C no-prepopulate-passes -Z mutable-noalias=yes

#![crate_type = "lib"]

use std::cell::{Ref, RefCell, RefMut};

// Make sure that none of the arguments get a `noalias` attribute, because
// the `RefCell` might alias writes after either `Ref`/`RefMut` is dropped.

// CHECK-LABEL: @maybe_aliased(
// CHECK-NOT: noalias
// CHECK-SAME: %_refcell
#[no_mangle]
pub unsafe fn maybe_aliased(_: Ref<'_, i32>, _: RefMut<'_, i32>, _refcell: &RefCell<i32>) {}
36 changes: 36 additions & 0 deletions src/test/ui/issues/issue-63787.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
// run-pass
// compile-flags: -O

// Make sure that `Ref` and `RefMut` do not make false promises about aliasing,
// because once they drop, their reference/pointer can alias other writes.

// Adapted from comex's proof of concept:
// https://github.com/rust-lang/rust/issues/63787#issuecomment-523588164

use std::cell::RefCell;
use std::ops::Deref;

pub fn break_if_r_is_noalias(rc: &RefCell<i32>, r: impl Deref<Target = i32>) -> i32 {
let ptr1 = &*r as *const i32;
let a = *r;
drop(r);
*rc.borrow_mut() = 2;
let r2 = rc.borrow();
let ptr2 = &*r2 as *const i32;
if ptr2 != ptr1 {
panic!();
}
// If LLVM knows the pointers are the same, and if `r` was `noalias`,
// then it may replace this with `a + a`, ignoring the earlier write.
a + *r2
}

fn main() {
let mut rc = RefCell::new(1);
let res = break_if_r_is_noalias(&rc, rc.borrow());
assert_eq!(res, 3);

*rc.get_mut() = 1;
let res = break_if_r_is_noalias(&rc, rc.borrow_mut());
assert_eq!(res, 3);
}

0 comments on commit 15d8c00

Please sign in to comment.