diff options
Diffstat (limited to 'tests/ui/no_uaf_2.rs')
-rw-r--r-- | tests/ui/no_uaf_2.rs | 33 |
1 files changed, 33 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 + }); +} |