diff options
Diffstat (limited to 'tests')
-rw-r--r-- | tests/ui/no_uaf_2.rs | 33 | ||||
-rw-r--r-- | tests/ui/no_uaf_2.stderr | 10 |
2 files changed, 43 insertions, 0 deletions
diff --git a/tests/ui/no_uaf_2.rs b/tests/ui/no_uaf_2.rs new file mode 100644 index 0000000..eb6b7d3 --- /dev/null +++ b/tests/ui/no_uaf_2.rs @@ -0,0 +1,33 @@ +// by steffahn + +#![feature(pin_macro)] + +use std::cell::Cell; +use std::pin::pin; + +use selfref::opaque; +use selfref::{new_with_closure, Holder}; + +struct MyStruct<'this> { + cell: Cell<&'this str>, +} + +struct MyStructKey; + +opaque! { + impl Opaque for MyStructKey { + type Kind<'this> = MyStruct<'this>; + } +} + +fn main() { + let s = + Holder::<'_, MyStructKey>::new_with(new_with_closure::<MyStructKey, _>(|[]| MyStruct { + cell: Default::default(), + })); + let s = pin!(s); + s.as_ref().operate_in(|r| { + r.cell.set(&String::from("hello world")); // temporary dropped at end of this statement + println!("{}", r.cell.get()) // accesses dropped `String` data + }); +} diff --git a/tests/ui/no_uaf_2.stderr b/tests/ui/no_uaf_2.stderr new file mode 100644 index 0000000..5737a38 --- /dev/null +++ b/tests/ui/no_uaf_2.stderr @@ -0,0 +1,10 @@ +error[E0716]: temporary value dropped while borrowed + --> tests/ui/no_uaf_2.rs:30:21 + | +29 | s.as_ref().operate_in(|r| { + | - has type `OperateIn<'1, MyStructKey>` +30 | r.cell.set(&String::from("hello world")); // temporary dropped at end of this statement + | ------------^^^^^^^^^^^^^^^^^^^^^^^^^^^-- temporary value is freed at the end of this statement + | | | + | | creates a temporary value which is freed while still in use + | argument requires that borrow lasts for `'1` |