Skip to content

Commit

Permalink
raw slices do not have to comply to the size limit
Browse files Browse the repository at this point in the history
  • Loading branch information
RalfJung committed Aug 26, 2019
1 parent 0c1cb32 commit ae78862
Showing 1 changed file with 5 additions and 14 deletions.
19 changes: 5 additions & 14 deletions src/librustc_mir/interpret/validity.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ use std::ops::RangeInclusive;

use syntax_pos::symbol::{sym, Symbol};
use rustc::hir;
use rustc::ty::layout::{self, Size, TyLayout, LayoutOf, VariantIdx};
use rustc::ty::layout::{self, TyLayout, LayoutOf, VariantIdx};
use rustc::ty;
use rustc_data_structures::fx::FxHashSet;

Expand Down Expand Up @@ -276,20 +276,11 @@ impl<'rt, 'mir, 'tcx, M: Machine<'mir, 'tcx>> ValidityVisitor<'rt, 'mir, 'tcx, M
// FIXME: More checks for the vtable.
}
ty::Slice(..) | ty::Str => {
let len = try_validation!(meta.unwrap().to_usize(self.ecx),
let _len = try_validation!(meta.unwrap().to_usize(self.ecx),
"non-integer slice length in wide pointer", self.path);
// check max slice length
let elem_size = match tail.sty {
ty::Str => Size::from_bytes(1),
ty::Slice(ty) => self.ecx.layout_of(ty)?.size,
_ => bug!("It cannot be another type"),
};
if elem_size.checked_mul(len, &*self.ecx.tcx).is_none() {
throw_validation_failure!(
"too large slice (longer than isize::MAX bytes)",
self.path
);
}
// We do not check that `len * elem_size <= isize::MAX`:
// that is only required for references, and there it falls out of the
// "dereferencable" check performed by Stacked Borrows.
}
ty::Foreign(..) => {
// Unsized, but not wide.
Expand Down

0 comments on commit ae78862

Please sign in to comment.