tweak pointer out-of-bounds error message
This commit is contained in:
parent
bd874a9d5d
commit
4e28065618
@ -181,8 +181,8 @@ pub enum CheckInAllocMsg {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl fmt::Display for CheckInAllocMsg {
|
impl fmt::Display for CheckInAllocMsg {
|
||||||
/// When this is printed as an error the context looks like this
|
/// When this is printed as an error the context looks like this:
|
||||||
/// "{msg}pointer must be in-bounds at offset..."
|
/// "{msg}0x01 is not a valid pointer".
|
||||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||||
write!(
|
write!(
|
||||||
f,
|
f,
|
||||||
@ -318,14 +318,24 @@ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|||||||
PointerUseAfterFree(a) => {
|
PointerUseAfterFree(a) => {
|
||||||
write!(f, "pointer to {} was dereferenced after this allocation got freed", a)
|
write!(f, "pointer to {} was dereferenced after this allocation got freed", a)
|
||||||
}
|
}
|
||||||
|
PointerOutOfBounds { alloc_id, offset, size: Size::ZERO, msg, allocation_size } => {
|
||||||
|
write!(
|
||||||
|
f,
|
||||||
|
"{}{} has size {}, so pointer at offset {} is out-of-bounds",
|
||||||
|
msg,
|
||||||
|
alloc_id,
|
||||||
|
allocation_size.bytes(),
|
||||||
|
offset.bytes(),
|
||||||
|
)
|
||||||
|
}
|
||||||
PointerOutOfBounds { alloc_id, offset, size, msg, allocation_size } => write!(
|
PointerOutOfBounds { alloc_id, offset, size, msg, allocation_size } => write!(
|
||||||
f,
|
f,
|
||||||
"{}pointer must be in-bounds for {} bytes at offset {}, but {} has size {}",
|
"{}{} has size {}, so pointer to {} bytes starting at offset {} is out-of-bounds",
|
||||||
msg,
|
msg,
|
||||||
|
alloc_id,
|
||||||
|
allocation_size.bytes(),
|
||||||
size.bytes(),
|
size.bytes(),
|
||||||
offset.bytes(),
|
offset.bytes(),
|
||||||
alloc_id,
|
|
||||||
allocation_size.bytes()
|
|
||||||
),
|
),
|
||||||
DanglingIntPointer(0, CheckInAllocMsg::InboundsTest) => {
|
DanglingIntPointer(0, CheckInAllocMsg::InboundsTest) => {
|
||||||
write!(f, "null pointer is not a valid pointer for this operation")
|
write!(f, "null pointer is not a valid pointer for this operation")
|
||||||
|
@ -4,7 +4,7 @@ error[E0080]: evaluation of constant value failed
|
|||||||
LL | unsafe { copy_nonoverlapping(src, dst, count) }
|
LL | unsafe { copy_nonoverlapping(src, dst, count) }
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
| |
|
| |
|
||||||
| memory access failed: pointer must be in-bounds for 4 bytes at offset 4, but alloc7 has size 4
|
| memory access failed: alloc7 has size 4, so pointer to 4 bytes starting at offset 4 is out-of-bounds
|
||||||
| inside `copy_nonoverlapping::<u32>` at $SRC_DIR/core/src/intrinsics.rs:LL:COL
|
| inside `copy_nonoverlapping::<u32>` at $SRC_DIR/core/src/intrinsics.rs:LL:COL
|
||||||
|
|
|
|
||||||
::: $SRC_DIR/core/src/ptr/mod.rs:LL:COL
|
::: $SRC_DIR/core/src/ptr/mod.rs:LL:COL
|
||||||
@ -23,7 +23,7 @@ error[E0080]: evaluation of constant value failed
|
|||||||
LL | unsafe { copy_nonoverlapping(src, dst, count) }
|
LL | unsafe { copy_nonoverlapping(src, dst, count) }
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
| |
|
| |
|
||||||
| memory access failed: pointer must be in-bounds for 4 bytes at offset 4, but alloc7 has size 4
|
| memory access failed: alloc7 has size 4, so pointer to 4 bytes starting at offset 4 is out-of-bounds
|
||||||
| inside `copy_nonoverlapping::<u32>` at $SRC_DIR/core/src/intrinsics.rs:LL:COL
|
| inside `copy_nonoverlapping::<u32>` at $SRC_DIR/core/src/intrinsics.rs:LL:COL
|
||||||
|
|
|
|
||||||
::: $SRC_DIR/core/src/ptr/mod.rs:LL:COL
|
::: $SRC_DIR/core/src/ptr/mod.rs:LL:COL
|
||||||
@ -47,7 +47,7 @@ error[E0080]: evaluation of constant value failed
|
|||||||
LL | unsafe { copy_nonoverlapping(src, dst, count) }
|
LL | unsafe { copy_nonoverlapping(src, dst, count) }
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
| |
|
| |
|
||||||
| memory access failed: pointer must be in-bounds for 4 bytes at offset 4, but alloc7 has size 4
|
| memory access failed: alloc7 has size 4, so pointer to 4 bytes starting at offset 4 is out-of-bounds
|
||||||
| inside `copy_nonoverlapping::<u32>` at $SRC_DIR/core/src/intrinsics.rs:LL:COL
|
| inside `copy_nonoverlapping::<u32>` at $SRC_DIR/core/src/intrinsics.rs:LL:COL
|
||||||
|
|
|
|
||||||
::: $SRC_DIR/core/src/ptr/mod.rs:LL:COL
|
::: $SRC_DIR/core/src/ptr/mod.rs:LL:COL
|
||||||
|
@ -13,7 +13,7 @@ error[E0080]: evaluation of constant value failed
|
|||||||
--> $DIR/ub-nonnull.rs:19:30
|
--> $DIR/ub-nonnull.rs:19:30
|
||||||
|
|
|
|
||||||
LL | let out_of_bounds_ptr = &ptr[255];
|
LL | let out_of_bounds_ptr = &ptr[255];
|
||||||
| ^^^^^^^^ dereferencing pointer failed: pointer must be in-bounds for 256 bytes at offset 0, but alloc11 has size 1
|
| ^^^^^^^^ dereferencing pointer failed: alloc11 has size 1, so pointer to 256 bytes starting at offset 0 is out-of-bounds
|
||||||
|
|
||||||
error[E0080]: it is undefined behavior to use this value
|
error[E0080]: it is undefined behavior to use this value
|
||||||
--> $DIR/ub-nonnull.rs:23:1
|
--> $DIR/ub-nonnull.rs:23:1
|
||||||
|
@ -13,7 +13,7 @@ error[E0080]: evaluation of constant value failed
|
|||||||
--> $DIR/ub-nonnull.rs:19:30
|
--> $DIR/ub-nonnull.rs:19:30
|
||||||
|
|
|
|
||||||
LL | let out_of_bounds_ptr = &ptr[255];
|
LL | let out_of_bounds_ptr = &ptr[255];
|
||||||
| ^^^^^^^^ dereferencing pointer failed: pointer must be in-bounds for 256 bytes at offset 0, but alloc11 has size 1
|
| ^^^^^^^^ dereferencing pointer failed: alloc11 has size 1, so pointer to 256 bytes starting at offset 0 is out-of-bounds
|
||||||
|
|
||||||
error[E0080]: it is undefined behavior to use this value
|
error[E0080]: it is undefined behavior to use this value
|
||||||
--> $DIR/ub-nonnull.rs:23:1
|
--> $DIR/ub-nonnull.rs:23:1
|
||||||
|
@ -302,7 +302,7 @@ error[E0080]: could not evaluate static initializer
|
|||||||
--> $DIR/ub-wide-ptr.rs:139:5
|
--> $DIR/ub-wide-ptr.rs:139:5
|
||||||
|
|
|
|
||||||
LL | mem::transmute::<_, &dyn Trait>((&92u8, &3u64))
|
LL | mem::transmute::<_, &dyn Trait>((&92u8, &3u64))
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ memory access failed: pointer must be in-bounds for 12 bytes at offset N, but allocN has size N
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ memory access failed: allocN has size N, so pointer to 12 bytes starting at offset N is out-of-bounds
|
||||||
|
|
||||||
error: aborting due to 28 previous errors
|
error: aborting due to 28 previous errors
|
||||||
|
|
||||||
|
@ -302,7 +302,7 @@ error[E0080]: could not evaluate static initializer
|
|||||||
--> $DIR/ub-wide-ptr.rs:139:5
|
--> $DIR/ub-wide-ptr.rs:139:5
|
||||||
|
|
|
|
||||||
LL | mem::transmute::<_, &dyn Trait>((&92u8, &3u64))
|
LL | mem::transmute::<_, &dyn Trait>((&92u8, &3u64))
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ memory access failed: pointer must be in-bounds for 24 bytes at offset N, but allocN has size N
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ memory access failed: allocN has size N, so pointer to 24 bytes starting at offset N is out-of-bounds
|
||||||
|
|
||||||
error: aborting due to 28 previous errors
|
error: aborting due to 28 previous errors
|
||||||
|
|
||||||
|
@ -24,20 +24,21 @@
|
|||||||
let mut x = 0i32;
|
let mut x = 0i32;
|
||||||
let dangle = (&mut x as *mut i32).wrapping_add(10);
|
let dangle = (&mut x as *mut i32).wrapping_add(10);
|
||||||
// Even if the first ptr is an int ptr and this is a ZST copy, we should detect dangling 2nd ptrs.
|
// Even if the first ptr is an int ptr and this is a ZST copy, we should detect dangling 2nd ptrs.
|
||||||
copy_nonoverlapping(0x100 as *const i32, dangle, 0); //~ evaluation of constant value failed [E0080]
|
copy_nonoverlapping(0x100 as *const i32, dangle, 0); //~ ERROR evaluation of constant value failed [E0080]
|
||||||
|
//~| pointer at offset 40 is out-of-bounds
|
||||||
};
|
};
|
||||||
const COPY_OOB_2: () = unsafe {
|
const COPY_OOB_2: () = unsafe {
|
||||||
let x = 0i32;
|
let x = 0i32;
|
||||||
let dangle = (&x as *const i32).wrapping_add(10);
|
let dangle = (&x as *const i32).wrapping_add(10);
|
||||||
// Even if the second ptr is an int ptr and this is a ZST copy, we should detect dangling 1st ptrs.
|
// Even if the second ptr is an int ptr and this is a ZST copy, we should detect dangling 1st ptrs.
|
||||||
copy_nonoverlapping(dangle, 0x100 as *mut i32, 0); //~ evaluation of constant value failed [E0080]
|
copy_nonoverlapping(dangle, 0x100 as *mut i32, 0); //~ ERROR evaluation of constant value failed [E0080]
|
||||||
//~| memory access failed: pointer must be in-bounds
|
//~| pointer at offset 40 is out-of-bounds
|
||||||
};
|
};
|
||||||
|
|
||||||
const COPY_SIZE_OVERFLOW: () = unsafe {
|
const COPY_SIZE_OVERFLOW: () = unsafe {
|
||||||
let x = 0;
|
let x = 0;
|
||||||
let mut y = 0;
|
let mut y = 0;
|
||||||
copy(&x, &mut y, 1usize << (mem::size_of::<usize>() * 8 - 1)); //~ evaluation of constant value failed [E0080]
|
copy(&x, &mut y, 1usize << (mem::size_of::<usize>() * 8 - 1)); //~ ERROR evaluation of constant value failed [E0080]
|
||||||
//~| overflow computing total size of `copy`
|
//~| overflow computing total size of `copy`
|
||||||
};
|
};
|
||||||
const COPY_NONOVERLAPPING_SIZE_OVERFLOW: () = unsafe {
|
const COPY_NONOVERLAPPING_SIZE_OVERFLOW: () = unsafe {
|
||||||
|
@ -2,22 +2,22 @@ error[E0080]: evaluation of constant value failed
|
|||||||
--> $DIR/copy-intrinsic.rs:27:5
|
--> $DIR/copy-intrinsic.rs:27:5
|
||||||
|
|
|
|
||||||
LL | copy_nonoverlapping(0x100 as *const i32, dangle, 0);
|
LL | copy_nonoverlapping(0x100 as *const i32, dangle, 0);
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ memory access failed: pointer must be in-bounds for 0 bytes at offset 40, but alloc5 has size 4
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ memory access failed: alloc5 has size 4, so pointer at offset 40 is out-of-bounds
|
||||||
|
|
||||||
error[E0080]: evaluation of constant value failed
|
error[E0080]: evaluation of constant value failed
|
||||||
--> $DIR/copy-intrinsic.rs:33:5
|
--> $DIR/copy-intrinsic.rs:34:5
|
||||||
|
|
|
|
||||||
LL | copy_nonoverlapping(dangle, 0x100 as *mut i32, 0);
|
LL | copy_nonoverlapping(dangle, 0x100 as *mut i32, 0);
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ memory access failed: pointer must be in-bounds for 0 bytes at offset 40, but alloc7 has size 4
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ memory access failed: alloc7 has size 4, so pointer at offset 40 is out-of-bounds
|
||||||
|
|
||||||
error[E0080]: evaluation of constant value failed
|
error[E0080]: evaluation of constant value failed
|
||||||
--> $DIR/copy-intrinsic.rs:40:5
|
--> $DIR/copy-intrinsic.rs:41:5
|
||||||
|
|
|
|
||||||
LL | copy(&x, &mut y, 1usize << (mem::size_of::<usize>() * 8 - 1));
|
LL | copy(&x, &mut y, 1usize << (mem::size_of::<usize>() * 8 - 1));
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ overflow computing total size of `copy`
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ overflow computing total size of `copy`
|
||||||
|
|
||||||
error[E0080]: evaluation of constant value failed
|
error[E0080]: evaluation of constant value failed
|
||||||
--> $DIR/copy-intrinsic.rs:46:5
|
--> $DIR/copy-intrinsic.rs:47:5
|
||||||
|
|
|
|
||||||
LL | copy_nonoverlapping(&x, &mut y, 1usize << (mem::size_of::<usize>() * 8 - 1));
|
LL | copy_nonoverlapping(&x, &mut y, 1usize << (mem::size_of::<usize>() * 8 - 1));
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ overflow computing total size of `copy_nonoverlapping`
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ overflow computing total size of `copy_nonoverlapping`
|
||||||
|
@ -18,7 +18,7 @@ error[E0080]: evaluation of constant value failed
|
|||||||
LL | unsafe { intrinsics::offset(self, count) }
|
LL | unsafe { intrinsics::offset(self, count) }
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
| |
|
| |
|
||||||
| pointer arithmetic failed: pointer must be in-bounds for 2 bytes at offset 0, but allocN has size 1
|
| pointer arithmetic failed: allocN has size 1, so pointer to 2 bytes starting at offset 0 is out-of-bounds
|
||||||
| inside `ptr::const_ptr::<impl *const u8>::offset` at $SRC_DIR/core/src/ptr/const_ptr.rs:LL:COL
|
| inside `ptr::const_ptr::<impl *const u8>::offset` at $SRC_DIR/core/src/ptr/const_ptr.rs:LL:COL
|
||||||
|
|
|
|
||||||
::: $DIR/offset_ub.rs:9:43
|
::: $DIR/offset_ub.rs:9:43
|
||||||
@ -32,7 +32,7 @@ error[E0080]: evaluation of constant value failed
|
|||||||
LL | unsafe { intrinsics::offset(self, count) }
|
LL | unsafe { intrinsics::offset(self, count) }
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
| |
|
| |
|
||||||
| pointer arithmetic failed: pointer must be in-bounds for 101 bytes at offset 0, but allocN has size 100
|
| pointer arithmetic failed: allocN has size 100, so pointer to 101 bytes starting at offset 0 is out-of-bounds
|
||||||
| inside `ptr::const_ptr::<impl *const u8>::offset` at $SRC_DIR/core/src/ptr/const_ptr.rs:LL:COL
|
| inside `ptr::const_ptr::<impl *const u8>::offset` at $SRC_DIR/core/src/ptr/const_ptr.rs:LL:COL
|
||||||
|
|
|
|
||||||
::: $DIR/offset_ub.rs:10:45
|
::: $DIR/offset_ub.rs:10:45
|
||||||
@ -102,7 +102,7 @@ error[E0080]: evaluation of constant value failed
|
|||||||
LL | unsafe { intrinsics::offset(self, count) }
|
LL | unsafe { intrinsics::offset(self, count) }
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
| |
|
| |
|
||||||
| pointer arithmetic failed: pointer must be in-bounds for 1 bytes at offset 0, but allocN has size 0
|
| pointer arithmetic failed: allocN has size 0, so pointer to 1 bytes starting at offset 0 is out-of-bounds
|
||||||
| inside `ptr::const_ptr::<impl *const u8>::offset` at $SRC_DIR/core/src/ptr/const_ptr.rs:LL:COL
|
| inside `ptr::const_ptr::<impl *const u8>::offset` at $SRC_DIR/core/src/ptr/const_ptr.rs:LL:COL
|
||||||
|
|
|
|
||||||
::: $DIR/offset_ub.rs:17:50
|
::: $DIR/offset_ub.rs:17:50
|
||||||
|
@ -63,7 +63,7 @@ macro_rules! check {
|
|||||||
const _: *const u8 =
|
const _: *const u8 =
|
||||||
unsafe { std::ptr::addr_of!((*(FOO as *const usize as *const [u8; 1000]))[999]) };
|
unsafe { std::ptr::addr_of!((*(FOO as *const usize as *const [u8; 1000]))[999]) };
|
||||||
//~^ ERROR evaluation of constant value failed
|
//~^ ERROR evaluation of constant value failed
|
||||||
//~| pointer must be in-bounds
|
//~| out-of-bounds
|
||||||
|
|
||||||
const _: usize = unsafe { std::mem::transmute::<*const usize, usize>(FOO) + 4 };
|
const _: usize = unsafe { std::mem::transmute::<*const usize, usize>(FOO) + 4 };
|
||||||
//~^ ERROR any use of this value will cause an error
|
//~^ ERROR any use of this value will cause an error
|
||||||
|
@ -4,7 +4,7 @@ error[E0080]: evaluation of constant value failed
|
|||||||
LL | unsafe { intrinsics::offset(self, count) }
|
LL | unsafe { intrinsics::offset(self, count) }
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
| |
|
| |
|
||||||
| pointer arithmetic failed: pointer must be in-bounds for $TWO_WORDS bytes at offset 0, but alloc3 has size $WORD
|
| pointer arithmetic failed: alloc3 has size $WORD, so pointer to $TWO_WORDS bytes starting at offset 0 is out-of-bounds
|
||||||
| inside `ptr::const_ptr::<impl *const usize>::offset` at $SRC_DIR/core/src/ptr/const_ptr.rs:LL:COL
|
| inside `ptr::const_ptr::<impl *const usize>::offset` at $SRC_DIR/core/src/ptr/const_ptr.rs:LL:COL
|
||||||
|
|
|
|
||||||
::: $DIR/ptr_comparisons.rs:61:34
|
::: $DIR/ptr_comparisons.rs:61:34
|
||||||
@ -16,7 +16,7 @@ error[E0080]: evaluation of constant value failed
|
|||||||
--> $DIR/ptr_comparisons.rs:64:33
|
--> $DIR/ptr_comparisons.rs:64:33
|
||||||
|
|
|
|
||||||
LL | unsafe { std::ptr::addr_of!((*(FOO as *const usize as *const [u8; 1000]))[999]) };
|
LL | unsafe { std::ptr::addr_of!((*(FOO as *const usize as *const [u8; 1000]))[999]) };
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ dereferencing pointer failed: pointer must be in-bounds for 1000 bytes at offset 0, but alloc3 has size $WORD
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ dereferencing pointer failed: alloc3 has size $WORD, so pointer to 1000 bytes starting at offset 0 is out-of-bounds
|
||||||
|
|
||||||
error: any use of this value will cause an error
|
error: any use of this value will cause an error
|
||||||
--> $DIR/ptr_comparisons.rs:68:27
|
--> $DIR/ptr_comparisons.rs:68:27
|
||||||
|
Loading…
Reference in New Issue
Block a user