Disallow statics initializing themselves
This commit is contained in:
parent
2b25c0cd81
commit
af44cdf04f
3 changed files with 37 additions and 3 deletions
|
|
@ -400,7 +400,16 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> Memory<'mir, 'tcx, M> {
|
|||
|
||||
// We can still be zero-sized in this branch, in which case we have to
|
||||
// return `None`.
|
||||
if size.bytes() == 0 { None } else { Some(ptr) }
|
||||
if size.bytes() == 0 {
|
||||
// We may be reading from a static.
|
||||
// In order to ensure that `static FOO: Type = FOO;` causes a cycle error
|
||||
// instead of magically pulling *any* ZST value from the ether, we need to
|
||||
// trigger a read here.
|
||||
self.get_raw(ptr.alloc_id)?;
|
||||
None
|
||||
} else {
|
||||
Some(ptr)
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,6 +1,10 @@
|
|||
// build-pass
|
||||
// This test ensures that we do not allow ZST statics to initialize themselves without ever
|
||||
// actually creating a value of that type. This is important, as the ZST may have private fields
|
||||
// that users can reasonably expect to only get initialized by their own code. Thus unsafe code
|
||||
// can depend on this fact and will thus do unsound things when it is violated.
|
||||
// See https://github.com/rust-lang/rust/issues/71078 for more details.
|
||||
|
||||
static FOO: () = FOO;
|
||||
static FOO: () = FOO; //~ cycle detected when const-evaluating `FOO`
|
||||
|
||||
fn main() {
|
||||
FOO
|
||||
|
|
|
|||
21
src/test/ui/consts/recursive-zst-static.stderr
Normal file
21
src/test/ui/consts/recursive-zst-static.stderr
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
error[E0391]: cycle detected when const-evaluating `FOO`
|
||||
--> $DIR/recursive-zst-static.rs:7:18
|
||||
|
|
||||
LL | static FOO: () = FOO;
|
||||
| ^^^
|
||||
|
|
||||
note: ...which requires const-evaluating `FOO`...
|
||||
--> $DIR/recursive-zst-static.rs:7:1
|
||||
|
|
||||
LL | static FOO: () = FOO;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^
|
||||
= note: ...which again requires const-evaluating `FOO`, completing the cycle
|
||||
note: cycle used when const-evaluating + checking `FOO`
|
||||
--> $DIR/recursive-zst-static.rs:7:1
|
||||
|
|
||||
LL | static FOO: () = FOO;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0391`.
|
||||
Loading…
Add table
Add a link
Reference in a new issue