#![deny(dangling_pointers_from_temporaries)] use std::ffi::{c_char, CString}; fn cstring() -> CString { CString::new("hello").unwrap() } fn consume(ptr: *const c_char) { let c = unsafe { ptr.read() }; dbg!(c); } // None of these should trigger the lint. fn ok() { consume(cstring().as_ptr()); consume({ cstring() }.as_ptr()); consume({ cstring().as_ptr() }); consume(cstring().as_ptr().cast()); consume({ cstring() }.as_ptr().cast()); consume({ cstring().as_ptr() }.cast()); } // All of these should trigger the lint. fn not_ok() { { let ptr = cstring().as_ptr(); //~^ ERROR a dangling pointer will be produced because the temporary `CString` will be dropped consume(ptr); } consume({ let ptr = cstring().as_ptr(); //~^ ERROR a dangling pointer will be produced because the temporary `CString` will be dropped ptr }); consume({ let s = cstring(); s.as_ptr() //^ FIXME: should error }); let _ptr: *const u8 = cstring().as_ptr().cast(); //~^ ERROR a dangling pointer will be produced because the temporary `CString` will be dropped let _ptr: *const u8 = { cstring() }.as_ptr().cast(); //~^ ERROR a dangling pointer will be produced because the temporary `CString` will be dropped let _ptr: *const u8 = { cstring().as_ptr() }.cast(); //~^ ERROR a dangling pointer will be produced because the temporary `CString` will be dropped } fn main() { ok(); not_ok(); }