Rollup merge of #61969 - MikailBag:master, r=Centril

Add #[repr(transparent)] for several types

In some functions, types mentioned in this PR are transmuted into their inner value.
Example for `PathBuf`: https://github.com/rust-lang/rust/blob/master/src/libstd/path.rs#L1132.
This PR adds `#[repr(transparent)]` to those types, so their correct behavior doesn't depend on compiler details. (As far as I understand, currently that line, converting `PathBuf` to `Vec<u8>`, is UB).
This commit is contained in:
Mark Rousskov 2019-08-11 15:18:38 -04:00 committed by GitHub
commit 88629778e6
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 30 additions and 0 deletions

View file

@ -195,6 +195,12 @@ pub struct CString {
/// [`from_ptr`]: #method.from_ptr /// [`from_ptr`]: #method.from_ptr
#[derive(Hash)] #[derive(Hash)]
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
// FIXME:
// `fn from` in `impl From<&CStr> for Box<CStr>` current implementation relies
// on `CStr` being layout-compatible with `[u8]`.
// When attribute privacy is implemented, `CStr` should be annotated as `#[repr(transparent)]`.
// Anyway, `CStr` representation and layout are considered implementation detail, are
// not documented and must not be relied upon.
pub struct CStr { pub struct CStr {
// FIXME: this should not be represented with a DST slice but rather with // FIXME: this should not be represented with a DST slice but rather with
// just a raw `c_char` along with some form of marker to make // just a raw `c_char` along with some form of marker to make

View file

@ -97,6 +97,12 @@ pub struct OsString {
/// [`String`]: ../string/struct.String.html /// [`String`]: ../string/struct.String.html
/// [conversions]: index.html#conversions /// [conversions]: index.html#conversions
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
// FIXME:
// `OsStr::from_inner` current implementation relies
// on `OsStr` being layout-compatible with `Slice`.
// When attribute privacy is implemented, `OsStr` should be annotated as `#[repr(transparent)]`.
// Anyway, `OsStr` representation and layout are considered implementation detail, are
// not documented and must not be relied upon.
pub struct OsStr { pub struct OsStr {
inner: Slice inner: Slice
} }

View file

@ -1123,6 +1123,12 @@ impl FusedIterator for Ancestors<'_> {}
/// Which method works best depends on what kind of situation you're in. /// Which method works best depends on what kind of situation you're in.
#[derive(Clone)] #[derive(Clone)]
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
// FIXME:
// `PathBuf::as_mut_vec` current implementation relies
// on `PathBuf` being layout-compatible with `Vec<u8>`.
// When attribute privacy is implemented, `PathBuf` should be annotated as `#[repr(transparent)]`.
// Anyway, `PathBuf` representation and layout are considered implementation detail, are
// not documented and must not be relied upon.
pub struct PathBuf { pub struct PathBuf {
inner: OsString, inner: OsString,
} }
@ -1745,6 +1751,12 @@ impl AsRef<OsStr> for PathBuf {
/// assert_eq!(extension, Some(OsStr::new("txt"))); /// assert_eq!(extension, Some(OsStr::new("txt")));
/// ``` /// ```
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
// FIXME:
// `Path::new` current implementation relies
// on `Path` being layout-compatible with `OsStr`.
// When attribute privacy is implemented, `Path` should be annotated as `#[repr(transparent)]`.
// Anyway, `Path` representation and layout are considered implementation detail, are
// not documented and must not be relied upon.
pub struct Path { pub struct Path {
inner: OsStr, inner: OsStr,
} }

View file

@ -18,6 +18,12 @@ pub(crate) struct Buf {
pub inner: Vec<u8> pub inner: Vec<u8>
} }
// FIXME:
// `Buf::as_slice` current implementation relies
// on `Slice` being layout-compatible with `[u8]`.
// When attribute privacy is implemented, `Slice` should be annotated as `#[repr(transparent)]`.
// Anyway, `Slice` representation and layout are considered implementation detail, are
// not documented and must not be relied upon.
pub(crate) struct Slice { pub(crate) struct Slice {
pub inner: [u8] pub inner: [u8]
} }