Skip to content

Commit a1b88a0

Browse files
committed
Auto merge of rust-lang#128985 - GrigorenkoPV:instantly-dangling-pointer, r=Urgau
Lint against getting pointers from immediately dropped temporaries Fixes rust-lang#123613 ## Changes: 1. New lint: `dangling_pointers_from_temporaries`. Is a generalization of `temporary_cstring_as_ptr` for more types and more ways to get a temporary. 2. `temporary_cstring_as_ptr` is removed and marked as renamed to `dangling_pointers_from_temporaries`. 3. `clippy::temporary_cstring_as_ptr` is marked as renamed to `dangling_pointers_from_temporaries`. 4. Fixed a false positive[^fp] for when the pointer is not actually dangling because of lifetime extension for function/method call arguments. 5. `core::cell::Cell` is now `rustc_diagnostic_item = "Cell"` ## Questions: - [ ] Instead of manually checking for a list of known methods and diagnostic items, maybe add some sort of annotation to those methods in library and check for the presence of that annotation? rust-lang#128985 (comment) ## Known limitations: ### False negatives[^fn]: See the comments in `compiler/rustc_lint/src/dangling.rs` 1. Method calls that are not checked for: - `temporary_unsafe_cell.get()` - `temporary_sync_unsafe_cell.get()` 2. Ways to get a temporary that are not recognized: - `owning_temporary.field` - `owning_temporary[index]` 3. No checks for ref-to-ptr conversions: - `&raw [mut] temporary` - `&temporary as *(const|mut) _` - `ptr::from_ref(&temporary)` and friends [^fn]: lint **should** be emitted, but **is not** [^fp]: lint **should not** be emitted, but **is**
2 parents b0248e2 + a5aa408 commit a1b88a0

File tree

3 files changed

+5
-1
lines changed

3 files changed

+5
-1
lines changed

alloc/tests/boxed.rs

+1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use core::mem::MaybeUninit;
44
use core::ptr::NonNull;
55

66
#[test]
7+
#[cfg_attr(not(bootstrap), expect(dangling_pointers_from_temporaries))]
78
fn uninitialized_zero_size_box() {
89
assert_eq!(
910
&*Box::<()>::new_uninit() as *const _,

core/src/cell.rs

+1
Original file line numberDiff line numberDiff line change
@@ -304,6 +304,7 @@ pub use once::OnceCell;
304304
/// ```
305305
///
306306
/// See the [module-level documentation](self) for more.
307+
#[cfg_attr(not(test), rustc_diagnostic_item = "Cell")]
307308
#[stable(feature = "rust1", since = "1.0.0")]
308309
#[repr(transparent)]
309310
#[rustc_pub_transparent]

core/src/ffi/c_str.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -464,7 +464,9 @@ impl CStr {
464464
/// behavior when `ptr` is used inside the `unsafe` block:
465465
///
466466
/// ```no_run
467-
/// # #![allow(unused_must_use)] #![allow(temporary_cstring_as_ptr)]
467+
/// # #![allow(unused_must_use)]
468+
/// # #![cfg_attr(bootstrap, expect(temporary_cstring_as_ptr))]
469+
/// # #![cfg_attr(not(bootstrap), expect(dangling_pointers_from_temporaries))]
468470
/// use std::ffi::CString;
469471
///
470472
/// // Do not do this:

0 commit comments

Comments
 (0)