diff options
| author | Jubilee Young <workingjubilee@gmail.com> | 2024-06-24 20:24:10 -0700 |
|---|---|---|
| committer | Jubilee Young <workingjubilee@gmail.com> | 2024-06-24 20:40:33 -0700 |
| commit | 050595a82619515614674b6e5dfe16a123dab9c2 (patch) | |
| tree | 94c0ef8d3d09c340ddd22dd47fdf398195c728f0 | |
| parent | 5a3e2a4e921097c8f2bf6ea7565f8abe878cdbd4 (diff) | |
| download | rust-050595a82619515614674b6e5dfe16a123dab9c2.tar.gz rust-050595a82619515614674b6e5dfe16a123dab9c2.zip | |
core: VaArgSafe is an unsafe trait
`T: VaArgSafe` is relied on for soundness. Safe impls promise nothing. Therefore this must be an unsafe trait. Slightly pedantic, as only core can impl this, but we could choose to unseal the trait. That would allow soundly (but unsafely) implementing this for e.g. a `#[repr(C)] struct` that should be passable by varargs.
| -rw-r--r-- | library/core/src/ffi/mod.rs | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/library/core/src/ffi/mod.rs b/library/core/src/ffi/mod.rs index 618897b3aba..6d1f10f5211 100644 --- a/library/core/src/ffi/mod.rs +++ b/library/core/src/ffi/mod.rs @@ -484,7 +484,7 @@ mod sealed_trait { all supported platforms", issue = "44930" )] - pub trait VaArgSafe {} + pub unsafe trait VaArgSafe {} } macro_rules! impl_va_arg_safe { @@ -494,7 +494,7 @@ macro_rules! impl_va_arg_safe { reason = "the `c_variadic` feature has not been properly tested on \ all supported platforms", issue = "44930")] - impl sealed_trait::VaArgSafe for $t {} + unsafe impl sealed_trait::VaArgSafe for $t {} )+ } } @@ -509,14 +509,15 @@ impl_va_arg_safe! {f64} all supported platforms", issue = "44930" )] -impl<T> sealed_trait::VaArgSafe for *mut T {} +unsafe impl<T> sealed_trait::VaArgSafe for *mut T {} + #[unstable( feature = "c_variadic", reason = "the `c_variadic` feature has not been properly tested on \ all supported platforms", issue = "44930" )] -impl<T> sealed_trait::VaArgSafe for *const T {} +unsafe impl<T> sealed_trait::VaArgSafe for *const T {} #[unstable( feature = "c_variadic", |
