New lint: dangling_pointers_from_temporaries
This commit is contained in:
parent
81d6652e74
commit
c69894eaec
33 changed files with 1093 additions and 128 deletions
|
|
@ -17,8 +17,11 @@ fn main() {
|
|||
|
||||
// The exact addresses returned by these library functions are not necessarily stable guarantees
|
||||
// but for now we assert that we're still matching.
|
||||
assert_eq!(<Vec<i32>>::new().as_ptr(), <&[i32]>::default().as_ptr());
|
||||
assert_eq!(<Box<[i32]>>::default().as_ptr(), (&[]).as_ptr());
|
||||
#[allow(dangling_pointers_from_temporaries)]
|
||||
{
|
||||
assert_eq!(<Vec<i32>>::new().as_ptr(), <&[i32]>::default().as_ptr());
|
||||
assert_eq!(<Box<[i32]>>::default().as_ptr(), (&[]).as_ptr());
|
||||
};
|
||||
|
||||
// statics must have a unique address (see https://github.com/rust-lang/rust/issues/18297, not
|
||||
// clear whether this is a stable guarantee)
|
||||
|
|
|
|||
23
tests/ui/lint/dangling-pointers-from-temporaries/allow.rs
Normal file
23
tests/ui/lint/dangling-pointers-from-temporaries/allow.rs
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
#![allow(dangling_pointers_from_temporaries)]
|
||||
|
||||
fn main() {
|
||||
dbg!(String::new().as_ptr());
|
||||
// ^ no error
|
||||
|
||||
#[deny(dangling_pointers_from_temporaries)]
|
||||
{
|
||||
dbg!(String::new().as_ptr());
|
||||
//~^ ERROR a dangling pointer will be produced because the temporary `String` will be dropped
|
||||
}
|
||||
S.foo()
|
||||
}
|
||||
|
||||
struct S;
|
||||
|
||||
impl S {
|
||||
#[warn(dangling_pointers_from_temporaries)]
|
||||
fn foo(self) {
|
||||
dbg!(String::new().as_ptr());
|
||||
//~^ WARNING a dangling pointer will be produced because the temporary `String` will be dropped
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,34 @@
|
|||
error: a dangling pointer will be produced because the temporary `String` will be dropped
|
||||
--> $DIR/allow.rs:9:28
|
||||
|
|
||||
LL | dbg!(String::new().as_ptr());
|
||||
| ------------- ^^^^^^ this pointer will immediately be invalid
|
||||
| |
|
||||
| this `String` is deallocated at the end of the statement, bind it to a variable to extend its lifetime
|
||||
|
|
||||
= note: pointers do not have a lifetime; when calling `as_ptr` the `String` will be deallocated at the end of the statement because nothing is referencing it as far as the type system is concerned
|
||||
= help: for more information, see <https://doc.rust-lang.org/reference/destructors.html>
|
||||
note: the lint level is defined here
|
||||
--> $DIR/allow.rs:7:12
|
||||
|
|
||||
LL | #[deny(dangling_pointers_from_temporaries)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
warning: a dangling pointer will be produced because the temporary `String` will be dropped
|
||||
--> $DIR/allow.rs:20:28
|
||||
|
|
||||
LL | dbg!(String::new().as_ptr());
|
||||
| ------------- ^^^^^^ this pointer will immediately be invalid
|
||||
| |
|
||||
| this `String` is deallocated at the end of the statement, bind it to a variable to extend its lifetime
|
||||
|
|
||||
= note: pointers do not have a lifetime; when calling `as_ptr` the `String` will be deallocated at the end of the statement because nothing is referencing it as far as the type system is concerned
|
||||
= help: for more information, see <https://doc.rust-lang.org/reference/destructors.html>
|
||||
note: the lint level is defined here
|
||||
--> $DIR/allow.rs:18:12
|
||||
|
|
||||
LL | #[warn(dangling_pointers_from_temporaries)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: aborting due to 1 previous error; 1 warning emitted
|
||||
|
||||
52
tests/ui/lint/dangling-pointers-from-temporaries/calls.rs
Normal file
52
tests/ui/lint/dangling-pointers-from-temporaries/calls.rs
Normal file
|
|
@ -0,0 +1,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();
|
||||
}
|
||||
|
|
@ -0,0 +1,62 @@
|
|||
error: a dangling pointer will be produced because the temporary `CString` will be dropped
|
||||
--> $DIR/calls.rs:27:29
|
||||
|
|
||||
LL | let ptr = cstring().as_ptr();
|
||||
| --------- ^^^^^^ this pointer will immediately be invalid
|
||||
| |
|
||||
| this `CString` is deallocated at the end of the statement, bind it to a variable to extend its lifetime
|
||||
|
|
||||
= note: pointers do not have a lifetime; when calling `as_ptr` the `CString` will be deallocated at the end of the statement because nothing is referencing it as far as the type system is concerned
|
||||
= help: for more information, see <https://doc.rust-lang.org/reference/destructors.html>
|
||||
note: the lint level is defined here
|
||||
--> $DIR/calls.rs:1:9
|
||||
|
|
||||
LL | #![deny(dangling_pointers_from_temporaries)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: a dangling pointer will be produced because the temporary `CString` will be dropped
|
||||
--> $DIR/calls.rs:32:29
|
||||
|
|
||||
LL | let ptr = cstring().as_ptr();
|
||||
| --------- ^^^^^^ this pointer will immediately be invalid
|
||||
| |
|
||||
| this `CString` is deallocated at the end of the statement, bind it to a variable to extend its lifetime
|
||||
|
|
||||
= note: pointers do not have a lifetime; when calling `as_ptr` the `CString` will be deallocated at the end of the statement because nothing is referencing it as far as the type system is concerned
|
||||
= help: for more information, see <https://doc.rust-lang.org/reference/destructors.html>
|
||||
|
||||
error: a dangling pointer will be produced because the temporary `CString` will be dropped
|
||||
--> $DIR/calls.rs:41:37
|
||||
|
|
||||
LL | let _ptr: *const u8 = cstring().as_ptr().cast();
|
||||
| --------- ^^^^^^ this pointer will immediately be invalid
|
||||
| |
|
||||
| this `CString` is deallocated at the end of the statement, bind it to a variable to extend its lifetime
|
||||
|
|
||||
= note: pointers do not have a lifetime; when calling `as_ptr` the `CString` will be deallocated at the end of the statement because nothing is referencing it as far as the type system is concerned
|
||||
= help: for more information, see <https://doc.rust-lang.org/reference/destructors.html>
|
||||
|
||||
error: a dangling pointer will be produced because the temporary `CString` will be dropped
|
||||
--> $DIR/calls.rs:43:41
|
||||
|
|
||||
LL | let _ptr: *const u8 = { cstring() }.as_ptr().cast();
|
||||
| ------------- ^^^^^^ this pointer will immediately be invalid
|
||||
| |
|
||||
| this `CString` is deallocated at the end of the statement, bind it to a variable to extend its lifetime
|
||||
|
|
||||
= note: pointers do not have a lifetime; when calling `as_ptr` the `CString` will be deallocated at the end of the statement because nothing is referencing it as far as the type system is concerned
|
||||
= help: for more information, see <https://doc.rust-lang.org/reference/destructors.html>
|
||||
|
||||
error: a dangling pointer will be produced because the temporary `CString` will be dropped
|
||||
--> $DIR/calls.rs:45:39
|
||||
|
|
||||
LL | let _ptr: *const u8 = { cstring().as_ptr() }.cast();
|
||||
| --------- ^^^^^^ this pointer will immediately be invalid
|
||||
| |
|
||||
| this `CString` is deallocated at the end of the statement, bind it to a variable to extend its lifetime
|
||||
|
|
||||
= note: pointers do not have a lifetime; when calling `as_ptr` the `CString` will be deallocated at the end of the statement because nothing is referencing it as far as the type system is concerned
|
||||
= help: for more information, see <https://doc.rust-lang.org/reference/destructors.html>
|
||||
|
||||
error: aborting due to 5 previous errors
|
||||
|
||||
|
|
@ -1,4 +1,7 @@
|
|||
//@ check-pass
|
||||
|
||||
#![deny(temporary_cstring_as_ptr)]
|
||||
//~^ WARNING lint `temporary_cstring_as_ptr` has been renamed to `dangling_pointers_from_temporaries`
|
||||
|
||||
use std::ffi::CString;
|
||||
use std::os::raw::c_char;
|
||||
|
|
@ -7,5 +10,4 @@ fn some_function(data: *const c_char) {}
|
|||
|
||||
fn main() {
|
||||
some_function(CString::new("").unwrap().as_ptr());
|
||||
//~^ ERROR getting the inner pointer of a temporary `CString`
|
||||
}
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
warning: lint `temporary_cstring_as_ptr` has been renamed to `dangling_pointers_from_temporaries`
|
||||
--> $DIR/cstring-as-param.rs:3:9
|
||||
|
|
||||
LL | #![deny(temporary_cstring_as_ptr)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `dangling_pointers_from_temporaries`
|
||||
|
|
||||
= note: `#[warn(renamed_and_removed_lints)]` on by default
|
||||
|
||||
warning: 1 warning emitted
|
||||
|
||||
|
|
@ -1,17 +1,18 @@
|
|||
// this program is not technically incorrect, but is an obscure enough style to be worth linting
|
||||
#![deny(temporary_cstring_as_ptr)]
|
||||
//~^ WARNING lint `temporary_cstring_as_ptr` has been renamed to `dangling_pointers_from_temporaries`
|
||||
|
||||
use std::ffi::CString;
|
||||
|
||||
macro_rules! mymacro {
|
||||
() => {
|
||||
let s = CString::new("some text").unwrap().as_ptr();
|
||||
//~^ ERROR getting the inner pointer of a temporary `CString`
|
||||
//~^ ERROR a dangling pointer will be produced because the temporary `CString` will be dropped
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let s = CString::new("some text").unwrap().as_ptr();
|
||||
//~^ ERROR getting the inner pointer of a temporary `CString`
|
||||
//~^ ERROR a dangling pointer will be produced because the temporary `CString` will be dropped
|
||||
mymacro!();
|
||||
}
|
||||
|
|
@ -1,24 +1,32 @@
|
|||
error: getting the inner pointer of a temporary `CString`
|
||||
--> $DIR/lint-temporary-cstring-as-ptr.rs:14:48
|
||||
warning: lint `temporary_cstring_as_ptr` has been renamed to `dangling_pointers_from_temporaries`
|
||||
--> $DIR/cstring-as-ptr.rs:2:9
|
||||
|
|
||||
LL | #![deny(temporary_cstring_as_ptr)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `dangling_pointers_from_temporaries`
|
||||
|
|
||||
= note: `#[warn(renamed_and_removed_lints)]` on by default
|
||||
|
||||
error: a dangling pointer will be produced because the temporary `CString` will be dropped
|
||||
--> $DIR/cstring-as-ptr.rs:15:48
|
||||
|
|
||||
LL | let s = CString::new("some text").unwrap().as_ptr();
|
||||
| ---------------------------------- ^^^^^^ this pointer will be invalid
|
||||
| ---------------------------------- ^^^^^^ this pointer will immediately be invalid
|
||||
| |
|
||||
| this `CString` is deallocated at the end of the statement, bind it to a variable to extend its lifetime
|
||||
|
|
||||
= note: pointers do not have a lifetime; when calling `as_ptr` the `CString` will be deallocated at the end of the statement because nothing is referencing it as far as the type system is concerned
|
||||
= help: for more information, see https://doc.rust-lang.org/reference/destructors.html
|
||||
= help: for more information, see <https://doc.rust-lang.org/reference/destructors.html>
|
||||
note: the lint level is defined here
|
||||
--> $DIR/lint-temporary-cstring-as-ptr.rs:2:9
|
||||
--> $DIR/cstring-as-ptr.rs:2:9
|
||||
|
|
||||
LL | #![deny(temporary_cstring_as_ptr)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: getting the inner pointer of a temporary `CString`
|
||||
--> $DIR/lint-temporary-cstring-as-ptr.rs:8:52
|
||||
error: a dangling pointer will be produced because the temporary `CString` will be dropped
|
||||
--> $DIR/cstring-as-ptr.rs:9:52
|
||||
|
|
||||
LL | let s = CString::new("some text").unwrap().as_ptr();
|
||||
| ---------------------------------- ^^^^^^ this pointer will be invalid
|
||||
| ---------------------------------- ^^^^^^ this pointer will immediately be invalid
|
||||
| |
|
||||
| this `CString` is deallocated at the end of the statement, bind it to a variable to extend its lifetime
|
||||
...
|
||||
|
|
@ -26,8 +34,8 @@ LL | mymacro!();
|
|||
| ---------- in this macro invocation
|
||||
|
|
||||
= note: pointers do not have a lifetime; when calling `as_ptr` the `CString` will be deallocated at the end of the statement because nothing is referencing it as far as the type system is concerned
|
||||
= help: for more information, see https://doc.rust-lang.org/reference/destructors.html
|
||||
= help: for more information, see <https://doc.rust-lang.org/reference/destructors.html>
|
||||
= note: this error originates in the macro `mymacro` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
error: aborting due to 2 previous errors; 1 warning emitted
|
||||
|
||||
19
tests/ui/lint/dangling-pointers-from-temporaries/emacs.rs
Normal file
19
tests/ui/lint/dangling-pointers-from-temporaries/emacs.rs
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
//@ check-pass
|
||||
|
||||
#![deny(dangling_pointers_from_temporaries)]
|
||||
|
||||
// The original code example comes from bindgen-produced code for emacs.
|
||||
// Hence the name of the test.
|
||||
// https://github.com/rust-lang/rust/pull/128985#issuecomment-2338951363
|
||||
|
||||
use std::ffi::{c_char, CString};
|
||||
|
||||
fn read(ptr: *const c_char) -> c_char {
|
||||
unsafe { ptr.read() }
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let fnptr: Option<fn(ptr: *const c_char) -> c_char> = Some(read);
|
||||
let x = fnptr.unwrap()(CString::new("foo").unwrap().as_ptr());
|
||||
assert_eq!(x as u8, b'f');
|
||||
}
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
#![deny(dangling_pointers_from_temporaries)]
|
||||
|
||||
const MAX_PATH: usize = 260;
|
||||
fn main() {
|
||||
let str1 = String::with_capacity(MAX_PATH).as_mut_ptr();
|
||||
//~^ ERROR a dangling pointer will be produced because the temporary `String` will be dropped
|
||||
let str2 = String::from("TotototototototototototototototototoT").as_ptr();
|
||||
//~^ ERROR a dangling pointer will be produced because the temporary `String` will be dropped
|
||||
unsafe {
|
||||
std::ptr::copy_nonoverlapping(str2, str1, 30);
|
||||
println!("{:?}", String::from_raw_parts(str1, 30, 30));
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,29 @@
|
|||
error: a dangling pointer will be produced because the temporary `String` will be dropped
|
||||
--> $DIR/example-from-issue123613.rs:5:48
|
||||
|
|
||||
LL | let str1 = String::with_capacity(MAX_PATH).as_mut_ptr();
|
||||
| ------------------------------- ^^^^^^^^^^ this pointer will immediately be invalid
|
||||
| |
|
||||
| this `String` is deallocated at the end of the statement, bind it to a variable to extend its lifetime
|
||||
|
|
||||
= note: pointers do not have a lifetime; when calling `as_mut_ptr` the `String` will be deallocated at the end of the statement because nothing is referencing it as far as the type system is concerned
|
||||
= help: for more information, see <https://doc.rust-lang.org/reference/destructors.html>
|
||||
note: the lint level is defined here
|
||||
--> $DIR/example-from-issue123613.rs:1:9
|
||||
|
|
||||
LL | #![deny(dangling_pointers_from_temporaries)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: a dangling pointer will be produced because the temporary `String` will be dropped
|
||||
--> $DIR/example-from-issue123613.rs:7:70
|
||||
|
|
||||
LL | let str2 = String::from("TotototototototototototototototototoT").as_ptr();
|
||||
| ----------------------------------------------------- ^^^^^^ this pointer will immediately be invalid
|
||||
| |
|
||||
| this `String` is deallocated at the end of the statement, bind it to a variable to extend its lifetime
|
||||
|
|
||||
= note: pointers do not have a lifetime; when calling `as_ptr` the `String` will be deallocated at the end of the statement because nothing is referencing it as far as the type system is concerned
|
||||
= help: for more information, see <https://doc.rust-lang.org/reference/destructors.html>
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
32
tests/ui/lint/dangling-pointers-from-temporaries/ext.rs
Normal file
32
tests/ui/lint/dangling-pointers-from-temporaries/ext.rs
Normal file
|
|
@ -0,0 +1,32 @@
|
|||
#![deny(dangling_pointers_from_temporaries)]
|
||||
|
||||
use std::fmt::Debug;
|
||||
|
||||
trait Ext1 {
|
||||
fn dbg(self) -> Self
|
||||
where
|
||||
Self: Sized + Debug,
|
||||
{
|
||||
dbg!(&self);
|
||||
self
|
||||
}
|
||||
}
|
||||
|
||||
impl<T> Ext1 for *const T {}
|
||||
|
||||
trait Ext2 {
|
||||
fn foo(self);
|
||||
}
|
||||
|
||||
impl Ext2 for *const u32 {
|
||||
fn foo(self) {
|
||||
dbg!(unsafe { self.read() });
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let _ptr1 = Vec::<u32>::new().as_ptr().dbg();
|
||||
//~^ ERROR a dangling pointer will be produced because the temporary `Vec<u32>` will be dropped
|
||||
let _ptr2 = vec![0].as_ptr().foo();
|
||||
//~^ ERROR a dangling pointer will be produced because the temporary `Vec<u32>` will be dropped
|
||||
}
|
||||
29
tests/ui/lint/dangling-pointers-from-temporaries/ext.stderr
Normal file
29
tests/ui/lint/dangling-pointers-from-temporaries/ext.stderr
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
error: a dangling pointer will be produced because the temporary `Vec<u32>` will be dropped
|
||||
--> $DIR/ext.rs:28:35
|
||||
|
|
||||
LL | let _ptr1 = Vec::<u32>::new().as_ptr().dbg();
|
||||
| ----------------- ^^^^^^ this pointer will immediately be invalid
|
||||
| |
|
||||
| this `Vec<u32>` is deallocated at the end of the statement, bind it to a variable to extend its lifetime
|
||||
|
|
||||
= note: pointers do not have a lifetime; when calling `as_ptr` the `Vec<u32>` will be deallocated at the end of the statement because nothing is referencing it as far as the type system is concerned
|
||||
= help: for more information, see <https://doc.rust-lang.org/reference/destructors.html>
|
||||
note: the lint level is defined here
|
||||
--> $DIR/ext.rs:1:9
|
||||
|
|
||||
LL | #![deny(dangling_pointers_from_temporaries)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: a dangling pointer will be produced because the temporary `Vec<u32>` will be dropped
|
||||
--> $DIR/ext.rs:30:25
|
||||
|
|
||||
LL | let _ptr2 = vec![0].as_ptr().foo();
|
||||
| ------- ^^^^^^ this pointer will immediately be invalid
|
||||
| |
|
||||
| this `Vec<u32>` is deallocated at the end of the statement, bind it to a variable to extend its lifetime
|
||||
|
|
||||
= note: pointers do not have a lifetime; when calling `as_ptr` the `Vec<u32>` will be deallocated at the end of the statement because nothing is referencing it as far as the type system is concerned
|
||||
= help: for more information, see <https://doc.rust-lang.org/reference/destructors.html>
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
#![deny(dangling_pointers_from_temporaries)]
|
||||
|
||||
fn main() {
|
||||
vec![0u8].as_ptr();
|
||||
//~^ ERROR a dangling pointer will be produced because the temporary `Vec<u8>` will be dropped
|
||||
vec![0u8].as_mut_ptr();
|
||||
//~^ ERROR a dangling pointer will be produced because the temporary `Vec<u8>` will be dropped
|
||||
}
|
||||
|
|
@ -0,0 +1,29 @@
|
|||
error: a dangling pointer will be produced because the temporary `Vec<u8>` will be dropped
|
||||
--> $DIR/methods.rs:4:15
|
||||
|
|
||||
LL | vec![0u8].as_ptr();
|
||||
| --------- ^^^^^^ this pointer will immediately be invalid
|
||||
| |
|
||||
| this `Vec<u8>` is deallocated at the end of the statement, bind it to a variable to extend its lifetime
|
||||
|
|
||||
= note: pointers do not have a lifetime; when calling `as_ptr` the `Vec<u8>` will be deallocated at the end of the statement because nothing is referencing it as far as the type system is concerned
|
||||
= help: for more information, see <https://doc.rust-lang.org/reference/destructors.html>
|
||||
note: the lint level is defined here
|
||||
--> $DIR/methods.rs:1:9
|
||||
|
|
||||
LL | #![deny(dangling_pointers_from_temporaries)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: a dangling pointer will be produced because the temporary `Vec<u8>` will be dropped
|
||||
--> $DIR/methods.rs:6:15
|
||||
|
|
||||
LL | vec![0u8].as_mut_ptr();
|
||||
| --------- ^^^^^^^^^^ this pointer will immediately be invalid
|
||||
| |
|
||||
| this `Vec<u8>` is deallocated at the end of the statement, bind it to a variable to extend its lifetime
|
||||
|
|
||||
= note: pointers do not have a lifetime; when calling `as_mut_ptr` the `Vec<u8>` will be deallocated at the end of the statement because nothing is referencing it as far as the type system is concerned
|
||||
= help: for more information, see <https://doc.rust-lang.org/reference/destructors.html>
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
136
tests/ui/lint/dangling-pointers-from-temporaries/temporaries.rs
Normal file
136
tests/ui/lint/dangling-pointers-from-temporaries/temporaries.rs
Normal file
|
|
@ -0,0 +1,136 @@
|
|||
#![allow(unused)]
|
||||
#![deny(dangling_pointers_from_temporaries)]
|
||||
|
||||
fn string() -> String {
|
||||
"hello".into()
|
||||
}
|
||||
|
||||
struct Wrapper(String);
|
||||
|
||||
fn main() {
|
||||
// ConstBlock
|
||||
const { String::new() }.as_ptr();
|
||||
|
||||
// Array
|
||||
{
|
||||
[string()].as_ptr(); // False negative
|
||||
[true].as_ptr();
|
||||
}
|
||||
|
||||
// Call
|
||||
string().as_ptr();
|
||||
//~^ ERROR a dangling pointer will be produced because the temporary `String` will be dropped
|
||||
|
||||
// MethodCall
|
||||
"hello".to_string().as_ptr();
|
||||
//~^ ERROR a dangling pointer will be produced because the temporary `String` will be dropped
|
||||
|
||||
// Tup
|
||||
// impossible
|
||||
|
||||
// Binary
|
||||
(string() + "hello").as_ptr();
|
||||
//~^ ERROR a dangling pointer will be produced because the temporary `String` will be dropped
|
||||
|
||||
// Path
|
||||
{
|
||||
let x = string();
|
||||
x.as_ptr();
|
||||
}
|
||||
|
||||
// Unary
|
||||
{
|
||||
let x = string();
|
||||
let x: &String = &x;
|
||||
(*x).as_ptr();
|
||||
(&[0u8]).as_ptr();
|
||||
(&string()).as_ptr(); // False negative
|
||||
(*&string()).as_ptr(); // False negative
|
||||
}
|
||||
|
||||
// Lit
|
||||
"hello".as_ptr();
|
||||
|
||||
// Cast
|
||||
// impossible
|
||||
|
||||
// Type
|
||||
// impossible
|
||||
|
||||
// DropTemps
|
||||
// impossible
|
||||
|
||||
// Let
|
||||
// impossible
|
||||
|
||||
// If
|
||||
{
|
||||
(if true { String::new() } else { "hello".into() }).as_ptr();
|
||||
//~^ ERROR a dangling pointer will be produced because the temporary `String` will be dropped
|
||||
}
|
||||
|
||||
// Loop
|
||||
{
|
||||
(loop {
|
||||
break String::new();
|
||||
})
|
||||
.as_ptr();
|
||||
//~^ ERROR a dangling pointer will be produced because the temporary `String` will be dropped
|
||||
}
|
||||
|
||||
// Match
|
||||
{
|
||||
match string() {
|
||||
s => s,
|
||||
}
|
||||
.as_ptr();
|
||||
//~^ ERROR a dangling pointer will be produced because the temporary `String` will be dropped
|
||||
}
|
||||
|
||||
// Closure
|
||||
// impossible
|
||||
|
||||
// Block
|
||||
{ string() }.as_ptr();
|
||||
//~^ ERROR a dangling pointer will be produced because the temporary `String` will be dropped
|
||||
|
||||
// Assign, AssignOp
|
||||
// impossible
|
||||
|
||||
// Field
|
||||
{
|
||||
Wrapper(string()).0.as_ptr(); // False negative
|
||||
let x = Wrapper(string());
|
||||
x.0.as_ptr();
|
||||
}
|
||||
|
||||
// Index
|
||||
{
|
||||
vec![string()][0].as_ptr(); // False negative
|
||||
let x = vec![string()];
|
||||
x[0].as_ptr();
|
||||
}
|
||||
|
||||
// AddrOf, InlineAsm, OffsetOf
|
||||
// impossible
|
||||
|
||||
// Break, Continue, Ret
|
||||
// are !
|
||||
|
||||
// Become, Yield
|
||||
// unstable, are !
|
||||
|
||||
// Repeat
|
||||
[0u8; 100].as_ptr();
|
||||
[const { String::new() }; 100].as_ptr();
|
||||
|
||||
// Struct
|
||||
// Cannot test this without access to private fields of the linted types.
|
||||
|
||||
// Err
|
||||
// impossible
|
||||
|
||||
// Macro
|
||||
vec![0u8].as_ptr();
|
||||
//~^ ERROR a dangling pointer will be produced because the temporary `Vec<u8>` will be dropped
|
||||
}
|
||||
|
|
@ -0,0 +1,99 @@
|
|||
error: a dangling pointer will be produced because the temporary `String` will be dropped
|
||||
--> $DIR/temporaries.rs:21:14
|
||||
|
|
||||
LL | string().as_ptr();
|
||||
| -------- ^^^^^^ this pointer will immediately be invalid
|
||||
| |
|
||||
| this `String` is deallocated at the end of the statement, bind it to a variable to extend its lifetime
|
||||
|
|
||||
= note: pointers do not have a lifetime; when calling `as_ptr` the `String` will be deallocated at the end of the statement because nothing is referencing it as far as the type system is concerned
|
||||
= help: for more information, see <https://doc.rust-lang.org/reference/destructors.html>
|
||||
note: the lint level is defined here
|
||||
--> $DIR/temporaries.rs:2:9
|
||||
|
|
||||
LL | #![deny(dangling_pointers_from_temporaries)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: a dangling pointer will be produced because the temporary `String` will be dropped
|
||||
--> $DIR/temporaries.rs:25:25
|
||||
|
|
||||
LL | "hello".to_string().as_ptr();
|
||||
| ------------------- ^^^^^^ this pointer will immediately be invalid
|
||||
| |
|
||||
| this `String` is deallocated at the end of the statement, bind it to a variable to extend its lifetime
|
||||
|
|
||||
= note: pointers do not have a lifetime; when calling `as_ptr` the `String` will be deallocated at the end of the statement because nothing is referencing it as far as the type system is concerned
|
||||
= help: for more information, see <https://doc.rust-lang.org/reference/destructors.html>
|
||||
|
||||
error: a dangling pointer will be produced because the temporary `String` will be dropped
|
||||
--> $DIR/temporaries.rs:32:26
|
||||
|
|
||||
LL | (string() + "hello").as_ptr();
|
||||
| -------------------- ^^^^^^ this pointer will immediately be invalid
|
||||
| |
|
||||
| this `String` is deallocated at the end of the statement, bind it to a variable to extend its lifetime
|
||||
|
|
||||
= note: pointers do not have a lifetime; when calling `as_ptr` the `String` will be deallocated at the end of the statement because nothing is referencing it as far as the type system is concerned
|
||||
= help: for more information, see <https://doc.rust-lang.org/reference/destructors.html>
|
||||
|
||||
error: a dangling pointer will be produced because the temporary `String` will be dropped
|
||||
--> $DIR/temporaries.rs:68:61
|
||||
|
|
||||
LL | (if true { String::new() } else { "hello".into() }).as_ptr();
|
||||
| --------------------------------------------------- ^^^^^^ this pointer will immediately be invalid
|
||||
| |
|
||||
| this `String` is deallocated at the end of the statement, bind it to a variable to extend its lifetime
|
||||
|
|
||||
= note: pointers do not have a lifetime; when calling `as_ptr` the `String` will be deallocated at the end of the statement because nothing is referencing it as far as the type system is concerned
|
||||
= help: for more information, see <https://doc.rust-lang.org/reference/destructors.html>
|
||||
|
||||
error: a dangling pointer will be produced because the temporary `String` will be dropped
|
||||
--> $DIR/temporaries.rs:77:10
|
||||
|
|
||||
LL | / (loop {
|
||||
LL | | break String::new();
|
||||
LL | | })
|
||||
| |__________- this `String` is deallocated at the end of the statement, bind it to a variable to extend its lifetime
|
||||
LL | .as_ptr();
|
||||
| ^^^^^^ this pointer will immediately be invalid
|
||||
|
|
||||
= note: pointers do not have a lifetime; when calling `as_ptr` the `String` will be deallocated at the end of the statement because nothing is referencing it as far as the type system is concerned
|
||||
= help: for more information, see <https://doc.rust-lang.org/reference/destructors.html>
|
||||
|
||||
error: a dangling pointer will be produced because the temporary `String` will be dropped
|
||||
--> $DIR/temporaries.rs:86:10
|
||||
|
|
||||
LL | / match string() {
|
||||
LL | | s => s,
|
||||
LL | | }
|
||||
| |_________- this `String` is deallocated at the end of the statement, bind it to a variable to extend its lifetime
|
||||
LL | .as_ptr();
|
||||
| ^^^^^^ this pointer will immediately be invalid
|
||||
|
|
||||
= note: pointers do not have a lifetime; when calling `as_ptr` the `String` will be deallocated at the end of the statement because nothing is referencing it as far as the type system is concerned
|
||||
= help: for more information, see <https://doc.rust-lang.org/reference/destructors.html>
|
||||
|
||||
error: a dangling pointer will be produced because the temporary `String` will be dropped
|
||||
--> $DIR/temporaries.rs:94:18
|
||||
|
|
||||
LL | { string() }.as_ptr();
|
||||
| ------------ ^^^^^^ this pointer will immediately be invalid
|
||||
| |
|
||||
| this `String` is deallocated at the end of the statement, bind it to a variable to extend its lifetime
|
||||
|
|
||||
= note: pointers do not have a lifetime; when calling `as_ptr` the `String` will be deallocated at the end of the statement because nothing is referencing it as far as the type system is concerned
|
||||
= help: for more information, see <https://doc.rust-lang.org/reference/destructors.html>
|
||||
|
||||
error: a dangling pointer will be produced because the temporary `Vec<u8>` will be dropped
|
||||
--> $DIR/temporaries.rs:134:15
|
||||
|
|
||||
LL | vec![0u8].as_ptr();
|
||||
| --------- ^^^^^^ this pointer will immediately be invalid
|
||||
| |
|
||||
| this `Vec<u8>` is deallocated at the end of the statement, bind it to a variable to extend its lifetime
|
||||
|
|
||||
= note: pointers do not have a lifetime; when calling `as_ptr` the `Vec<u8>` will be deallocated at the end of the statement because nothing is referencing it as far as the type system is concerned
|
||||
= help: for more information, see <https://doc.rust-lang.org/reference/destructors.html>
|
||||
|
||||
error: aborting due to 8 previous errors
|
||||
|
||||
52
tests/ui/lint/dangling-pointers-from-temporaries/types.rs
Normal file
52
tests/ui/lint/dangling-pointers-from-temporaries/types.rs
Normal file
|
|
@ -0,0 +1,52 @@
|
|||
#![deny(dangling_pointers_from_temporaries)]
|
||||
|
||||
use std::cell::Cell;
|
||||
use std::ffi::{CStr, CString};
|
||||
use std::mem::MaybeUninit;
|
||||
|
||||
struct AsPtrFake;
|
||||
|
||||
impl AsPtrFake {
|
||||
fn as_ptr(&self) -> *const () {
|
||||
std::ptr::null()
|
||||
}
|
||||
}
|
||||
|
||||
fn declval<T>() -> T {
|
||||
loop {}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
declval::<CString>().as_ptr();
|
||||
//~^ ERROR a dangling pointer will be produced because the temporary `CString` will be dropped
|
||||
declval::<String>().as_ptr();
|
||||
//~^ ERROR a dangling pointer will be produced because the temporary `String` will be dropped
|
||||
declval::<Vec<u8>>().as_ptr();
|
||||
//~^ ERROR a dangling pointer will be produced because the temporary `Vec<u8>` will be dropped
|
||||
declval::<Box<CString>>().as_ptr();
|
||||
//~^ ERROR a dangling pointer will be produced because the temporary `Box<CString>` will be dropped
|
||||
declval::<Box<[u8]>>().as_ptr();
|
||||
//~^ ERROR a dangling pointer will be produced because the temporary `Box<[u8]>` will be dropped
|
||||
declval::<Box<str>>().as_ptr();
|
||||
//~^ ERROR a dangling pointer will be produced because the temporary `Box<str>` will be dropped
|
||||
declval::<Box<CStr>>().as_ptr();
|
||||
//~^ ERROR a dangling pointer will be produced because the temporary `Box<CStr>` will be dropped
|
||||
declval::<[u8; 10]>().as_ptr();
|
||||
//~^ ERROR a dangling pointer will be produced because the temporary `[u8; 10]` will be dropped
|
||||
declval::<Box<[u8; 10]>>().as_ptr();
|
||||
//~^ ERROR a dangling pointer will be produced because the temporary `Box<[u8; 10]>` will be dropped
|
||||
declval::<Box<Vec<u8>>>().as_ptr();
|
||||
//~^ ERROR a dangling pointer will be produced because the temporary `Box<Vec<u8>>` will be dropped
|
||||
declval::<Box<String>>().as_ptr();
|
||||
//~^ ERROR a dangling pointer will be produced because the temporary `Box<String>` will be dropped
|
||||
declval::<Box<Box<Box<Box<[u8]>>>>>().as_ptr();
|
||||
//~^ ERROR a dangling pointer will be produced because the temporary `Box<Box<Box<Box<[u8]>>>>` will be dropped
|
||||
declval::<Cell<u8>>().as_ptr();
|
||||
//~^ ERROR a dangling pointer will be produced because the temporary `Cell<u8>` will be dropped
|
||||
declval::<MaybeUninit<u8>>().as_ptr();
|
||||
//~^ ERROR a dangling pointer will be produced because the temporary `MaybeUninit<u8>` will be dropped
|
||||
declval::<Vec<AsPtrFake>>().as_ptr();
|
||||
//~^ ERROR a dangling pointer will be produced because the temporary `Vec<AsPtrFake>` will be dropped
|
||||
declval::<Box<AsPtrFake>>().as_ptr();
|
||||
declval::<AsPtrFake>().as_ptr();
|
||||
}
|
||||
172
tests/ui/lint/dangling-pointers-from-temporaries/types.stderr
Normal file
172
tests/ui/lint/dangling-pointers-from-temporaries/types.stderr
Normal file
|
|
@ -0,0 +1,172 @@
|
|||
error: a dangling pointer will be produced because the temporary `CString` will be dropped
|
||||
--> $DIR/types.rs:20:26
|
||||
|
|
||||
LL | declval::<CString>().as_ptr();
|
||||
| -------------------- ^^^^^^ this pointer will immediately be invalid
|
||||
| |
|
||||
| this `CString` is deallocated at the end of the statement, bind it to a variable to extend its lifetime
|
||||
|
|
||||
= note: pointers do not have a lifetime; when calling `as_ptr` the `CString` will be deallocated at the end of the statement because nothing is referencing it as far as the type system is concerned
|
||||
= help: for more information, see <https://doc.rust-lang.org/reference/destructors.html>
|
||||
note: the lint level is defined here
|
||||
--> $DIR/types.rs:1:9
|
||||
|
|
||||
LL | #![deny(dangling_pointers_from_temporaries)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: a dangling pointer will be produced because the temporary `String` will be dropped
|
||||
--> $DIR/types.rs:22:25
|
||||
|
|
||||
LL | declval::<String>().as_ptr();
|
||||
| ------------------- ^^^^^^ this pointer will immediately be invalid
|
||||
| |
|
||||
| this `String` is deallocated at the end of the statement, bind it to a variable to extend its lifetime
|
||||
|
|
||||
= note: pointers do not have a lifetime; when calling `as_ptr` the `String` will be deallocated at the end of the statement because nothing is referencing it as far as the type system is concerned
|
||||
= help: for more information, see <https://doc.rust-lang.org/reference/destructors.html>
|
||||
|
||||
error: a dangling pointer will be produced because the temporary `Vec<u8>` will be dropped
|
||||
--> $DIR/types.rs:24:26
|
||||
|
|
||||
LL | declval::<Vec<u8>>().as_ptr();
|
||||
| -------------------- ^^^^^^ this pointer will immediately be invalid
|
||||
| |
|
||||
| this `Vec<u8>` is deallocated at the end of the statement, bind it to a variable to extend its lifetime
|
||||
|
|
||||
= note: pointers do not have a lifetime; when calling `as_ptr` the `Vec<u8>` will be deallocated at the end of the statement because nothing is referencing it as far as the type system is concerned
|
||||
= help: for more information, see <https://doc.rust-lang.org/reference/destructors.html>
|
||||
|
||||
error: a dangling pointer will be produced because the temporary `Box<CString>` will be dropped
|
||||
--> $DIR/types.rs:26:31
|
||||
|
|
||||
LL | declval::<Box<CString>>().as_ptr();
|
||||
| ------------------------- ^^^^^^ this pointer will immediately be invalid
|
||||
| |
|
||||
| this `Box<CString>` is deallocated at the end of the statement, bind it to a variable to extend its lifetime
|
||||
|
|
||||
= note: pointers do not have a lifetime; when calling `as_ptr` the `Box<CString>` will be deallocated at the end of the statement because nothing is referencing it as far as the type system is concerned
|
||||
= help: for more information, see <https://doc.rust-lang.org/reference/destructors.html>
|
||||
|
||||
error: a dangling pointer will be produced because the temporary `Box<[u8]>` will be dropped
|
||||
--> $DIR/types.rs:28:28
|
||||
|
|
||||
LL | declval::<Box<[u8]>>().as_ptr();
|
||||
| ---------------------- ^^^^^^ this pointer will immediately be invalid
|
||||
| |
|
||||
| this `Box<[u8]>` is deallocated at the end of the statement, bind it to a variable to extend its lifetime
|
||||
|
|
||||
= note: pointers do not have a lifetime; when calling `as_ptr` the `Box<[u8]>` will be deallocated at the end of the statement because nothing is referencing it as far as the type system is concerned
|
||||
= help: for more information, see <https://doc.rust-lang.org/reference/destructors.html>
|
||||
|
||||
error: a dangling pointer will be produced because the temporary `Box<str>` will be dropped
|
||||
--> $DIR/types.rs:30:27
|
||||
|
|
||||
LL | declval::<Box<str>>().as_ptr();
|
||||
| --------------------- ^^^^^^ this pointer will immediately be invalid
|
||||
| |
|
||||
| this `Box<str>` is deallocated at the end of the statement, bind it to a variable to extend its lifetime
|
||||
|
|
||||
= note: pointers do not have a lifetime; when calling `as_ptr` the `Box<str>` will be deallocated at the end of the statement because nothing is referencing it as far as the type system is concerned
|
||||
= help: for more information, see <https://doc.rust-lang.org/reference/destructors.html>
|
||||
|
||||
error: a dangling pointer will be produced because the temporary `Box<CStr>` will be dropped
|
||||
--> $DIR/types.rs:32:28
|
||||
|
|
||||
LL | declval::<Box<CStr>>().as_ptr();
|
||||
| ---------------------- ^^^^^^ this pointer will immediately be invalid
|
||||
| |
|
||||
| this `Box<CStr>` is deallocated at the end of the statement, bind it to a variable to extend its lifetime
|
||||
|
|
||||
= note: pointers do not have a lifetime; when calling `as_ptr` the `Box<CStr>` will be deallocated at the end of the statement because nothing is referencing it as far as the type system is concerned
|
||||
= help: for more information, see <https://doc.rust-lang.org/reference/destructors.html>
|
||||
|
||||
error: a dangling pointer will be produced because the temporary `[u8; 10]` will be dropped
|
||||
--> $DIR/types.rs:34:27
|
||||
|
|
||||
LL | declval::<[u8; 10]>().as_ptr();
|
||||
| --------------------- ^^^^^^ this pointer will immediately be invalid
|
||||
| |
|
||||
| this `[u8; 10]` is deallocated at the end of the statement, bind it to a variable to extend its lifetime
|
||||
|
|
||||
= note: pointers do not have a lifetime; when calling `as_ptr` the `[u8; 10]` will be deallocated at the end of the statement because nothing is referencing it as far as the type system is concerned
|
||||
= help: for more information, see <https://doc.rust-lang.org/reference/destructors.html>
|
||||
|
||||
error: a dangling pointer will be produced because the temporary `Box<[u8; 10]>` will be dropped
|
||||
--> $DIR/types.rs:36:32
|
||||
|
|
||||
LL | declval::<Box<[u8; 10]>>().as_ptr();
|
||||
| -------------------------- ^^^^^^ this pointer will immediately be invalid
|
||||
| |
|
||||
| this `Box<[u8; 10]>` is deallocated at the end of the statement, bind it to a variable to extend its lifetime
|
||||
|
|
||||
= note: pointers do not have a lifetime; when calling `as_ptr` the `Box<[u8; 10]>` will be deallocated at the end of the statement because nothing is referencing it as far as the type system is concerned
|
||||
= help: for more information, see <https://doc.rust-lang.org/reference/destructors.html>
|
||||
|
||||
error: a dangling pointer will be produced because the temporary `Box<Vec<u8>>` will be dropped
|
||||
--> $DIR/types.rs:38:31
|
||||
|
|
||||
LL | declval::<Box<Vec<u8>>>().as_ptr();
|
||||
| ------------------------- ^^^^^^ this pointer will immediately be invalid
|
||||
| |
|
||||
| this `Box<Vec<u8>>` is deallocated at the end of the statement, bind it to a variable to extend its lifetime
|
||||
|
|
||||
= note: pointers do not have a lifetime; when calling `as_ptr` the `Box<Vec<u8>>` will be deallocated at the end of the statement because nothing is referencing it as far as the type system is concerned
|
||||
= help: for more information, see <https://doc.rust-lang.org/reference/destructors.html>
|
||||
|
||||
error: a dangling pointer will be produced because the temporary `Box<String>` will be dropped
|
||||
--> $DIR/types.rs:40:30
|
||||
|
|
||||
LL | declval::<Box<String>>().as_ptr();
|
||||
| ------------------------ ^^^^^^ this pointer will immediately be invalid
|
||||
| |
|
||||
| this `Box<String>` is deallocated at the end of the statement, bind it to a variable to extend its lifetime
|
||||
|
|
||||
= note: pointers do not have a lifetime; when calling `as_ptr` the `Box<String>` will be deallocated at the end of the statement because nothing is referencing it as far as the type system is concerned
|
||||
= help: for more information, see <https://doc.rust-lang.org/reference/destructors.html>
|
||||
|
||||
error: a dangling pointer will be produced because the temporary `Box<Box<Box<Box<[u8]>>>>` will be dropped
|
||||
--> $DIR/types.rs:42:43
|
||||
|
|
||||
LL | declval::<Box<Box<Box<Box<[u8]>>>>>().as_ptr();
|
||||
| ------------------------------------- ^^^^^^ this pointer will immediately be invalid
|
||||
| |
|
||||
| this `Box<Box<Box<Box<[u8]>>>>` is deallocated at the end of the statement, bind it to a variable to extend its lifetime
|
||||
|
|
||||
= note: pointers do not have a lifetime; when calling `as_ptr` the `Box<Box<Box<Box<[u8]>>>>` will be deallocated at the end of the statement because nothing is referencing it as far as the type system is concerned
|
||||
= help: for more information, see <https://doc.rust-lang.org/reference/destructors.html>
|
||||
|
||||
error: a dangling pointer will be produced because the temporary `Cell<u8>` will be dropped
|
||||
--> $DIR/types.rs:44:27
|
||||
|
|
||||
LL | declval::<Cell<u8>>().as_ptr();
|
||||
| --------------------- ^^^^^^ this pointer will immediately be invalid
|
||||
| |
|
||||
| this `Cell<u8>` is deallocated at the end of the statement, bind it to a variable to extend its lifetime
|
||||
|
|
||||
= note: pointers do not have a lifetime; when calling `as_ptr` the `Cell<u8>` will be deallocated at the end of the statement because nothing is referencing it as far as the type system is concerned
|
||||
= help: for more information, see <https://doc.rust-lang.org/reference/destructors.html>
|
||||
|
||||
error: a dangling pointer will be produced because the temporary `MaybeUninit<u8>` will be dropped
|
||||
--> $DIR/types.rs:46:34
|
||||
|
|
||||
LL | declval::<MaybeUninit<u8>>().as_ptr();
|
||||
| ---------------------------- ^^^^^^ this pointer will immediately be invalid
|
||||
| |
|
||||
| this `MaybeUninit<u8>` is deallocated at the end of the statement, bind it to a variable to extend its lifetime
|
||||
|
|
||||
= note: pointers do not have a lifetime; when calling `as_ptr` the `MaybeUninit<u8>` will be deallocated at the end of the statement because nothing is referencing it as far as the type system is concerned
|
||||
= help: for more information, see <https://doc.rust-lang.org/reference/destructors.html>
|
||||
|
||||
error: a dangling pointer will be produced because the temporary `Vec<AsPtrFake>` will be dropped
|
||||
--> $DIR/types.rs:48:33
|
||||
|
|
||||
LL | declval::<Vec<AsPtrFake>>().as_ptr();
|
||||
| --------------------------- ^^^^^^ this pointer will immediately be invalid
|
||||
| |
|
||||
| this `Vec<AsPtrFake>` is deallocated at the end of the statement, bind it to a variable to extend its lifetime
|
||||
|
|
||||
= note: pointers do not have a lifetime; when calling `as_ptr` the `Vec<AsPtrFake>` will be deallocated at the end of the statement because nothing is referencing it as far as the type system is concerned
|
||||
= help: for more information, see <https://doc.rust-lang.org/reference/destructors.html>
|
||||
|
||||
error: aborting due to 15 previous errors
|
||||
|
||||
|
|
@ -1,18 +0,0 @@
|
|||
error: getting the inner pointer of a temporary `CString`
|
||||
--> $DIR/lint-temporary-cstring-as-param.rs:9:45
|
||||
|
|
||||
LL | some_function(CString::new("").unwrap().as_ptr());
|
||||
| ------------------------- ^^^^^^ this pointer will be invalid
|
||||
| |
|
||||
| this `CString` is deallocated at the end of the statement, bind it to a variable to extend its lifetime
|
||||
|
|
||||
= note: pointers do not have a lifetime; when calling `as_ptr` the `CString` will be deallocated at the end of the statement because nothing is referencing it as far as the type system is concerned
|
||||
= help: for more information, see https://doc.rust-lang.org/reference/destructors.html
|
||||
note: the lint level is defined here
|
||||
--> $DIR/lint-temporary-cstring-as-param.rs:1:9
|
||||
|
|
||||
LL | #![deny(temporary_cstring_as_ptr)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue