Skip to content

Commit

Permalink
Check for use of mutable/extern statics in THIR unsafeck
Browse files Browse the repository at this point in the history
  • Loading branch information
LeSeulArtichaut committed May 19, 2021
1 parent f94942d commit 32b8657
Show file tree
Hide file tree
Showing 26 changed files with 237 additions and 24 deletions.
11 changes: 9 additions & 2 deletions compiler/rustc_mir_build/src/check_unsafety.rs
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,15 @@ impl<'a, 'tcx> Visitor<'a, 'tcx> for UnsafetyVisitor<'a, 'tcx> {
self.requires_unsafe(expr.span, CallToUnsafeFunction);
}
}
ExprKind::Deref { arg } => {
if let ExprKind::StaticRef { def_id, .. } = self.thir[arg].kind {
if self.tcx.is_mutable_static(def_id) {
self.requires_unsafe(expr.span, UseOfMutableStatic);
} else if self.tcx.is_foreign_item(def_id) {
self.requires_unsafe(expr.span, UseOfExternStatic);
}
}
}
ExprKind::InlineAsm { .. } | ExprKind::LlvmInlineAsm { .. } => {
self.requires_unsafe(expr.span, UseOfInlineAssembly);
}
Expand Down Expand Up @@ -199,9 +208,7 @@ enum UnsafeOpKind {
InitializingTypeWith,
#[allow(dead_code)] // FIXME
CastOfPointerToInt,
#[allow(dead_code)] // FIXME
UseOfMutableStatic,
#[allow(dead_code)] // FIXME
UseOfExternStatic,
#[allow(dead_code)] // FIXME
DerefOfRawPointer,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
error[E0133]: use of extern static is unsafe and requires unsafe function or block
--> $DIR/issue-28575.rs:8:5
--> $DIR/issue-28575.rs:11:5
|
LL | FOO()
| ^^^ use of extern static
Expand Down
3 changes: 3 additions & 0 deletions src/test/ui/intrinsics/issue-28575.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
// revisions: mir thir
// [thir]compile-flags: -Z thir-unsafeck

#![feature(intrinsics)]

extern "C" {
Expand Down
11 changes: 11 additions & 0 deletions src/test/ui/intrinsics/issue-28575.thir.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
error[E0133]: use of extern static is unsafe and requires unsafe function or block
--> $DIR/issue-28575.rs:11:5
|
LL | FOO()
| ^^^ use of extern static
|
= note: extern statics are not controlled by the Rust type system: invalid data, aliasing violations or data races will cause undefined behavior

error: aborting due to previous error

For more information about this error, try `rustc --explain E0133`.
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
error[E0133]: use of extern static is unsafe and requires unsafe function or block
--> $DIR/issue-14227.rs:4:21
--> $DIR/issue-14227.rs:7:21
|
LL | static CRASH: u32 = symbol;
| ^^^^^^ use of extern static
Expand Down
3 changes: 3 additions & 0 deletions src/test/ui/issues/issue-14227.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
// revisions: mir thir
// [thir]compile-flags: -Z thir-unsafeck

extern "C" {
pub static symbol: u32;
}
Expand Down
11 changes: 11 additions & 0 deletions src/test/ui/issues/issue-14227.thir.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
error[E0133]: use of extern static is unsafe and requires unsafe function or block
--> $DIR/issue-14227.rs:7:21
|
LL | static CRASH: u32 = symbol;
| ^^^^^^ use of extern static
|
= note: extern statics are not controlled by the Rust type system: invalid data, aliasing violations or data races will cause undefined behavior

error: aborting due to previous error

For more information about this error, try `rustc --explain E0133`.
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
error[E0015]: calls in statics are limited to constant functions, tuple structs and tuple variants
--> $DIR/issue-16538.rs:11:27
--> $DIR/issue-16538.rs:14:27
|
LL | static foo: *const Y::X = Y::foo(Y::x as *const Y::X);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^

error[E0277]: `*const usize` cannot be shared between threads safely
--> $DIR/issue-16538.rs:11:1
--> $DIR/issue-16538.rs:14:1
|
LL | static foo: *const Y::X = Y::foo(Y::x as *const Y::X);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `*const usize` cannot be shared between threads safely
Expand All @@ -14,7 +14,7 @@ LL | static foo: *const Y::X = Y::foo(Y::x as *const Y::X);
= note: shared static variables must have a type that implements `Sync`

error[E0133]: use of extern static is unsafe and requires unsafe function or block
--> $DIR/issue-16538.rs:11:34
--> $DIR/issue-16538.rs:14:34
|
LL | static foo: *const Y::X = Y::foo(Y::x as *const Y::X);
| ^^^^ use of extern static
Expand Down
3 changes: 3 additions & 0 deletions src/test/ui/issues/issue-16538.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
// revisions: mir thir
// [thir]compile-flags: -Z thir-unsafeck

mod Y {
pub type X = usize;
extern "C" {
Expand Down
27 changes: 27 additions & 0 deletions src/test/ui/issues/issue-16538.thir.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
error[E0015]: calls in statics are limited to constant functions, tuple structs and tuple variants
--> $DIR/issue-16538.rs:14:27
|
LL | static foo: *const Y::X = Y::foo(Y::x as *const Y::X);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^

error[E0277]: `*const usize` cannot be shared between threads safely
--> $DIR/issue-16538.rs:14:1
|
LL | static foo: *const Y::X = Y::foo(Y::x as *const Y::X);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `*const usize` cannot be shared between threads safely
|
= help: the trait `Sync` is not implemented for `*const usize`
= note: shared static variables must have a type that implements `Sync`

error[E0133]: use of extern static is unsafe and requires unsafe function or block
--> $DIR/issue-16538.rs:14:34
|
LL | static foo: *const Y::X = Y::foo(Y::x as *const Y::X);
| ^^^^ use of extern static
|
= note: extern statics are not controlled by the Rust type system: invalid data, aliasing violations or data races will cause undefined behavior

error: aborting due to 3 previous errors

Some errors have detailed explanations: E0015, E0133, E0277.
For more information about an error, try `rustc --explain E0015`.
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
error[E0133]: use of extern static is unsafe and requires unsafe function or block
--> $DIR/issue-28324.rs:5:24
--> $DIR/issue-28324.rs:8:24
|
LL | pub static BAZ: u32 = *&error_message_count;
| ^^^^^^^^^^^^^^^^^^^^ use of extern static
Expand Down
3 changes: 3 additions & 0 deletions src/test/ui/issues/issue-28324.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
// revisions: mir thir
// [thir]compile-flags: -Z thir-unsafeck

extern "C" {
static error_message_count: u32;
}
Expand Down
11 changes: 11 additions & 0 deletions src/test/ui/issues/issue-28324.thir.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
error[E0133]: use of extern static is unsafe and requires unsafe function or block
--> $DIR/issue-28324.rs:8:25
|
LL | pub static BAZ: u32 = *&error_message_count;
| ^^^^^^^^^^^^^^^^^^^ use of extern static
|
= note: extern statics are not controlled by the Rust type system: invalid data, aliasing violations or data races will cause undefined behavior

error: aborting due to previous error

For more information about this error, try `rustc --explain E0133`.
Original file line number Diff line number Diff line change
@@ -1,29 +1,29 @@
error[E0133]: use of mutable static is unsafe and requires unsafe function or block
--> $DIR/safe-extern-statics-mut.rs:11:13
--> $DIR/safe-extern-statics-mut.rs:13:13
|
LL | let b = B;
| ^ use of mutable static
|
= note: mutable statics can be mutated by multiple threads: aliasing violations or data races will cause undefined behavior

error[E0133]: use of mutable static is unsafe and requires unsafe function or block
--> $DIR/safe-extern-statics-mut.rs:12:14
--> $DIR/safe-extern-statics-mut.rs:14:14
|
LL | let rb = &B;
| ^^ use of mutable static
|
= note: mutable statics can be mutated by multiple threads: aliasing violations or data races will cause undefined behavior

error[E0133]: use of mutable static is unsafe and requires unsafe function or block
--> $DIR/safe-extern-statics-mut.rs:13:14
--> $DIR/safe-extern-statics-mut.rs:15:14
|
LL | let xb = XB;
| ^^ use of mutable static
|
= note: mutable statics can be mutated by multiple threads: aliasing violations or data races will cause undefined behavior

error[E0133]: use of mutable static is unsafe and requires unsafe function or block
--> $DIR/safe-extern-statics-mut.rs:14:15
--> $DIR/safe-extern-statics-mut.rs:16:15
|
LL | let xrb = &XB;
| ^^^ use of mutable static
Expand Down
2 changes: 2 additions & 0 deletions src/test/ui/safe-extern-statics-mut.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
// aux-build:extern-statics.rs
// revisions: mir thir
// [thir]compile-flags: -Z thir-unsafeck

extern crate extern_statics;
use extern_statics::*;
Expand Down
35 changes: 35 additions & 0 deletions src/test/ui/safe-extern-statics-mut.thir.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
error[E0133]: use of mutable static is unsafe and requires unsafe function or block
--> $DIR/safe-extern-statics-mut.rs:13:13
|
LL | let b = B;
| ^ use of mutable static
|
= note: mutable statics can be mutated by multiple threads: aliasing violations or data races will cause undefined behavior

error[E0133]: use of mutable static is unsafe and requires unsafe function or block
--> $DIR/safe-extern-statics-mut.rs:14:15
|
LL | let rb = &B;
| ^ use of mutable static
|
= note: mutable statics can be mutated by multiple threads: aliasing violations or data races will cause undefined behavior

error[E0133]: use of mutable static is unsafe and requires unsafe function or block
--> $DIR/safe-extern-statics-mut.rs:15:14
|
LL | let xb = XB;
| ^^ use of mutable static
|
= note: mutable statics can be mutated by multiple threads: aliasing violations or data races will cause undefined behavior

error[E0133]: use of mutable static is unsafe and requires unsafe function or block
--> $DIR/safe-extern-statics-mut.rs:16:16
|
LL | let xrb = &XB;
| ^^ use of mutable static
|
= note: mutable statics can be mutated by multiple threads: aliasing violations or data races will cause undefined behavior

error: aborting due to 4 previous errors

For more information about this error, try `rustc --explain E0133`.
Original file line number Diff line number Diff line change
@@ -1,29 +1,29 @@
error[E0133]: use of extern static is unsafe and requires unsafe function or block
--> $DIR/safe-extern-statics.rs:11:13
--> $DIR/safe-extern-statics.rs:13:13
|
LL | let a = A;
| ^ use of extern static
|
= note: extern statics are not controlled by the Rust type system: invalid data, aliasing violations or data races will cause undefined behavior

error[E0133]: use of extern static is unsafe and requires unsafe function or block
--> $DIR/safe-extern-statics.rs:12:14
--> $DIR/safe-extern-statics.rs:14:14
|
LL | let ra = &A;
| ^^ use of extern static
|
= note: extern statics are not controlled by the Rust type system: invalid data, aliasing violations or data races will cause undefined behavior

error[E0133]: use of extern static is unsafe and requires unsafe function or block
--> $DIR/safe-extern-statics.rs:13:14
--> $DIR/safe-extern-statics.rs:15:14
|
LL | let xa = XA;
| ^^ use of extern static
|
= note: extern statics are not controlled by the Rust type system: invalid data, aliasing violations or data races will cause undefined behavior

error[E0133]: use of extern static is unsafe and requires unsafe function or block
--> $DIR/safe-extern-statics.rs:14:15
--> $DIR/safe-extern-statics.rs:16:15
|
LL | let xra = &XA;
| ^^^ use of extern static
Expand Down
2 changes: 2 additions & 0 deletions src/test/ui/safe-extern-statics.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
// aux-build:extern-statics.rs
// revisions: mir thir
// [thir]compile-flags: -Z thir-unsafeck

extern crate extern_statics;
use extern_statics::*;
Expand Down
35 changes: 35 additions & 0 deletions src/test/ui/safe-extern-statics.thir.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
error[E0133]: use of extern static is unsafe and requires unsafe function or block
--> $DIR/safe-extern-statics.rs:13:13
|
LL | let a = A;
| ^ use of extern static
|
= note: extern statics are not controlled by the Rust type system: invalid data, aliasing violations or data races will cause undefined behavior

error[E0133]: use of extern static is unsafe and requires unsafe function or block
--> $DIR/safe-extern-statics.rs:14:15
|
LL | let ra = &A;
| ^ use of extern static
|
= note: extern statics are not controlled by the Rust type system: invalid data, aliasing violations or data races will cause undefined behavior

error[E0133]: use of extern static is unsafe and requires unsafe function or block
--> $DIR/safe-extern-statics.rs:15:14
|
LL | let xa = XA;
| ^^ use of extern static
|
= note: extern statics are not controlled by the Rust type system: invalid data, aliasing violations or data races will cause undefined behavior

error[E0133]: use of extern static is unsafe and requires unsafe function or block
--> $DIR/safe-extern-statics.rs:16:16
|
LL | let xra = &XA;
| ^^ use of extern static
|
= note: extern statics are not controlled by the Rust type system: invalid data, aliasing violations or data races will cause undefined behavior

error: aborting due to 4 previous errors

For more information about this error, try `rustc --explain E0133`.
Original file line number Diff line number Diff line change
@@ -1,21 +1,21 @@
error[E0133]: use of mutable static is unsafe and requires unsafe function or block
--> $DIR/static-mut-foreign-requires-unsafe.rs:6:5
--> $DIR/static-mut-foreign-requires-unsafe.rs:9:5
|
LL | a += 3;
| ^^^^^^ use of mutable static
|
= note: mutable statics can be mutated by multiple threads: aliasing violations or data races will cause undefined behavior

error[E0133]: use of mutable static is unsafe and requires unsafe function or block
--> $DIR/static-mut-foreign-requires-unsafe.rs:7:5
--> $DIR/static-mut-foreign-requires-unsafe.rs:10:5
|
LL | a = 4;
| ^^^^^ use of mutable static
|
= note: mutable statics can be mutated by multiple threads: aliasing violations or data races will cause undefined behavior

error[E0133]: use of mutable static is unsafe and requires unsafe function or block
--> $DIR/static-mut-foreign-requires-unsafe.rs:8:14
--> $DIR/static-mut-foreign-requires-unsafe.rs:11:14
|
LL | let _b = a;
| ^ use of mutable static
Expand Down
3 changes: 3 additions & 0 deletions src/test/ui/static/static-mut-foreign-requires-unsafe.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
// revisions: mir thir
// [thir]compile-flags: -Z thir-unsafeck

extern "C" {
static mut a: i32;
}
Expand Down
27 changes: 27 additions & 0 deletions src/test/ui/static/static-mut-foreign-requires-unsafe.thir.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
error[E0133]: use of mutable static is unsafe and requires unsafe function or block
--> $DIR/static-mut-foreign-requires-unsafe.rs:9:5
|
LL | a += 3;
| ^ use of mutable static
|
= note: mutable statics can be mutated by multiple threads: aliasing violations or data races will cause undefined behavior

error[E0133]: use of mutable static is unsafe and requires unsafe function or block
--> $DIR/static-mut-foreign-requires-unsafe.rs:10:5
|
LL | a = 4;
| ^ use of mutable static
|
= note: mutable statics can be mutated by multiple threads: aliasing violations or data races will cause undefined behavior

error[E0133]: use of mutable static is unsafe and requires unsafe function or block
--> $DIR/static-mut-foreign-requires-unsafe.rs:11:14
|
LL | let _b = a;
| ^ use of mutable static
|
= note: mutable statics can be mutated by multiple threads: aliasing violations or data races will cause undefined behavior

error: aborting due to 3 previous errors

For more information about this error, try `rustc --explain E0133`.
Loading

0 comments on commit 32b8657

Please sign in to comment.