fmt, tweak messages and bless

This commit is contained in:
Ralf Jung 2020-03-08 19:44:09 +01:00
parent f5efb68a24
commit d02543a453
14 changed files with 88 additions and 70 deletions

View File

@ -14,7 +14,7 @@
use rustc_macros::HashStable;
use rustc_session::CtfeBacktrace;
use rustc_span::{Pos, Span, def_id::DefId};
use std::{any::Any, env, fmt};
use std::{any::Any, fmt};
#[derive(Debug, Copy, Clone, PartialEq, Eq, HashStable, RustcEncodable, RustcDecodable)]
pub enum ErrorHandled {
@ -326,7 +326,10 @@ pub enum UndefinedBehaviorInfo {
/// An enum discriminant was set to a value which was outside the range of valid values.
InvalidDiscriminant(ScalarMaybeUndef),
/// A slice/array index projection went out-of-bounds.
BoundsCheckFailed { len: u64, index: u64 },
BoundsCheckFailed {
len: u64,
index: u64,
},
/// Something was divided by 0 (x / 0).
DivisionByZero,
/// Something was "remainded" by 0 (x % 0).
@ -395,16 +398,14 @@ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
"reading a null-terminated string starting at {:?} with no null found before end of allocation",
p,
),
PointerUseAfterFree(a) => write!(
f,
"pointer to allocation {:?} was dereferenced after allocation got freed",
a
),
PointerUseAfterFree(a) => {
write!(f, "pointer to {:?} was dereferenced after this allocation got freed", a)
}
InvalidNullPointerUsage => write!(f, "invalid use of NULL pointer"),
PointerOutOfBounds { ptr, msg, allocation_size } => write!(
f,
"{} failed: pointer must be in-bounds at offset {}, \
but is outside bounds of allocation {} which has size {}",
but is outside bounds of {} which has size {}",
msg,
ptr.offset.bytes(),
ptr.alloc_id,
@ -416,16 +417,23 @@ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
has.bytes(),
required.bytes()
),
WriteToReadOnly(a) => write!(f, "writing to read-only allocation {:?}", a),
WriteToReadOnly(a) => write!(f, "writing to {:?} which is read-only", a),
InvalidFunctionPointer(p) => {
write!(f, "using {:?} as function pointer but it does not point to a function", p)
}
DerefFunctionPointer(a) => write!(f, "accessing data behind function pointer allocation {:?}", a),
DerefFunctionPointer(a) => write!(f, "accessing {:?} which contains a function", a),
ValidationFailure(ref err) => write!(f, "type validation failed: {}", err),
InvalidBool(b) => write!(f, "interpreting an invalid 8-bit value as a bool: {}", b),
InvalidChar(c) => write!(f, "interpreting an invalid 32-bit value as a char: {}", c),
InvalidUndefBytes(Some(p)) => write!(f, "reading uninitialized memory at {:?}, but this operation requires initialized memory", p),
InvalidUndefBytes(None) => write!(f, "using uninitialized data, but this operation requires initialized memory"),
InvalidUndefBytes(Some(p)) => write!(
f,
"reading uninitialized memory at {:?}, but this operation requires initialized memory",
p
),
InvalidUndefBytes(None) => write!(
f,
"using uninitialized data, but this operation requires initialized memory"
),
DeadLocal => write!(f, "accessing a dead local variable"),
ReadFromReturnPlace => write!(f, "tried to read from the return place"),
}
@ -472,7 +480,9 @@ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
ConstPropUnsupported(ref msg) => {
write!(f, "Constant propagation encountered an unsupported situation: {}", msg)
}
ReadForeignStatic(did) => write!(f, "tried to read from foreign (extern) static {:?}", did),
ReadForeignStatic(did) => {
write!(f, "tried to read from foreign (extern) static {:?}", did)
}
NoMirFor(did) => write!(f, "could not load MIR for {:?}", did),
ModifiedStatic => write!(
f,
@ -480,13 +490,8 @@ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
initializer"
),
ReadPointerAsBytes => write!(
f,
"unable to turn this pointer into raw bytes",
),
ReadBytesAsPointer => {
write!(f, "unable to turn these bytes into a pointer")
}
ReadPointerAsBytes => write!(f, "unable to turn this pointer into raw bytes",),
ReadBytesAsPointer => write!(f, "unable to turn these bytes into a pointer"),
}
}
}

View File

