Change:
<ins> error: dereferencing a null pointer --> $DIR/lint-deref-nullptr.rs:15:18 | LL |         let ub = *(0 as *const i32); |                  ^^^^^^^^^^^^^^^^^^ this code causes undefined behavior when executed | note: the lint level is defined here --> $DIR/lint-deref-nullptr.rs:3:9 | LL | #![deny(deref_nullptr)] |         ^^^^^^^^^^^^^ error: dereferencing a null pointer --> $DIR/lint-deref-nullptr.rs:17:18 | LL |         let ub = *ptr::null::<i32>(); |                  ^^^^^^^^^^^^^^^^^^^ this code causes undefined behavior when executed error: dereferencing a null pointer --> $DIR/lint-deref-nullptr.rs:19:18 | LL |         let ub = *ptr::null_mut::<i32>(); |                  ^^^^^^^^^^^^^^^^^^^^^^^ this code causes undefined behavior when executed error: dereferencing a null pointer --> $DIR/lint-deref-nullptr.rs:21:18 | LL |         let ub = *(ptr::null::<i16>() as *const i32); |                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ this code causes undefined behavior when executed error: dereferencing a null pointer --> $DIR/lint-deref-nullptr.rs:23:18 | LL |         let ub = *(ptr::null::<i16>() as *mut i32 as *mut usize as *const u8); |                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ this code causes undefined behavior when executed error: dereferencing a null pointer --> $DIR/lint-deref-nullptr.rs:25:19 | LL |         let ub = &*ptr::null::<i32>(); |                   ^^^^^^^^^^^^^^^^^^^ this code causes undefined behavior when executed error: dereferencing a null pointer --> $DIR/lint-deref-nullptr.rs:27:19 | LL |         let ub = &*ptr::null_mut::<i32>(); |                   ^^^^^^^^^^^^^^^^^^^^^^^ this code causes undefined behavior when executed error: dereferencing a null pointer --> $DIR/lint-deref-nullptr.rs:29:23 | LL |         ptr::addr_of!(*ptr::null::<i32>()); |                       ^^^^^^^^^^^^^^^^^^^ this code causes undefined behavior when executed error: dereferencing a null pointer --> $DIR/lint-deref-nullptr.rs:31:27 | LL |         ptr::addr_of_mut!(*ptr::null_mut::<i32>()); |                           ^^^^^^^^^^^^^^^^^^^^^^^ this code causes undefined behavior when executed error: dereferencing a null pointer --> $DIR/lint-deref-nullptr.rs:33:36 | LL |         let offset = ptr::addr_of!((*ptr::null::<Struct>()).field); |                                    ^^^^^^^^^^^^^^^^^^^^^^^^ this code causes undefined behavior when executed error: aborting due to 10 previous errors </ins>

Discussion:
I propose we add a lint that detects code like Some people seem to think that this is okay in contexts like or , but that is not the case -- on a NULL pointer is UB even as a place expression. To implement this, you can use the lint as a template: should check for  expressions with a operator, and then check the operand to be either a cast of to a pointer type, or a call to one of the methods. To detect the methods, make them "diagnostic items"; the lint does that e.g. for so it can again serve as a template here. <!-- TRIAGEBOTSTART --<!-- TRIAGEBOTASSIGNSTART --<!-- TRIAGEBOTASSIGNDATASTARTTRIAGEBOTASSIGNDATAEND --<!-- TRIAGEBOTASSIGNEND --<!-- TRIAGEBOTEND --
Ah, turns out clippy already has a lint for this: . So maybe we should just move that to rustc? Cc
claim
awesome. :) Let me know if you need any help.
Thanks :)
Did you mean something slightly different with your "okay in contexts like" examples, perhaps? Neither of those two actually compile as written, since they're just attempts to deference something that isn't even a pointer. You get: in both cases.
oops I screwed up the casts, should be fixed now.
Yeah, happy to have Clippy lints upstreamed to rust, let us know when it's done so we can deprecate it on our end
for detecting a call like you said to use . However I do not know what to use for the symbol argument. There is that defines symbol but nothing looks like creating a null ptr. Should I add one what should it look like ?
You first need to add the diagnostic item attribute to the relevant function inside , like so: This name must be globally unique, e.g. and . Then you add those names to the list in (please keep it alphabetically sorted), and then you can use them for .