Dereferenz null ist nicht immer UB?

8

Ich habe immer gewusst, dass die Standardmandate Dereferenzierung null UB ist. Jedoch,

(Link 1) sagt

  

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

und bietet einen Link zu

(Link 2) sagt

  

* p ist kein Fehler, wenn p null ist, es sei denn, der lvalue wird in einen lvalue

konvertiert

(Ich glaube, es ist ein Tippfehler und sollte wahrscheinlich lvalue in einen rvalue umgewandelt werden)

Link 1 sagt auch

  

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

ist "nicht undefiniert", was ich nur als gut definiert oder mindestens implementierungsdefiniert

lesen konnte

Kann ein Sprachanwalt eine verbindliche Erklärung dafür liefern?

    
PoweredByRice 21.04.2017, 03:06
quelle

1 Antwort

4

Ich habe das Thema der Indirektion durch Nullzeiger in diese Antwort . 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 soll ein solcher 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 p , es sei denn p ist ungültig. (Dies funktioniert auch für Zeiger hinter dem Ende eines Arrays, was für das allgemeine Idiom &arr[n] notwendig ist).

Ich fing auch an, ein Papier für leere lvalues ​​ zu entwerfen (das ist WIP und die Rebase gegen N4640 isn ' t noch nicht fertig), also besteht die Chance, dass wir später mehr davon sehen.

    
Columbo 21.04.2017, 11:57
quelle