Auto merge of #134424 - 1c3t3a:null-checks, r=saethlin
Insert null checks for pointer dereferences when debug assertions are enabled Similar to how the alignment is already checked, this adds a check for null pointer dereferences in debug mode. It is implemented similarly to the alignment check as a `MirPass`. This inserts checks in the same places as the `CheckAlignment` pass and additionally also inserts checks for `Borrows`, so code like ```rust let ptr: *const u32 = std::ptr::null(); let val: &u32 = unsafe { &*ptr }; ``` will have a check inserted on dereference. This is done because null references are UB. The alignment check doesn't cover these places, because in `&(*ptr).field`, the exact requirement is that the final reference must be aligned. This is something to consider further enhancements of the alignment check. For now this is implemented as a separate `MirPass`, to make it easy to disable this check if necessary. This is related to a 2025H1 project goal for better UB checks in debug mode: https://github.com/rust-lang/rust-project-goals/pull/177. r? `@saethlin`
This commit is contained in:
commit
aa4cfd0809
33 changed files with 551 additions and 164 deletions
|
@ -814,6 +814,9 @@ impl<'a, 'tcx> MirVisitor<'tcx> for MirUsedCollector<'a, 'tcx> {
|
|||
mir::AssertKind::MisalignedPointerDereference { .. } => {
|
||||
push_mono_lang_item(self, LangItem::PanicMisalignedPointerDereference);
|
||||
}
|
||||
mir::AssertKind::NullPointerDereference => {
|
||||
push_mono_lang_item(self, LangItem::PanicNullPointerDereference);
|
||||
}
|
||||
_ => {
|
||||
push_mono_lang_item(self, msg.panic_function());
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue