make many ptr functions must_use

https://djugei.github.io/bad-at-unsafe/ describes an error a user had when trying to use offset:

> At first I just assumed that the .add() and .offset() methods on pointers would mutate the pointer. They do not. Instead they return a new pointer, which gets dropped silently if you don't use it. Unlike for example Result, which is must_use annotated.
This commit is contained in:
Steve Klabnik 2020-05-12 11:41:41 -05:00
parent 7faeae0d38
commit aea0186fe5
3 changed files with 14 additions and 0 deletions

View File

@ -1311,6 +1311,7 @@ extern "rust-intrinsic" {
/// ///
/// The stabilized version of this intrinsic is /// The stabilized version of this intrinsic is
/// [`std::pointer::offset`](../../std/primitive.pointer.html#method.offset). /// [`std::pointer::offset`](../../std/primitive.pointer.html#method.offset).
#[must_use = "returns a new pointer rather than modifying its argument"]
pub fn offset<T>(dst: *const T, offset: isize) -> *const T; pub fn offset<T>(dst: *const T, offset: isize) -> *const T;
/// Calculates the offset from a pointer, potentially wrapping. /// Calculates the offset from a pointer, potentially wrapping.
@ -1327,6 +1328,7 @@ extern "rust-intrinsic" {
/// ///
/// The stabilized version of this intrinsic is /// The stabilized version of this intrinsic is
/// [`std::pointer::wrapping_offset`](../../std/primitive.pointer.html#method.wrapping_offset). /// [`std::pointer::wrapping_offset`](../../std/primitive.pointer.html#method.wrapping_offset).
#[must_use = "returns a new pointer rather than modifying its argument"]
pub fn arith_offset<T>(dst: *const T, offset: isize) -> *const T; pub fn arith_offset<T>(dst: *const T, offset: isize) -> *const T;
/// Equivalent to the appropriate `llvm.memcpy.p0i8.0i8.*` intrinsic, with /// Equivalent to the appropriate `llvm.memcpy.p0i8.0i8.*` intrinsic, with

View File

@ -150,6 +150,7 @@ impl<T: ?Sized> *const T {
/// } /// }
/// ``` /// ```
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[must_use = "returns a new pointer rather than modifying its argument"]
#[inline] #[inline]
pub unsafe fn offset(self, count: isize) -> *const T pub unsafe fn offset(self, count: isize) -> *const T
where where
@ -208,6 +209,7 @@ impl<T: ?Sized> *const T {
/// } /// }
/// ``` /// ```
#[stable(feature = "ptr_wrapping_offset", since = "1.16.0")] #[stable(feature = "ptr_wrapping_offset", since = "1.16.0")]
#[must_use = "returns a new pointer rather than modifying its argument"]
#[inline] #[inline]
pub fn wrapping_offset(self, count: isize) -> *const T pub fn wrapping_offset(self, count: isize) -> *const T
where where
@ -390,6 +392,7 @@ impl<T: ?Sized> *const T {
/// } /// }
/// ``` /// ```
#[stable(feature = "pointer_methods", since = "1.26.0")] #[stable(feature = "pointer_methods", since = "1.26.0")]
#[must_use = "returns a new pointer rather than modifying its argument"]
#[inline] #[inline]
pub unsafe fn add(self, count: usize) -> Self pub unsafe fn add(self, count: usize) -> Self
where where
@ -451,6 +454,7 @@ impl<T: ?Sized> *const T {
/// } /// }
/// ``` /// ```
#[stable(feature = "pointer_methods", since = "1.26.0")] #[stable(feature = "pointer_methods", since = "1.26.0")]
#[must_use = "returns a new pointer rather than modifying its argument"]
#[inline] #[inline]
pub unsafe fn sub(self, count: usize) -> Self pub unsafe fn sub(self, count: usize) -> Self
where where
@ -506,6 +510,7 @@ impl<T: ?Sized> *const T {
/// } /// }
/// ``` /// ```
#[stable(feature = "pointer_methods", since = "1.26.0")] #[stable(feature = "pointer_methods", since = "1.26.0")]
#[must_use = "returns a new pointer rather than modifying its argument"]
#[inline] #[inline]
pub fn wrapping_add(self, count: usize) -> Self pub fn wrapping_add(self, count: usize) -> Self
where where
@ -561,6 +566,7 @@ impl<T: ?Sized> *const T {
/// } /// }
/// ``` /// ```
#[stable(feature = "pointer_methods", since = "1.26.0")] #[stable(feature = "pointer_methods", since = "1.26.0")]
#[must_use = "returns a new pointer rather than modifying its argument"]
#[inline] #[inline]
pub fn wrapping_sub(self, count: usize) -> Self pub fn wrapping_sub(self, count: usize) -> Self
where where

View File

@ -144,6 +144,7 @@ impl<T: ?Sized> *mut T {
/// } /// }
/// ``` /// ```
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[must_use = "returns a new pointer rather than modifying its argument"]
#[inline] #[inline]
pub unsafe fn offset(self, count: isize) -> *mut T pub unsafe fn offset(self, count: isize) -> *mut T
where where
@ -201,6 +202,7 @@ impl<T: ?Sized> *mut T {
/// assert_eq!(&data, &[0, 2, 0, 4, 0]); /// assert_eq!(&data, &[0, 2, 0, 4, 0]);
/// ``` /// ```
#[stable(feature = "ptr_wrapping_offset", since = "1.16.0")] #[stable(feature = "ptr_wrapping_offset", since = "1.16.0")]
#[must_use = "returns a new pointer rather than modifying its argument"]
#[inline] #[inline]
pub fn wrapping_offset(self, count: isize) -> *mut T pub fn wrapping_offset(self, count: isize) -> *mut T
where where
@ -436,6 +438,7 @@ impl<T: ?Sized> *mut T {
/// } /// }
/// ``` /// ```
#[stable(feature = "pointer_methods", since = "1.26.0")] #[stable(feature = "pointer_methods", since = "1.26.0")]
#[must_use = "returns a new pointer rather than modifying its argument"]
#[inline] #[inline]
pub unsafe fn add(self, count: usize) -> Self pub unsafe fn add(self, count: usize) -> Self
where where
@ -497,6 +500,7 @@ impl<T: ?Sized> *mut T {
/// } /// }
/// ``` /// ```
#[stable(feature = "pointer_methods", since = "1.26.0")] #[stable(feature = "pointer_methods", since = "1.26.0")]
#[must_use = "returns a new pointer rather than modifying its argument"]
#[inline] #[inline]
pub unsafe fn sub(self, count: usize) -> Self pub unsafe fn sub(self, count: usize) -> Self
where where
@ -552,6 +556,7 @@ impl<T: ?Sized> *mut T {
/// } /// }
/// ``` /// ```
#[stable(feature = "pointer_methods", since = "1.26.0")] #[stable(feature = "pointer_methods", since = "1.26.0")]
#[must_use = "returns a new pointer rather than modifying its argument"]
#[inline] #[inline]
pub fn wrapping_add(self, count: usize) -> Self pub fn wrapping_add(self, count: usize) -> Self
where where
@ -607,6 +612,7 @@ impl<T: ?Sized> *mut T {
/// } /// }
/// ``` /// ```
#[stable(feature = "pointer_methods", since = "1.26.0")] #[stable(feature = "pointer_methods", since = "1.26.0")]
#[must_use = "returns a new pointer rather than modifying its argument"]
#[inline] #[inline]
pub fn wrapping_sub(self, count: usize) -> Self pub fn wrapping_sub(self, count: usize) -> Self
where where