Skip to content

Null ptr check doesn't catch null reference to ZSTs #136568

Closed
@zjp-CN

Description

@zjp-CN

As #134424 recently landed, for the following code, I'd expect the check will catch null reference as Miri does, but actually not:

// Based on the description of PR#134424, but using a ptr to ZST
let ptr: *const () = std::ptr::null();
let _val: &() = unsafe { &*ptr };

As per rust-lang/unsafe-code-guidelines#472 , access to a ptr to ZST is not UB, so *ptr is ok.

$ cargo run
# **No panic** like "null pointer dereference occured"

But it could be better to catch null reference &*ptr:

$ cargo miri run
error: Undefined Behavior: constructing invalid value: encountered a null reference
 --> src/main.rs:3:30
  |
3 |     let _val: &() = unsafe { &*ptr };
  |                              ^^^^^ constructing invalid value: encountered a null reference
  |
  = help: this indicates a bug in the program: it performed an invalid operation, and caused Undefined Behavior
  = help: see https://doc.rust-lang.org/nightly/reference/behavior-considered-undefined.html for further information

Not sure if I put up a real issue. I just thought the check would act on null reference, since in some cases the term pointer may refer to a reference as well.

I guess we need another check for null reference, because null ptr is not harmful, dereferencing to it is harmful, while it doesn't need dereferencing for null reference to be UB.

Metadata

Metadata

Labels

C-bugCategory: This is a bug.T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions