Added miri error for evaluating foreign statics.

Updated tests accordingly.
This commit is contained in:
Alexander Regueiro
2018-05-29 01:38:18 +01:00
parent 13931762e9
commit 349d53c2a9
14 changed files with 27 additions and 23 deletions
+1
View File
@@ -521,6 +521,7 @@ fn hash_stable<W: StableHasherResult>(&self,
InvalidNullPointerUsage |
ReadPointerAsBytes |
ReadBytesAsPointer |
ReadForeignStatic |
InvalidPointerMath |
ReadUndefBytes |
DeadLocal |
+3
View File
@@ -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 =>
+1
View File
@@ -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,
+2 -2
View File
@@ -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(),
)
}
+3
View File
@@ -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() {}
+2 -1
View File
@@ -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() {}
+1 -1
View File
@@ -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() {}