Skip to content

Commit 1497744

Browse files
authored
Rollup merge of #130350 - RalfJung:strict-provenance, r=dtolnay
stabilize Strict Provenance and Exposed Provenance APIs Given that [RFC 3559](https://rust-lang.github.io/rfcs/3559-rust-has-provenance.html) has been accepted, t-lang has approved the concept of provenance to exist in the language. So I think it's time that we stabilize the strict provenance and exposed provenance APIs, and discuss provenance explicitly in the docs: ```rust // core::ptr pub const fn without_provenance<T>(addr: usize) -> *const T; pub const fn dangling<T>() -> *const T; pub const fn without_provenance_mut<T>(addr: usize) -> *mut T; pub const fn dangling_mut<T>() -> *mut T; pub fn with_exposed_provenance<T>(addr: usize) -> *const T; pub fn with_exposed_provenance_mut<T>(addr: usize) -> *mut T; impl<T: ?Sized> *const T { pub fn addr(self) -> usize; pub fn expose_provenance(self) -> usize; pub fn with_addr(self, addr: usize) -> Self; pub fn map_addr(self, f: impl FnOnce(usize) -> usize) -> Self; } impl<T: ?Sized> *mut T { pub fn addr(self) -> usize; pub fn expose_provenance(self) -> usize; pub fn with_addr(self, addr: usize) -> Self; pub fn map_addr(self, f: impl FnOnce(usize) -> usize) -> Self; } impl<T: ?Sized> NonNull<T> { pub fn addr(self) -> NonZero<usize>; pub fn with_addr(self, addr: NonZero<usize>) -> Self; pub fn map_addr(self, f: impl FnOnce(NonZero<usize>) -> NonZero<usize>) -> Self; } ``` I also did a pass over the docs to adjust them, because this is no longer an "experiment". The `ptr` docs now discuss the concept of provenance in general, and then they go into the two families of APIs for dealing with provenance: Strict Provenance and Exposed Provenance. I removed the discussion of how pointers also have an associated "address space" -- that is not actually tracked in the pointer value, it is tracked in the type, so IMO it just distracts from the core point of provenance. I also adjusted the docs for `with_exposed_provenance` to make it clear that we cannot guarantee much about this function, it's all best-effort. There are two unstable lints associated with the strict_provenance feature gate; I moved them to a new [strict_provenance_lints](rust-lang/rust#130351) feature since I didn't want this PR to have an even bigger FCP. ;) `@rust-lang/opsem` Would be great to get some feedback on the docs here. :) Nominating for `@rust-lang/libs-api.` Part of rust-lang/rust#95228. [FCP comment](rust-lang/rust#130350 (comment))
2 parents 1556144 + 9e0205d commit 1497744

37 files changed

+4
-38
lines changed

src/lib.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,6 @@
1111
#![feature(let_chains)]
1212
#![feature(trait_upcasting)]
1313
#![feature(strict_overflow_ops)]
14-
#![feature(strict_provenance)]
15-
#![feature(exposed_provenance)]
1614
#![feature(pointer_is_aligned_to)]
1715
#![feature(unqualified_local_imports)]
1816
// Configure clippy and other lints

tests/fail/dangling_pointers/dangling_pointer_to_raw_pointer.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
#![feature(strict_provenance)]
21
use std::ptr;
32

43
fn direct_raw(x: *const (i32, i32)) -> *const i32 {

tests/fail/dangling_pointers/deref_dangling_box.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
// Should be caught even without retagging
22
//@compile-flags: -Zmiri-disable-stacked-borrows
3-
#![feature(strict_provenance)]
43
use std::ptr::{self, addr_of_mut};
54

65
// Deref'ing a dangling raw pointer is fine, but for a dangling box it is not.

tests/fail/dangling_pointers/deref_dangling_ref.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
// Should be caught even without retagging
22
//@compile-flags: -Zmiri-disable-stacked-borrows
3-
#![feature(strict_provenance)]
43
use std::ptr::{self, addr_of_mut};
54

65
// Deref'ing a dangling raw pointer is fine, but for a dangling reference it is not.

tests/fail/intrinsics/ptr_offset_from_different_ints.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
#![feature(strict_provenance)]
21
use core::ptr;
32

43
fn main() {

tests/fail/provenance/int_copy_looses_provenance3.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
#![feature(strict_provenance)]
21
use std::mem;
32

43
#[repr(C, usize)]

tests/fail/provenance/provenance_transmute.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
//@compile-flags: -Zmiri-permissive-provenance
2-
#![feature(strict_provenance)]
32

43
use std::mem;
54

tests/fail/provenance/ptr_int_unexposed.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
//@compile-flags: -Zmiri-permissive-provenance
2-
#![feature(strict_provenance, exposed_provenance)]
32

43
fn main() {
54
let x: i32 = 3;

tests/fail/provenance/ptr_invalid.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
#![feature(strict_provenance, exposed_provenance)]
21

32
// Ensure that a `ptr::without_provenance` ptr is truly invalid.
43
fn main() {

tests/fail/provenance/ptr_invalid_offset.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
//@compile-flags: -Zmiri-strict-provenance
2-
#![feature(strict_provenance)]
32

43
fn main() {
54
let x = 22;

0 commit comments

Comments
 (0)