2017-04-21 11 views
8

저는 표준 참조가 역 참조 인 null이 UB라는 사실을 항상 알고있었습니다. 그러나Dereference null이 항상 UB가 아닙니까?

(Link 1) 말한다

p = 0; *피; 본질적으로 오류가 아닙니다.

(Link 2)에 대한 링크를 제공는 좌변이 저는 믿습니다 (좌변

로 변환되지 않는 페이지가 null의 경우

* P가 오류가 아닙니다 말한다 오타이고 아마도 읽어야합니다 왼쪽 값이 의 오른쪽 값으로 변환됩니다)

링크 1은 말한다

숯 * p = 0; 난 단지로 읽을 수의 char * Q = & * (P)

는 "정의되지"입니다, 또는 적어도 잘 정의 구현 정의

는 언어 변호사는를 제공 할 수 있습니다 무슨 일이 일어나고 있는지에 대한 권위있는 설명?

+0

저는 언어 변호사가 아니지만 링크를 읽는 것은 그 자체로 UB가 아닌 null 포인터를 역 참조하는 것입니다. 값만 사용하는 것입니다. 그리고 예, 오타가있는 것으로 보입니다. 값이 1에 가까워 야합니다. 링크 1에서 인용 된 것입니다. static 멤버 인 경우에는 'operator *'의 정적 유형 만 필요하고, link1은 알 수있는 한 일관성이 있으므로 정적 멤버 경우에는 의미가 있다고 생각합니다. – drRobertz

+0

구현을 통해 세그 폴트가 발생하는 경우 실제로 그 UB입니까? 나는 그런 것들을 생각할 수 없다. – Donnie

답변

4

this answer에 null 포인터를 통한 간접 참조 주제를 살펴 보았습니다. 간단히 말해서, 그것은 분명히 그 자체로 잘 정의 된 핵심 핵심 문제에서 정교합니다. 위원회는 수년 전에 제안 된대로 (그러나 채택 된 적이없는) 빈 값의 개념을 사용했다. *p은 그런 비어있는 lvalue로되어 있고, lvalue 뒤에있는 (존재하지 않는) 메모리 위치에 액세스하려고 시도하지 않으면 (예를 들어, lvalue에서 rvalue 로의 변환을 수행하여) 다른 모든 연산은 예상대로 작동합니다. 예 : &*pp이 유효하지 않으면 p과 같습니다. (이것은 일반적인 어법 인 &arr[n]에 필요한 배열의 끝을 가리키는 포인터에도 적용됩니다).

나는 또한 paper for empty lvalues의 초안을 만들었으며 (이것은 WIP이며 N4640에 대한 rebase는 아직 완료되지 않았습니다), 나중에 더 많은 것을 보게 될 것입니다.