Skip to content

Commit 07abfb3

Browse files
committed
Throw error instead of panicking for unfittable bits
1 parent e00db1b commit 07abfb3

File tree

1 file changed

+14
-3
lines changed

1 file changed

+14
-3
lines changed

src/helpers.rs

+14-3
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use rustc::hir::def_id::{DefId, CRATE_DEF_INDEX};
44
use rustc::mir;
55
use rustc::ty::{
66
self,
7-
layout::{self, Align, Size, LayoutOf},
7+
layout::{self, Align, LayoutOf, Size},
88
};
99

1010
use rand::RngCore;
@@ -316,11 +316,22 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
316316
let allocation = this.memory_mut().get_mut(ptr.alloc_id)?;
317317
let mut offset = Size::from_bytes(0);
318318

319-
for (value, size) in bits.iter().zip(sizes) {
319+
for (&value, size) in bits.iter().zip(sizes) {
320+
// If `value` does not fit in `size` bits, we error instead of letting
321+
// `Scalar::from_int` panic.
322+
let truncated = truncate(value as u128, size);
323+
if sign_extend(truncated, size) as i128 != value {
324+
throw_unsup_format!(
325+
"Signed value {:#x} does not fit in {} bits",
326+
value,
327+
size.bits()
328+
)
329+
}
330+
320331
allocation.write_scalar(
321332
tcx,
322333
ptr.offset(offset, tcx)?,
323-
Scalar::from_int(*value, size).into(),
334+
Scalar::from_int(value, size).into(),
324335
size,
325336
)?;
326337
offset += size;

0 commit comments

Comments
 (0)