@ -215,7 +215,10 @@ pub fn reallocate(
kind: MemoryKind<M::MemoryKinds>,
) -> InterpResult<'tcx, Pointer<M::PointerTag>> {
if ptr.offset.bytes() != 0 {
throw_ub_format!("reallocating {:?} which does not point to the beginning of an object", ptr);
throw_ub_format!(
"reallocating {:?} which does not point to the beginning of an object",
ptr
);
}
// For simplicities' sake, we implement reallocate as "alloc, copy, dealloc".
@ -251,7 +254,10 @@ pub fn deallocate(
trace!("deallocating: {}", ptr.alloc_id);
if ptr.offset.bytes() != 0 {
throw_ub_format!("deallocating {:?} which does not point to the beginning of an object", ptr);
throw_ub_format!(
"deallocating {:?} which does not point to the beginning of an object",
ptr
);
}
let (alloc_kind, mut alloc) = match self.alloc_map.remove(&ptr.alloc_id) {
@ -260,8 +266,9 @@ pub fn deallocate(
// Deallocating static memory -- always an error
return Err(match self.tcx.alloc_map.lock().get(ptr.alloc_id) {
Some(GlobalAlloc::Function(..)) => err_ub_format!("deallocating a function"),
Some(GlobalAlloc::Static(..)) | Some(GlobalAlloc::Memory(..)) =>
err_ub_format!("deallocating static memory"),
Some(GlobalAlloc::Static(..)) | Some(GlobalAlloc::Memory(..)) => {
err_ub_format!("deallocating static memory")
}
None => err_ub!(PointerUseAfterFree(ptr.alloc_id)),
}
.into());
@ -269,13 +276,20 @@ pub fn deallocate(
};
if alloc_kind != kind {
throw_ub_format!("deallocating `{:?}` memory using `{:?}` deallocation operation", alloc_kind, kind);
throw_ub_format!(
"deallocating `{:?}` memory using `{:?}` deallocation operation",
alloc_kind,
kind
);
}
if let Some((size, align)) = old_size_and_align {
if size != alloc.size || align != alloc.align {
throw_ub_format!(
"incorrect layout on deallocation: allocation has size {} and alignment {}, but gave size {} and alignment {}",
alloc.size.bytes(), alloc.align.bytes(), size.bytes(), align.bytes(),
alloc.size.bytes(),
alloc.align.bytes(),
size.bytes(),
align.bytes(),
)
}
}
@ -370,7 +384,8 @@ fn check_offset_align(offset: u64, align: Align) -> InterpResult<'static> {
// It is sufficient to check this for the end pointer. The addition
// checks for overflow.
let end_ptr = ptr.offset(size, self)?;
if end_ptr.offset > allocation_size { // equal is okay!
if end_ptr.offset > allocation_size {
// equal is okay!
throw_ub!(PointerOutOfBounds { ptr: end_ptr.erase_tag(), msg, allocation_size })
}
// Test align. Check this last; if both bounds and alignment are violated

View File

@ -356,18 +356,16 @@ fn check_safe_pointer(
err_ub!(InvalidNullPointerUsage) => {
throw_validation_failure!(format_args!("a NULL {}", kind), self.path)
}
err_ub!(AlignmentCheckFailed { required, has }) => {
throw_validation_failure!(
format_args!(
"an unaligned {} \
err_ub!(AlignmentCheckFailed { required, has }) => throw_validation_failure!(
format_args!(
"an unaligned {} \
(required {} byte alignment but found {})",
kind,
required.bytes(),
has.bytes()
),
self.path
)
}
kind,
required.bytes(),
has.bytes()
),
self.path
),
err_unsup!(ReadBytesAsPointer) => throw_validation_failure!(
format_args!("a dangling {} (created from integer)", kind),
self.path

View File

@ -12,7 +12,7 @@ error: any use of this value will cause an error
LL | const I32_REF_U8_UNION: u8 = unsafe { Nonsense { int_32_ref: &3 }.uint_8 };
| --------------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^---
| |
| a raw memory access tried to access part of a pointer value as raw bytes
| unable to turn this pointer into raw bytes
|
= note: `#[deny(const_err)]` on by default
@ -22,7 +22,7 @@ error: any use of this value will cause an error
LL | const I32_REF_U16_UNION: u16 = unsafe { Nonsense { int_32_ref: &3 }.uint_16 };
| ----------------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^---
| |
| a raw memory access tried to access part of a pointer value as raw bytes
| unable to turn this pointer into raw bytes
error: any use of this value will cause an error
--> $DIR/const-pointer-values-in-various-types.rs:34:45
@ -30,7 +30,7 @@ error: any use of this value will cause an error
LL | const I32_REF_U32_UNION: u32 = unsafe { Nonsense { int_32_ref: &3 }.uint_32 };
| ----------------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^---
| |
| a raw memory access tried to access part of a pointer value as raw bytes
| unable to turn this pointer into raw bytes
error[E0080]: it is undefined behavior to use this value
--> $DIR/const-pointer-values-in-various-types.rs:37:5
@ -54,7 +54,7 @@ error: any use of this value will cause an error
LL | const I32_REF_I8_UNION: i8 = unsafe { Nonsense { int_32_ref: &3 }.int_8 };
| --------------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^---
| |
| a raw memory access tried to access part of a pointer value as raw bytes
| unable to turn this pointer into raw bytes
error: any use of this value will cause an error
--> $DIR/const-pointer-values-in-various-types.rs:46:45
@ -62,7 +62,7 @@ error: any use of this value will cause an error
LL | const I32_REF_I16_UNION: i16 = unsafe { Nonsense { int_32_ref: &3 }.int_16 };
| ----------------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^---
| |
| a raw memory access tried to access part of a pointer value as raw bytes
| unable to turn this pointer into raw bytes
error: any use of this value will cause an error
--> $DIR/const-pointer-values-in-various-types.rs:49:45
@ -70,7 +70,7 @@ error: any use of this value will cause an error
LL | const I32_REF_I32_UNION: i32 = unsafe { Nonsense { int_32_ref: &3 }.int_32 };
| ----------------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^---
| |
| a raw memory access tried to access part of a pointer value as raw bytes
| unable to turn this pointer into raw bytes
error[E0080]: it is undefined behavior to use this value
--> $DIR/const-pointer-values-in-various-types.rs:52:5
@ -94,7 +94,7 @@ error: any use of this value will cause an error
LL | const I32_REF_F32_UNION: f32 = unsafe { Nonsense { int_32_ref: &3 }.float_32 };
| ----------------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^---
| |
| a raw memory access tried to access part of a pointer value as raw bytes
| unable to turn this pointer into raw bytes
error[E0080]: it is undefined behavior to use this value
--> $DIR/const-pointer-values-in-various-types.rs:61:5
@ -110,7 +110,7 @@ error: any use of this value will cause an error
LL | const I32_REF_BOOL_UNION: bool = unsafe { Nonsense { int_32_ref: &3 }.truthy_falsey };
| ------------------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^---
| |
| a raw memory access tried to access part of a pointer value as raw bytes
| unable to turn this pointer into raw bytes
error: any use of this value will cause an error
--> $DIR/const-pointer-values-in-various-types.rs:67:47
@ -118,7 +118,7 @@ error: any use of this value will cause an error
LL | const I32_REF_CHAR_UNION: char = unsafe { Nonsense { int_32_ref: &3 }.character };
| ------------------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^---
| |
| a raw memory access tried to access part of a pointer value as raw bytes
| unable to turn this pointer into raw bytes
error: any use of this value will cause an error
--> $DIR/const-pointer-values-in-various-types.rs:70:39
@ -126,7 +126,7 @@ error: any use of this value will cause an error
LL | const STR_U8_UNION: u8 = unsafe { Nonsense { stringy: "3" }.uint_8 };
| ----------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^---
| |
| a raw memory access tried to access part of a pointer value as raw bytes
| unable to turn this pointer into raw bytes
error: any use of this value will cause an error
--> $DIR/const-pointer-values-in-various-types.rs:73:41
@ -134,7 +134,7 @@ error: any use of this value will cause an error
LL | const STR_U16_UNION: u16 = unsafe { Nonsense { stringy: "3" }.uint_16 };
| ------------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^---
| |
| a raw memory access tried to access part of a pointer value as raw bytes
| unable to turn this pointer into raw bytes
error: any use of this value will cause an error
--> $DIR/const-pointer-values-in-various-types.rs:76:41
@ -142,7 +142,7 @@ error: any use of this value will cause an error
LL | const STR_U32_UNION: u32 = unsafe { Nonsense { stringy: "3" }.uint_32 };
| ------------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^---
| |
| a raw memory access tried to access part of a pointer value as raw bytes
| unable to turn this pointer into raw bytes
error[E0080]: it is undefined behavior to use this value
--> $DIR/const-pointer-values-in-various-types.rs:79:5
@ -158,7 +158,7 @@ error: any use of this value will cause an error
LL | const STR_U128_UNION: u128 = unsafe { Nonsense { stringy: "3" }.uint_128 };
| --------------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^---
| |
| a raw memory access tried to access part of a pointer value as raw bytes
| unable to turn this pointer into raw bytes
error: any use of this value will cause an error
--> $DIR/const-pointer-values-in-various-types.rs:85:39
@ -166,7 +166,7 @@ error: any use of this value will cause an error
LL | const STR_I8_UNION: i8 = unsafe { Nonsense { stringy: "3" }.int_8 };
| ----------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^---
| |
| a raw memory access tried to access part of a pointer value as raw bytes
| unable to turn this pointer into raw bytes
error: any use of this value will cause an error
--> $DIR/const-pointer-values-in-various-types.rs:88:41
@ -174,7 +174,7 @@ error: any use of this value will cause an error
LL | const STR_I16_UNION: i16 = unsafe { Nonsense { stringy: "3" }.int_16 };
| ------------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^---
| |
| a raw memory access tried to access part of a pointer value as raw bytes
| unable to turn this pointer into raw bytes
error: any use of this value will cause an error
--> $DIR/const-pointer-values-in-various-types.rs:91:41
@ -182,7 +182,7 @@ error: any use of this value will cause an error
LL | const STR_I32_UNION: i32 = unsafe { Nonsense { stringy: "3" }.int_32 };
| ------------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^---
| |
| a raw memory access tried to access part of a pointer value as raw bytes
| unable to turn this pointer into raw bytes
error[E0080]: it is undefined behavior to use this value
--> $DIR/const-pointer-values-in-various-types.rs:94:5
@ -198,7 +198,7 @@ error: any use of this value will cause an error
LL | const STR_I128_UNION: i128 = unsafe { Nonsense { stringy: "3" }.int_128 };
| --------------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^---
| |
| a raw memory access tried to access part of a pointer value as raw bytes
| unable to turn this pointer into raw bytes
error: any use of this value will cause an error
--> $DIR/const-pointer-values-in-various-types.rs:100:41
@ -206,7 +206,7 @@ error: any use of this value will cause an error
LL | const STR_F32_UNION: f32 = unsafe { Nonsense { stringy: "3" }.float_32 };
| ------------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^---
| |
| a raw memory access tried to access part of a pointer value as raw bytes
| unable to turn this pointer into raw bytes
error[E0080]: it is undefined behavior to use this value
--> $DIR/const-pointer-values-in-various-types.rs:103:5
@ -222,7 +222,7 @@ error: any use of this value will cause an error
LL | const STR_BOOL_UNION: bool = unsafe { Nonsense { stringy: "3" }.truthy_falsey };
| --------------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^---
| |
| a raw memory access tried to access part of a pointer value as raw bytes
| unable to turn this pointer into raw bytes
error: any use of this value will cause an error
--> $DIR/const-pointer-values-in-various-types.rs:109:43
@ -230,7 +230,7 @@ error: any use of this value will cause an error
LL | const STR_CHAR_UNION: char = unsafe { Nonsense { stringy: "3" }.character };
| --------------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^---
| |
| a raw memory access tried to access part of a pointer value as raw bytes
| unable to turn this pointer into raw bytes
error: aborting due to 29 previous errors

View File

@ -30,7 +30,7 @@ error: any use of this value will cause an error
LL | const Z2: i32 = unsafe { *(42 as *const i32) };
| -------------------------^^^^^^^^^^^^^^^^^^^---
| |
| a memory access tried to interpret some bytes as a pointer
| unable to turn these bytes into a pointer
error: any use of this value will cause an error
--> $DIR/const_raw_ptr_ops.rs:17:26
@ -38,7 +38,7 @@ error: any use of this value will cause an error
LL | const Z3: i32 = unsafe { *(44 as *const i32) };
| -------------------------^^^^^^^^^^^^^^^^^^^---
| |
| a memory access tried to interpret some bytes as a pointer
| unable to turn these bytes into a pointer
error: aborting due to 5 previous errors

View File

@ -4,7 +4,7 @@ error: any use of this value will cause an error
LL | const X: u64 = *wat(42);
| ---------------^^^^^^^^-
| |
| dangling pointer was dereferenced
| pointer to alloc2 was dereferenced after this allocation got freed
|
= note: `#[deny(const_err)]` on by default

View File

@ -13,7 +13,7 @@ LL | / const OUT_OF_BOUNDS_PTR: NonNull<u8> = { unsafe {
LL | | let ptr: &[u8; 256] = mem::transmute(&0u8); // &0 gets promoted so it does not dangle
LL | | // Use address-of-element for pointer arithmetic. This could wrap around to NULL!
LL | | let out_of_bounds_ptr = &ptr[255];
| | ^^^^^^^^^ Memory access failed: pointer must be in-bounds at offset 256, but is outside bounds of allocation 8 which has size 1
| | ^^^^^^^^^ Memory access failed: pointer must be in-bounds at offset 256, but is outside bounds of alloc8 which has size 1
LL | | mem::transmute(out_of_bounds_ptr)
LL | | } };
| |____-

View File

@ -6,7 +6,7 @@
use std::mem;
// normalize-stderr-test "offset \d+" -> "offset N"
// normalize-stderr-test "allocation \d+" -> "allocation N"
// normalize-stderr-test "alloc\d+" -> "allocN"
// normalize-stderr-test "size \d+" -> "size N"
#[repr(C)]

View File

@ -192,7 +192,7 @@ error[E0080]: could not evaluate static initializer
--> $DIR/ub-wide-ptr.rs:125:5
|
LL | mem::transmute::<_, &dyn Trait>((&92u8, &3u64))
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Memory access failed: pointer must be in-bounds at offset N, but is outside bounds of allocation N which has size N
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Memory access failed: pointer must be in-bounds at offset N, but is outside bounds of allocN which has size N
error: aborting due to 24 previous errors

View File

@ -5,7 +5,7 @@ LL | / const FOO: &() = {
LL | | let y = ();
LL | | unsafe { Foo { y: &y }.long_live_the_unit }
LL | | };
| |__^ type validation failed: encountered dangling pointer in final constant
| |__^ encountered dangling pointer in final constant
|
= note: `#[deny(const_err)]` on by default

View File

@ -5,7 +5,7 @@ LL | / const FOO: *const u32 = {
LL | | let x = 42;
LL | | &x
LL | | };
| |__^ type validation failed: encountered dangling pointer in final constant
| |__^ encountered dangling pointer in final constant
|
= note: `#[deny(const_err)]` on by default

View File

@ -16,7 +16,7 @@ error: any use of this value will cause an error
LL | my_fn();
| ^^^^^^^
| |
| tried to call a function with ABI C using caller ABI Rust
| calling a function with ABI C using caller ABI Rust
| inside call to `call_rust_fn` at $DIR/abi-mismatch.rs:13:17
...
LL | const VAL: () = call_rust_fn(unsafe { std::mem::transmute(c_fn as extern "C" fn()) });

View File

@ -11,7 +11,7 @@ LL | / const MUTATING_BEHIND_RAW: () = {
LL | | // Test that `MUTABLE_BEHIND_RAW` is actually immutable, by doing this at const time.
LL | | unsafe {
LL | | *MUTABLE_BEHIND_RAW = 99
| | ^^^^^^^^^^^^^^^^^^^^^^^^ tried to modify constant memory
| | ^^^^^^^^^^^^^^^^^^^^^^^^ writing to alloc1 which is read-only
LL | | }
LL | | };
| |__-

View File

@ -26,7 +26,7 @@ error: any use of this value will cause an error
LL | intrinsics::ptr_offset_from(self, origin)
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
| |
| a memory access tried to interpret some bytes as a pointer
| unable to turn these bytes into a pointer
| inside call to `std::ptr::const_ptr::<impl *const u8>::offset_from` at $DIR/offset_from_ub.rs:28:14
|
::: $DIR/offset_from_ub.rs:26:1
@ -81,7 +81,7 @@ error: any use of this value will cause an error
LL | intrinsics::ptr_offset_from(self, origin)
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
| |
| a memory access tried to interpret some bytes as a pointer
| unable to turn these bytes into a pointer
| inside call to `std::ptr::const_ptr::<impl *const u8>::offset_from` at $DIR/offset_from_ub.rs:49:14
|
::: $DIR/offset_from_ub.rs:45:1