Prevent ICE in const-prop array oob check

This commit is contained in:
Oliver Scherer 2018-11-08 20:15:13 +01:00
parent 1d834550d5
commit df10965dc0
3 changed files with 21 additions and 8 deletions

View File

@ -591,8 +591,8 @@ fn visit_terminator_kind(
if let TerminatorKind::Assert { expected, msg, cond, .. } = kind {
if let Some(value) = self.eval_operand(cond, source_info) {
trace!("assertion on {:?} should be {:?}", value, expected);
let expected = Immediate::Scalar(Scalar::from_bool(*expected).into());
if expected != value.0.to_immediate() {
let expected = ScalarMaybeUndef::from(Scalar::from_bool(*expected));
if expected != self.ecx.read_scalar(value.0).unwrap() {
// poison all places this operand references so that further code
// doesn't use the invalid value
match cond {
@ -628,20 +628,20 @@ fn visit_terminator_kind(
let len = self
.eval_operand(len, source_info)
.expect("len must be const");
let len = match len.0.to_immediate() {
Immediate::Scalar(ScalarMaybeUndef::Scalar(Scalar::Bits {
let len = match self.ecx.read_scalar(len.0) {
Ok(ScalarMaybeUndef::Scalar(Scalar::Bits {
bits, ..
})) => bits,
_ => bug!("const len not primitive: {:?}", len),
other => bug!("const len not primitive: {:?}", other),
};
let index = self
.eval_operand(index, source_info)
.expect("index must be const");
let index = match index.0.to_immediate() {
Immediate::Scalar(ScalarMaybeUndef::Scalar(Scalar::Bits {
let index = match self.ecx.read_scalar(index.0) {
Ok(ScalarMaybeUndef::Scalar(Scalar::Bits {
bits, ..
})) => bits,
_ => bug!("const index not primitive: {:?}", index),
other => bug!("const index not primitive: {:?}", other),
};
format!(
"index out of bounds: \

View File

@ -0,0 +1,3 @@
fn main() {
[0; 3][3u64 as usize]; //~ ERROR the len is 3 but the index is 3
}

View File

@ -0,0 +1,10 @@
error: index out of bounds: the len is 3 but the index is 3
--> $DIR/const-prop-ice.rs:2:5
|
LL | [0; 3][3u64 as usize]; //~ ERROR the len is 3 but the index is 3
| ^^^^^^^^^^^^^^^^^^^^^
|
= note: #[deny(const_err)] on by default
error: aborting due to previous error