Detect (non-raw) borrows of null ZST pointers in CheckNull
This commit is contained in:
@@ -40,10 +40,10 @@ pub(crate) enum BorrowCheckMode {
|
||||
/// success and fail the check otherwise.
|
||||
/// This utility will insert a terminator block that asserts on the condition
|
||||
/// and panics on failure.
|
||||
pub(crate) fn check_pointers<'a, 'tcx, F>(
|
||||
pub(crate) fn check_pointers<'tcx, F>(
|
||||
tcx: TyCtxt<'tcx>,
|
||||
body: &mut Body<'tcx>,
|
||||
excluded_pointees: &'a [Ty<'tcx>],
|
||||
excluded_pointees: &[Ty<'tcx>],
|
||||
on_finding: F,
|
||||
borrow_check_mode: BorrowCheckMode,
|
||||
) where
|
||||
@@ -51,6 +51,7 @@ pub(crate) fn check_pointers<'a, 'tcx, F>(
|
||||
/* tcx: */ TyCtxt<'tcx>,
|
||||
/* pointer: */ Place<'tcx>,
|
||||
/* pointee_ty: */ Ty<'tcx>,
|
||||
/* context: */ PlaceContext,
|
||||
/* local_decls: */ &mut IndexVec<Local, LocalDecl<'tcx>>,
|
||||
/* stmts: */ &mut Vec<Statement<'tcx>>,
|
||||
/* source_info: */ SourceInfo,
|
||||
@@ -86,7 +87,7 @@ pub(crate) fn check_pointers<'a, 'tcx, F>(
|
||||
);
|
||||
finder.visit_statement(statement, location);
|
||||
|
||||
for (local, ty) in finder.into_found_pointers() {
|
||||
for (local, ty, context) in finder.into_found_pointers() {
|
||||
debug!("Inserting check for {:?}", ty);
|
||||
let new_block = split_block(basic_blocks, location);
|
||||
|
||||
@@ -98,6 +99,7 @@ pub(crate) fn check_pointers<'a, 'tcx, F>(
|
||||
tcx,
|
||||
local,
|
||||
ty,
|
||||
context,
|
||||
local_decls,
|
||||
&mut block_data.statements,
|
||||
source_info,
|
||||
@@ -125,7 +127,7 @@ struct PointerFinder<'a, 'tcx> {
|
||||
tcx: TyCtxt<'tcx>,
|
||||
local_decls: &'a mut LocalDecls<'tcx>,
|
||||
typing_env: ty::TypingEnv<'tcx>,
|
||||
pointers: Vec<(Place<'tcx>, Ty<'tcx>)>,
|
||||
pointers: Vec<(Place<'tcx>, Ty<'tcx>, PlaceContext)>,
|
||||
excluded_pointees: &'a [Ty<'tcx>],
|
||||
borrow_check_mode: BorrowCheckMode,
|
||||
}
|
||||
@@ -148,7 +150,7 @@ impl<'a, 'tcx> PointerFinder<'a, 'tcx> {
|
||||
}
|
||||
}
|
||||
|
||||
fn into_found_pointers(self) -> Vec<(Place<'tcx>, Ty<'tcx>)> {
|
||||
fn into_found_pointers(self) -> Vec<(Place<'tcx>, Ty<'tcx>, PlaceContext)> {
|
||||
self.pointers
|
||||
}
|
||||
|
||||
@@ -211,7 +213,7 @@ impl<'a, 'tcx> Visitor<'tcx> for PointerFinder<'a, 'tcx> {
|
||||
return;
|
||||
}
|
||||
|
||||
self.pointers.push((pointer, pointee_ty));
|
||||
self.pointers.push((pointer, pointee_ty, context));
|
||||
|
||||
self.super_place(place, context, location);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user