mirror of
https://github.com/rust-lang/rust.git
synced 2026-05-21 17:52:12 +03:00
Added miri error for evaluating foreign statics.
Updated tests accordingly.
This commit is contained in:
@@ -521,6 +521,7 @@ fn hash_stable<W: StableHasherResult>(&self,
|
||||
InvalidNullPointerUsage |
|
||||
ReadPointerAsBytes |
|
||||
ReadBytesAsPointer |
|
||||
ReadForeignStatic |
|
||||
InvalidPointerMath |
|
||||
ReadUndefBytes |
|
||||
DeadLocal |
|
||||
|
||||
@@ -188,6 +188,7 @@ pub enum EvalErrorKind<'tcx, O> {
|
||||
InvalidNullPointerUsage,
|
||||
ReadPointerAsBytes,
|
||||
ReadBytesAsPointer,
|
||||
ReadForeignStatic,
|
||||
InvalidPointerMath,
|
||||
ReadUndefBytes,
|
||||
DeadLocal,
|
||||
@@ -304,6 +305,8 @@ pub fn description(&self) -> &str {
|
||||
"a raw memory access tried to access part of a pointer value as raw bytes",
|
||||
ReadBytesAsPointer =>
|
||||
"a memory access tried to interpret some bytes as a pointer",
|
||||
ReadForeignStatic =>
|
||||
"tried to read foreign (extern) static",
|
||||
InvalidPointerMath =>
|
||||
"attempted to do invalid arithmetic on pointers that would leak base addresses, e.g. comparing pointers into different allocations",
|
||||
ReadUndefBytes =>
|
||||
|
||||
@@ -506,6 +506,7 @@ fn lift_to_tcx<'b, 'gcx>(&self, tcx: TyCtxt<'b, 'gcx, 'tcx>) -> Option<Self::Lif
|
||||
InvalidNullPointerUsage => InvalidNullPointerUsage,
|
||||
ReadPointerAsBytes => ReadPointerAsBytes,
|
||||
ReadBytesAsPointer => ReadBytesAsPointer,
|
||||
ReadForeignStatic => ReadForeignStatic,
|
||||
InvalidPointerMath => InvalidPointerMath,
|
||||
ReadUndefBytes => ReadUndefBytes,
|
||||
DeadLocal => DeadLocal,
|
||||
|
||||
@@ -374,7 +374,7 @@ fn try_ptr_op<'a>(
|
||||
Ok(None)
|
||||
} else {
|
||||
Err(
|
||||
ConstEvalError::NeedsRfc("Pointer arithmetic or comparison".to_string()).into(),
|
||||
ConstEvalError::NeedsRfc("pointer arithmetic or comparison".to_string()).into(),
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -404,7 +404,7 @@ fn box_alloc<'a>(
|
||||
_dest: Place,
|
||||
) -> EvalResult<'tcx> {
|
||||
Err(
|
||||
ConstEvalError::NeedsRfc("Heap allocations via `box` keyword".to_string()).into(),
|
||||
ConstEvalError::NeedsRfc("heap allocations via `box` keyword".to_string()).into(),
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@@ -279,6 +279,9 @@ pub fn check_bounds(&self, ptr: Pointer, access: bool) -> EvalResult<'tcx> {
|
||||
/// Allocation accessors
|
||||
impl<'a, 'mir, 'tcx, M: Machine<'mir, 'tcx>> Memory<'a, 'mir, 'tcx, M> {
|
||||
fn const_eval_static(&self, def_id: DefId) -> EvalResult<'tcx, &'tcx Allocation> {
|
||||
if self.tcx.is_foreign_item(def_id) {
|
||||
return err!(ReadForeignStatic);
|
||||
}
|
||||
let instance = Instance::mono(self.tcx.tcx, def_id);
|
||||
let gid = GlobalId {
|
||||
instance,
|
||||
|
||||
@@ -29,7 +29,6 @@ const fn sub1() -> u32 {
|
||||
const fn get_Y() -> u32 {
|
||||
Y
|
||||
//~^ ERROR E0013
|
||||
//~| ERROR cannot refer to statics by value
|
||||
}
|
||||
|
||||
const fn get_Y_addr() -> &'static u32 {
|
||||
@@ -49,5 +48,4 @@ const fn get() -> u32 {
|
||||
//~| ERROR let bindings in constant functions are unstable
|
||||
}
|
||||
|
||||
fn main() {
|
||||
}
|
||||
fn main() {}
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
extern {
|
||||
pub static symbol: ();
|
||||
}
|
||||
static CRASH: () = symbol; //~ cannot refer to other statics by value
|
||||
static CRASH: () = symbol;
|
||||
//~^ ERROR constant evaluation error
|
||||
|
||||
fn main() {}
|
||||
|
||||
@@ -22,14 +22,13 @@ struct Struct { a: usize }
|
||||
|
||||
const T5: usize = C;
|
||||
const T6: usize = S; //~ ERROR: constants cannot refer to statics
|
||||
//~^ cannot refer to statics
|
||||
static T7: usize = C;
|
||||
static T8: usize = S; //~ ERROR: cannot refer to other statics by value
|
||||
static T8: usize = S;
|
||||
|
||||
const T9: Struct = Struct { a: C };
|
||||
const T10: Struct = Struct { a: S }; //~ ERROR: cannot refer to statics by value
|
||||
const T10: Struct = Struct { a: S };
|
||||
//~^ ERROR: constants cannot refer to statics
|
||||
static T11: Struct = Struct { a: C };
|
||||
static T12: Struct = Struct { a: S }; //~ ERROR: cannot refer to other statics by value
|
||||
static T12: Struct = Struct { a: S };
|
||||
|
||||
fn main() {}
|
||||
|
||||
@@ -15,6 +15,6 @@
|
||||
}
|
||||
|
||||
pub static BAZ: u32 = *&error_message_count;
|
||||
//~^ ERROR cannot refer to other statics by value
|
||||
//~^ ERROR constant evaluation error
|
||||
|
||||
fn main() {}
|
||||
|
||||
@@ -15,14 +15,12 @@
|
||||
|
||||
static B: u32 = A;
|
||||
//~^ ERROR thread-local statics cannot be accessed at compile-time
|
||||
//~| ERROR cannot refer to other statics by value
|
||||
|
||||
static C: &u32 = &A;
|
||||
//~^ ERROR thread-local statics cannot be accessed at compile-time
|
||||
|
||||
const D: u32 = A;
|
||||
//~^ ERROR thread-local statics cannot be accessed at compile-time
|
||||
//~| ERROR cannot refer to statics by value
|
||||
|
||||
const E: &u32 = &A;
|
||||
//~^ ERROR thread-local statics cannot be accessed at compile-time
|
||||
@@ -30,7 +28,6 @@
|
||||
const fn f() -> u32 {
|
||||
A
|
||||
//~^ ERROR thread-local statics cannot be accessed at compile-time
|
||||
//~| ERROR cannot refer to statics by value
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
|
||||
@@ -11,9 +11,6 @@
|
||||
#![allow(dead_code, warnings)]
|
||||
|
||||
static mut x: isize = 3;
|
||||
static mut y: isize = unsafe {
|
||||
x
|
||||
//~^ ERROR cannot refer to other statics by value, use the address-of operator or a constant instea
|
||||
};
|
||||
static mut y: isize = unsafe { x };
|
||||
|
||||
fn main() {}
|
||||
@@ -10,7 +10,7 @@
|
||||
|
||||
struct S { a: usize }
|
||||
|
||||
static A: S = S { a: 3 };
|
||||
static A: S = S { a: 3 };
|
||||
static B: &'static usize = &A.a;
|
||||
static C: &'static usize = &(A.a);
|
||||
|
||||
@@ -18,4 +18,10 @@ struct S { a: usize }
|
||||
static E: usize = D[0];
|
||||
static F: &'static usize = &D[0];
|
||||
|
||||
fn main() {}
|
||||
fn main() {
|
||||
assert_eq!(*B, A.a);
|
||||
assert_eq!(*B, A.a);
|
||||
|
||||
assert_eq!(E, D[0]);
|
||||
assert_eq!(*F, D[0]);
|
||||
}
|
||||
|
||||
@@ -16,6 +16,5 @@ struct A {
|
||||
|
||||
static B: &'static A = &A { a: &() };
|
||||
static C: &'static A = &B;
|
||||
//~^ ERROR cannot refer to other statics by value
|
||||
|
||||
fn main() {}
|
||||
@@ -10,6 +10,5 @@
|
||||
|
||||
static x: &'static usize = &1;
|
||||
static y: usize = *x;
|
||||
//~^ ERROR cannot refer to other statics by value,
|
||||
// use the address-of operator or a constant instead
|
||||
|
||||
fn main() {}
|
||||
Reference in New Issue
Block a user