提交 349d53c2 编写于 作者: A Alexander Regueiro

Added miri error for evaluating foreign statics.

Updated tests accordingly.
上级 13931762
......@@ -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() {}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册