mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-02 07:22:42 +00:00
Rollup merge of #115607 - RalfJung:safe-traits-unsafe-code, r=dtolnay
clarify that unsafe code must not rely on our safe traits This adds a disclaimer to PartialEq, Eq, PartialOrd, Ord, Hash, Deref, DerefMut. We already have a similar disclaimer in ExactSizeIterator (worded a bit differently): ``` /// Note that this trait is a safe trait and as such does *not* and *cannot* /// guarantee that the returned length is correct. This means that `unsafe` /// code **must not** rely on the correctness of [`Iterator::size_hint`]. The /// unstable and unsafe [`TrustedLen`](super::marker::TrustedLen) trait gives /// this additional guarantee. ``` If there are any other traits that should carry such a disclaimer, please let me know. Fixes https://github.com/rust-lang/rust/issues/73682
This commit is contained in:
commit
c2f228f654
@ -63,6 +63,11 @@ use self::Ordering::*;
|
||||
/// (transitive) impls are not forced to exist, but these requirements apply
|
||||
/// whenever they do exist.
|
||||
///
|
||||
/// Violating these requirements is a logic error. The behavior resulting from a logic error is not
|
||||
/// specified, but users of the trait must ensure that such logic errors do *not* result in
|
||||
/// undefined behavior. This means that `unsafe` code **must not** rely on the correctness of these
|
||||
/// methods.
|
||||
///
|
||||
/// ## Derivable
|
||||
///
|
||||
/// This trait can be used with `#[derive]`. When `derive`d on structs, two
|
||||
@ -250,6 +255,11 @@ pub macro PartialEq($item:item) {
|
||||
/// This property cannot be checked by the compiler, and therefore `Eq` implies
|
||||
/// [`PartialEq`], and has no extra methods.
|
||||
///
|
||||
/// Violating this property is a logic error. The behavior resulting from a logic error is not
|
||||
/// specified, but users of the trait must ensure that such logic errors do *not* result in
|
||||
/// undefined behavior. This means that `unsafe` code **must not** rely on the correctness of these
|
||||
/// methods.
|
||||
///
|
||||
/// ## Derivable
|
||||
///
|
||||
/// This trait can be used with `#[derive]`. When `derive`d, because `Eq` has
|
||||
@ -659,6 +669,11 @@ impl<T: Clone> Clone for Reverse<T> {
|
||||
/// It's easy to accidentally make `cmp` and `partial_cmp` disagree by
|
||||
/// deriving some of the traits and manually implementing others.
|
||||
///
|
||||
/// Violating these requirements is a logic error. The behavior resulting from a logic error is not
|
||||
/// specified, but users of the trait must ensure that such logic errors do *not* result in
|
||||
/// undefined behavior. This means that `unsafe` code **must not** rely on the correctness of these
|
||||
/// methods.
|
||||
///
|
||||
/// ## Corollaries
|
||||
///
|
||||
/// From the above and the requirements of `PartialOrd`, it follows that `<` defines a strict total order.
|
||||
@ -892,6 +907,11 @@ pub macro Ord($item:item) {
|
||||
/// transitively: if `T: PartialOrd<U>` and `U: PartialOrd<V>` then `U: PartialOrd<T>` and `T:
|
||||
/// PartialOrd<V>`.
|
||||
///
|
||||
/// Violating these requirements is a logic error. The behavior resulting from a logic error is not
|
||||
/// specified, but users of the trait must ensure that such logic errors do *not* result in
|
||||
/// undefined behavior. This means that `unsafe` code **must not** rely on the correctness of these
|
||||
/// methods.
|
||||
///
|
||||
/// ## Corollaries
|
||||
///
|
||||
/// The following corollaries follow from the above requirements:
|
||||
|
@ -153,6 +153,11 @@ mod sip;
|
||||
/// Thankfully, you won't need to worry about upholding this property when
|
||||
/// deriving both [`Eq`] and `Hash` with `#[derive(PartialEq, Eq, Hash)]`.
|
||||
///
|
||||
/// Violating this property is a logic error. The behavior resulting from a logic error is not
|
||||
/// specified, but users of the trait must ensure that such logic errors do *not* result in
|
||||
/// undefined behavior. This means that `unsafe` code **must not** rely on the correctness of these
|
||||
/// methods.
|
||||
///
|
||||
/// ## Prefix collisions
|
||||
///
|
||||
/// Implementations of `hash` should ensure that the data they
|
||||
|
@ -14,6 +14,11 @@
|
||||
/// For similar reasons, **this trait should never fail**. Failure during
|
||||
/// dereferencing can be extremely confusing when `Deref` is invoked implicitly.
|
||||
///
|
||||
/// Violating these requirements is a logic error. The behavior resulting from a logic error is not
|
||||
/// specified, but users of the trait must ensure that such logic errors do *not* result in
|
||||
/// undefined behavior. This means that `unsafe` code **must not** rely on the correctness of this
|
||||
/// method.
|
||||
///
|
||||
/// # More on `Deref` coercion
|
||||
///
|
||||
/// If `T` implements `Deref<Target = U>`, and `x` is a value of type `T`, then:
|
||||
@ -114,6 +119,11 @@ impl<T: ?Sized> Deref for &mut T {
|
||||
/// dereferencing can be extremely confusing when `DerefMut` is invoked
|
||||
/// implicitly.
|
||||
///
|
||||
/// Violating these requirements is a logic error. The behavior resulting from a logic error is not
|
||||
/// specified, but users of the trait must ensure that such logic errors do *not* result in
|
||||
/// undefined behavior. This means that `unsafe` code **must not** rely on the correctness of this
|
||||
/// method.
|
||||
///
|
||||
/// # More on `Deref` coercion
|
||||
///
|
||||
/// If `T` implements `DerefMut<Target = U>`, and `x` is a value of type `T`,
|
||||
|
Loading…
Reference in New Issue
Block a user