blob: b376582a8867740183b53671a81980a521286149 (
plain)
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();
}
|