Skip to content

Commit 0e2a712

Browse files
committed
more precise vtable errors
1 parent 8998c7a commit 0e2a712

File tree

2 files changed

+23
-20
lines changed

2 files changed

+23
-20
lines changed

src/librustc_mir/interpret/validity.rs

+14-11
Original file line numberDiff line numberDiff line change
@@ -309,11 +309,14 @@ impl<'rt, 'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> ValidityVisitor<'rt, 'mir, '
309309
CheckInAllocMsg::InboundsTest,
310310
),
311311
self.path,
312-
err_ub!(PointerOutOfBounds { .. }) |
313-
err_ub!(AlignmentCheckFailed { .. }) |
314312
err_ub!(DanglingIntPointer(..)) |
313+
err_ub!(PointerUseAfterFree(..)) |
315314
err_unsup!(ReadBytesAsPointer) =>
316-
{ "dangling or unaligned vtable pointer in wide pointer or too small vtable" },
315+
{ "dangling vtable pointer in wide pointer" },
316+
err_ub!(AlignmentCheckFailed { .. }) =>
317+
{ "unaligned vtable pointer in wide pointer" },
318+
err_ub!(PointerOutOfBounds { .. }) =>
319+
{ "too small vtable" },
317320
);
318321
try_validation!(
319322
self.ecx.read_drop_type_from_vtable(vtable),
@@ -322,7 +325,7 @@ impl<'rt, 'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> ValidityVisitor<'rt, 'mir, '
322325
err_ub!(DanglingIntPointer(..)) |
323326
err_ub!(InvalidFunctionPointer(..)) |
324327
err_unsup!(ReadBytesAsPointer) =>
325-
{ "invalid drop fn in vtable" },
328+
{ "invalid drop function pointer in vtable" },
326329
);
327330
try_validation!(
328331
self.ecx.read_size_and_align_from_vtable(vtable),
@@ -387,24 +390,24 @@ impl<'rt, 'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> ValidityVisitor<'rt, 'mir, '
387390
CheckInAllocMsg::InboundsTest,
388391
),
389392
self.path,
390-
err_ub!(DanglingIntPointer(0, _)) =>
391-
{ "a NULL {}", kind },
392-
err_ub!(DanglingIntPointer(i, _)) =>
393-
{ "a {} to unallocated address {}", kind, i },
394393
err_ub!(AlignmentCheckFailed { required, has }) =>
395394
{
396395
"an unaligned {} (required {} byte alignment but found {})",
397396
kind,
398397
required.bytes(),
399398
has.bytes()
400399
},
401-
err_unsup!(ReadBytesAsPointer) =>
402-
{ "a dangling {} (created from integer)", kind },
400+
err_ub!(DanglingIntPointer(0, _)) =>
401+
{ "a NULL {}", kind },
402+
err_ub!(DanglingIntPointer(i, _)) =>
403+
{ "a dangling {} (address {} is unallocated)", kind, i },
403404
err_ub!(PointerOutOfBounds { .. }) =>
404405
{ "a dangling {} (going beyond the bounds of its allocation)", kind },
406+
err_unsup!(ReadBytesAsPointer) =>
407+
{ "a dangling {} (created from integer)", kind },
405408
// This cannot happen during const-eval (because interning already detects
406409
// dangling pointers), but it can happen in Miri.
407-
err_ub!(PointerUseAfterFree(_)) =>
410+
err_ub!(PointerUseAfterFree(..)) =>
408411
{ "a dangling {} (use-after-free)", kind },
409412
);
410413
// Recursive checking

src/test/ui/consts/const-eval/ub-wide-ptr.stderr

+9-9
Original file line numberDiff line numberDiff line change
@@ -138,55 +138,55 @@ error[E0080]: it is undefined behavior to use this value
138138
--> $DIR/ub-wide-ptr.rs:99:1
139139
|
140140
LL | const TRAIT_OBJ_SHORT_VTABLE_1: &dyn Trait = unsafe { mem::transmute((&92u8, &3u8)) };
141-
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered dangling or unaligned vtable pointer in wide pointer or too small vtable
141+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered too small vtable
142142
|
143143
= note: The rules on what exactly is undefined behavior aren't clear, so this check might be overzealous. Please open an issue on the rustc repository if you believe it should not be considered undefined behavior.
144144

145145
error[E0080]: it is undefined behavior to use this value
146146
--> $DIR/ub-wide-ptr.rs:102:1
147147
|
148148
LL | const TRAIT_OBJ_SHORT_VTABLE_2: &dyn Trait = unsafe { mem::transmute((&92u8, &3u64)) };
149-
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered dangling or unaligned vtable pointer in wide pointer or too small vtable
149+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered too small vtable
150150
|
151151
= note: The rules on what exactly is undefined behavior aren't clear, so this check might be overzealous. Please open an issue on the rustc repository if you believe it should not be considered undefined behavior.
152152

