2017-04-21 17 views
8

Tôi đã luôn luôn biết rằng thực tế là yêu cầu tiêu chuẩn dereferencing null là UB. Tuy nhiên,Dereference null không phải lúc nào cũng là UB?

(Link 1) nói

p = 0; * p; không phải là lỗi.

và cung cấp một liên kết đến

(Link 2) nói

* p không phải là một lỗi khi p là null trừ vế trái được chuyển đổi thành một giá trị trái

(Tôi tin đó là lỗi đánh máy và có lẽ nên đọc là lvalue được chuyển thành một số rvalue)

Link 1 cũng nói

char * p = 0; char * q = & * (p)

là "không xác định", mà tôi chỉ có thể đọc như cũng xác định hoặc ít nhất thực hiện xác định

thể một luật sư ngôn ngữ cung cấp một giải thích có thẩm quyền về những gì đang xảy ra?

+0

Tôi không phải là luật sư ngôn ngữ nhưng việc đọc các liên kết của tôi là dereferencing là một con trỏ rỗng không có trong chính nó UB, chỉ sử dụng giá trị là. Và có, nó có vẻ là một lỗi đánh máy, nên được giá trị để rvalue, vì đó là cách nó được trích dẫn trong link1. Tôi nghĩ rằng nó có ý nghĩa trong trường hợp thành viên tĩnh, vì chỉ có kiểu tĩnh của 'toán tử *' là cần thiết, và link1 là, theo như tôi thấy, phù hợp với điều đó. – drRobertz

+0

Nếu triển khai thực hiện nó segfault, đó là REALLY UB? Tôi không thể nghĩ ra điều đó. – Donnie

Trả lời

4

Tôi đã khám phá chủ đề về hướng dẫn thông qua con trỏ rỗng trong this answer. Nói tóm lại, nó thực sự được xác định rõ ràng, cũng như được nêu rõ trong các vấn đề cốt lõi được trích dẫn của bạn. Ủy ban đã sử dụng khái niệm về một giá trị rỗng như đã đề xuất từ ​​nhiều năm trước (nhưng chưa bao giờ được chấp nhận); *p được coi là một lvalue rỗng, và trừ khi chúng ta cố gắng truy cập vị trí bộ nhớ (không tồn tại) đằng sau lvalue đó (ví dụ, bằng cách thực hiện chuyển đổi từ rvalue sang rvalue), tất cả các hoạt động khác hoạt động như mong đợi. Ví dụ. &*p tương đương với p, trừ khi p không hợp lệ. (Điều này cũng làm việc cho con trỏ qua-the-end của một mảng, đó là cần thiết cho các thành ngữ phổ biến &arr[n]).

Tôi cũng bắt đầu soạn thảo một paper for empty lvalues (đây là WIP và việc rebase chống lại N4640 chưa hoàn tất), vì vậy, chúng tôi sẽ xem xét thêm điều này ở giai đoạn sau.

Các vấn đề liên quan