blob: b376582a8867740183b53671a81980a521286149 [file] [log] [blame]
#![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();
}