153153
error[E0080]: it is undefined behavior to use this value
154154
--> $DIR/ub-wide-ptr.rs:105:1
155155
|
156156
LL | const TRAIT_OBJ_INT_VTABLE: &dyn Trait = unsafe { mem::transmute((&92u8, 4usize)) };
157-
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered dangling or unaligned vtable pointer in wide pointer or too small vtable
157+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered dangling vtable pointer in wide pointer
158158
|
159159
= note: The rules on what exactly is undefined behavior aren't clear, so this check might be overzealous. Please open an issue on the rustc repository if you believe it should not be considered undefined behavior.
160160

161161
error[E0080]: it is undefined behavior to use this value
162162
--> $DIR/ub-wide-ptr.rs:107:1
163163
|
164164
LL | const TRAIT_OBJ_UNALIGNED_VTABLE: &dyn Trait = unsafe { mem::transmute((&92u8, &[0u8; 128])) };
165-
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered dangling or unaligned vtable pointer in wide pointer or too small vtable
165+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered unaligned vtable pointer in wide pointer
166166
|
167167
= note: The rules on what exactly is undefined behavior aren't clear, so this check might be overzealous. Please open an issue on the rustc repository if you believe it should not be considered undefined behavior.
168168

169169
error[E0080]: it is undefined behavior to use this value
170170
--> $DIR/ub-wide-ptr.rs:109:1
171171
|
172172
LL | const TRAIT_OBJ_BAD_DROP_FN_NULL: &dyn Trait = unsafe { mem::transmute((&92u8, &[0usize; 8])) };
173-
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered invalid drop fn in vtable
173+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered invalid drop function pointer in vtable
174174
|
175175
= note: The rules on what exactly is undefined behavior aren't clear, so this check might be overzealous. Please open an issue on the rustc repository if you believe it should not be considered undefined behavior.
176176

177177
error[E0080]: it is undefined behavior to use this value
178178
--> $DIR/ub-wide-ptr.rs:111:1
179179
|
180180
LL | const TRAIT_OBJ_BAD_DROP_FN_INT: &dyn Trait = unsafe { mem::transmute((&92u8, &[1usize; 8])) };
181-
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered invalid drop fn in vtable
181+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered invalid drop function pointer in vtable
182182
|
183183
= note: The rules on what exactly is undefined behavior aren't clear, so this check might be overzealous. Please open an issue on the rustc repository if you believe it should not be considered undefined behavior.
184184

185185
error[E0080]: it is undefined behavior to use this value
186186
--> $DIR/ub-wide-ptr.rs:113:1
187187
|
188188
LL | const TRAIT_OBJ_BAD_DROP_FN_NOT_FN_PTR: &dyn Trait = unsafe { mem::transmute((&92u8, &[&42u8; 8])) };
189-
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered invalid drop fn in vtable
189+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered invalid drop function pointer in vtable
190190
|
191191
= note: The rules on what exactly is undefined behavior aren't clear, so this check might be overzealous. Please open an issue on the rustc repository if you believe it should not be considered undefined behavior.
192192

@@ -202,15 +202,15 @@ error[E0080]: it is undefined behavior to use this value
202202
--> $DIR/ub-wide-ptr.rs:121:1
203203
|
204204
LL | const RAW_TRAIT_OBJ_VTABLE_NULL: *const dyn Trait = unsafe { mem::transmute((&92u8, 0usize)) };
205-
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered dangling or unaligned vtable pointer in wide pointer or too small vtable
205+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered dangling vtable pointer in wide pointer
206206
|
207207
= note: The rules on what exactly is undefined behavior aren't clear, so this check might be overzealous. Please open an issue on the rustc repository if you believe it should not be considered undefined behavior.
208208

209209
error[E0080]: it is undefined behavior to use this value
210210
--> $DIR/ub-wide-ptr.rs:123:1
211211
|
212212
LL | const RAW_TRAIT_OBJ_VTABLE_INVALID: *const dyn Trait = unsafe { mem::transmute((&92u8, &3u64)) };
213-
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered dangling or unaligned vtable pointer in wide pointer or too small vtable
213+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered too small vtable
214214
|
215215
= note: The rules on what exactly is undefined behavior aren't clear, so this check might be overzealous. Please open an issue on the rustc repository if you believe it should not be considered undefined behavior.
216216

0 commit comments

Comments
 (0)