53 lines
1.5 KiB
Rust
53 lines
1.5 KiB
Rust
#![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();
|
|
}
|