2017-04-21 2 views
8

Ich habe schon immer gewusst, dass der Standard für die Dereferenzierung von null UB ist. AllerdingsDereferenz null ist nicht immer UB?

(Link 1) sagt

p = 0; * p; ist nicht von Natur aus ein Fehler.

und bietet einen Link zu

(Link 2) sagt

* p kein Fehler ist, wenn p null ist, wenn der L-Wert auf einen L-Wert umgewandelt wird

(ich glaube, es ist ein Tippfehler und sollte wahrscheinlich lesen lvalue wird in einen rvalue umgewandelt)

Verbindung 1 sagt auch

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

ist „nicht undefiniert“, die ich nur als lesen konnte gut definierte oder zumindest Implementierung definiert

eine Sprache Anwalt Kann ein liefern maßgebliche Erklärung dessen, was vor sich geht?

+0

Ich bin kein Anwalt der Sprache, aber mein Lesen der Links ist, dass die Dereferenzierung eines Null-Zeigers in sich nicht UB, nur mit dem Wert ist. Und ja, es scheint ein Tippfehler zu sein, sollte lvalue zu rvalue sein, so wie es in link1 zitiert wird. Ich denke, dass es im statischen Element-Fall sinnvoll ist, da nur der statische Typ von 'operator *' benötigt wird, und link1 ist, soweit ich sehen kann, damit konsistent. – drRobertz

+0

Wenn Implementierungen es segfault machen, ist das wirklich UB? Ich kann mir keine vorstellen, die das nicht tun. – Donnie

Antwort

4

Ich erforschte das Thema der Indirektion durch Nullzeiger in this answer. Kurz gesagt, es ist tatsächlich per se genau definiert, genauso wie es in Ihren zitierten Kernfragen ausgeführt wurde. Das Komitee benutzte die Idee eines leeren Wertes, wie er vor vielen Jahren vorgeschlagen wurde (aber nie angenommen wurde); *p sollte so ein leerer Lvalue sein, und wenn wir nicht versuchen, auf den (nicht vorhandenen) Speicherort hinter diesem Lvalue zuzugreifen (z. B. durch Ausführen einer lvalue-to-rvalue-Konvertierung), verhalten sich alle anderen Operationen wie erwartet. Z.B. &*p entspricht , es sei denn, ist ungültig. (Dies funktioniert auch für Zeiger über das Ende eines Arrays, die für das allgemeine Idiom &arr[n] erforderlich sind).

Ich begann auch eine paper for empty lvalues zu entwerfen (das ist WIP, und die Rebase gegen N4640 ist noch nicht abgeschlossen), also gibt es eine Chance, dass wir mehr von diesem zu einem späteren Zeitpunkt sehen werden.