Make ptr_cast_add_auto_to_object
lint into hard error
In Rust 1.81, we added a FCW lint (including linting in dependencies) against pointer casts that add an auto trait to dyn bounds. This was part of work making casts of pointers involving trait objects stricter which was needed to restabilize trait upcasting. We considered just making this a hard error at the time, but opted against it due to breakage found by crater. This breakage was mostly due to the `anymap` crate which has been a persistent problem for us. It's now a year later, and the fact that this is not yet a hard error is giving us pause about stabilizing arbitrary self types and `derive(CoercePointee)`. So let's now make a hard error of this.
This commit is contained in:
parent
ed49386d3a
commit
ef337a6599
12 changed files with 109 additions and 112 deletions
41
compiler/rustc_error_codes/src/error_codes/E0804.md
Normal file
41
compiler/rustc_error_codes/src/error_codes/E0804.md
Normal file
|
@ -0,0 +1,41 @@
|
|||
An auto trait cannot be added to the bounds of a `dyn Trait` type via
|
||||
a pointer cast.
|
||||
|
||||
Erroneous code example:
|
||||
|
||||
```rust,edition2021,compile_fail,E0804
|
||||
let ptr: *const dyn core::any::Any = &();
|
||||
_ = ptr as *const (dyn core::any::Any + Send);
|
||||
```
|
||||
|
||||
Adding an auto trait can make the vtable invalid, potentially causing
|
||||
UB in safe code afterwards. For example:
|
||||
|
||||
```rust,edition2021,no_run
|
||||
use core::{mem::transmute, ptr::NonNull};
|
||||
|
||||
trait Trait {
|
||||
fn f(&self)
|
||||
where
|
||||
Self: Send;
|
||||
}
|
||||
|
||||
impl Trait for NonNull<()> {
|
||||
fn f(&self) {
|
||||
unreachable!()
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let unsend: &dyn Trait = &NonNull::dangling();
|
||||
let bad: &(dyn Trait + Send) = unsafe { transmute(unsend) };
|
||||
// This crashes, since the vtable for `NonNull as dyn Trait` does
|
||||
// not have an entry for `Trait::f`.
|
||||
bad.f();
|
||||
}
|
||||
```
|
||||
|
||||
To fix this error, you can use `transmute` rather than pointer casts,
|
||||
but you must ensure that the vtable is valid for the pointer's type
|
||||
before calling a method on the trait object or allowing other code to
|
||||
do so.
|
|
@ -547,6 +547,7 @@ E0800: 0800,
|
|||
E0801: 0801,
|
||||
E0802: 0802,
|
||||
E0803: 0803,
|
||||
E0804: 0804,
|
||||
);
|
||||
)
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue