Skip to content

Commit b5a5583

Browse files
authored
Rollup merge of rust-lang#125043 - RalfJung:ref-type-safety-invariant, r=scottmcm
reference type safety invariant docs: clarification The old text could have been read as saying that you can call a function if these requirements are upheld, which is definitely not true as they are an underapproximation of the actual safety invariant. I removed the part about functions relaxing the requirements via their documentation... this seems incoherent with saying that it may actually be unsound to ever temporarily violate the requirement. Furthermore, a function *cannot* just relax this for its return value, that would in general be unsound. And the part about "unsafe code in a safe function may assume these invariants are ensured of arguments passed by the caller" also interacts with relaxing things: clearly, if the invariant has been relaxed, unsafe code cannot rely on it any more. There may be a place to give general guidance on what kinds of function contracts can exist, but the reference type is definitely not the right place to write that down. I also took a clarification from rust-lang#121965 that is orthogonal to the rest of that PR. Cc ```@joshlf``` ```@scottmcm```
2 parents 074b6e0 + 5241e40 commit b5a5583

File tree

1 file changed

+8
-5
lines changed

1 file changed

+8
-5
lines changed

core/src/primitive_docs.rs

+8-5
Original file line numberDiff line numberDiff line change
@@ -1476,14 +1476,17 @@ mod prim_usize {}
14761476
///
14771477
/// For instance, this means that unsafe code in a safe function may assume these invariants are
14781478
/// ensured of arguments passed by the caller, and it may assume that these invariants are ensured
1479-
/// of return values from any safe functions it calls. In most cases, the inverse is also true:
1480-
/// unsafe code must not violate these invariants when passing arguments to safe functions or
1481-
/// returning values from safe functions; such violations may result in undefined behavior. Where
1482-
/// exceptions to this latter requirement exist, they will be called out explicitly in documentation.
1479+
/// of return values from any safe functions it calls.
1480+
///
1481+
/// For the other direction, things are more complicated: when unsafe code passes arguments
1482+
/// to safe functions or returns values from safe functions, they generally must *at least*
1483+
/// not violate these invariants. The full requirements are stronger, as the reference generally
1484+
/// must point to data that is safe to use at type `T`.
14831485
///
14841486
/// It is not decided yet whether unsafe code may violate these invariants temporarily on internal
14851487
/// data. As a consequence, unsafe code which violates these invariants temporarily on internal data
1486-
/// may become unsound in future versions of Rust depending on how this question is decided.
1488+
/// may be unsound or become unsound in future versions of Rust depending on how this question is
1489+
/// decided.
14871490
///
14881491
/// [allocated object]: ptr#allocated-object
14891492
#[stable(feature = "rust1", since = "1.0.0")]

0 commit comments

Comments
 (0)