clippy::cast_possible_wrap, // unsigned -> signed
clippy::cast_sign_loss, // signed -> unsigned
clippy::cast_lossless,
+ clippy::cast_possible_truncation,
)]
extern crate rustc_apfloat;
);
}
- let lineno: u32 = lo.line as u32;
+ // `u32` is not enough to fit line/colno, which can be `usize`. It seems unlikely that a
+ // file would have more than 2^32 lines or columns, but whatever, just default to 0.
+ let lineno: u32 = u32::try_from(lo.line).unwrap_or(0);
// `lo.col` is 0-based - add 1 to make it 1-based for the caller.
- let colno: u32 = lo.col.0 as u32 + 1;
+ let colno: u32 = u32::try_from(lo.col.0 + 1).unwrap_or(0);
let dest = this.force_allocation(dest)?;
if let ty::Adt(adt, _) = dest.layout.ty.kind() {
let align = this.min_align(size, kind);
let ptr = this.allocate_ptr(Size::from_bytes(size), align, kind.into())?;
if zero_init {
- // We just allocated this, the access is definitely in-bounds.
- this.write_bytes_ptr(ptr.into(), iter::repeat(0u8).take(size as usize)).unwrap();
+ // We just allocated this, the access is definitely in-bounds and fits into our address space.
+ this.write_bytes_ptr(
+ ptr.into(),
+ iter::repeat(0u8).take(usize::try_from(size).unwrap()),
+ )
+ .unwrap();
}
Ok(ptr.into())
}
let val = this.read_scalar(val)?.to_i32()?;
let num = this.read_scalar(num)?.to_machine_usize(this)?;
// The docs say val is "interpreted as unsigned char".
- #[allow(clippy::cast_sign_loss)]
+ #[allow(clippy::cast_sign_loss, clippy::cast_possible_truncation)]
let val = val as u8;
if let Some(idx) = this
let val = this.read_scalar(val)?.to_i32()?;
let num = this.read_scalar(num)?.to_machine_usize(this)?;
// The docs say val is "interpreted as unsigned char".
- #[allow(clippy::cast_sign_loss)]
+ #[allow(clippy::cast_sign_loss, clippy::cast_possible_truncation)]
let val = val as u8;
let idx = this
let byte_count = ty_layout.size.checked_mul(count, this).ok_or_else(|| {
err_ub_format!("overflow computing total size of `{intrinsic_name}`")
})?;
- this.write_bytes_ptr(
- ptr,
- iter::repeat(val_byte).take(byte_count.bytes() as usize),
- )?;
+ this.write_bytes_ptr(ptr, iter::repeat(val_byte).take(byte_count.bytes_usize()))?;
}
// Floating-point operations
trace!("read: FD mapped to {:?}", file_descriptor);
// We want to read at most `count` bytes. We are sure that `count` is not negative
// because it was a target's `usize`. Also we are sure that its smaller than
- // `usize::MAX` because it is a host's `isize`.
- let mut bytes = vec![0; count as usize];
+ // `usize::MAX` because it is bounded by the host's `isize`.
+ let mut bytes = vec![0; usize::try_from(count).unwrap()];
// `File::read` never returns a value larger than `count`,
// so this cannot fail.
let result =
} else {
io::stderr().write(buf_cont)
};
- res.ok().map(|n| n as u32)
+ // We write at most `n` bytes, which is a `u32`, so we cannot have written more than that.
+ res.ok().map(|n| u32::try_from(n).unwrap())
} else {
throw_unsup_format!(
"on Windows, writing to anything except stdout/stderr is not supported"
// Initialize with `0`.
this.write_bytes_ptr(
system_info.ptr,
- iter::repeat(0u8).take(system_info.layout.size.bytes() as usize),
+ iter::repeat(0u8).take(system_info.layout.size.bytes_usize()),
)?;
// Set selected fields.
let word_layout = this.machine.layouts.u16;