1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
|
#![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();
}
|