Ist die Dereferenzierung eines Zeigers, der nullptr entspricht, durch den Standard undefiniertes Verhalten?C++

Programme in C++. Entwicklerforum
Anonymous
 Ist die Dereferenzierung eines Zeigers, der nullptr entspricht, durch den Standard undefiniertes Verhalten?

Post by Anonymous »

Ein Blog-Autor hat die Diskussion über die Dereferenzierung von Nullzeigern angesprochen.
Ich habe hier einige Gegenargumente angeführt.
Seine Hauptargumentation zum Zitieren des Standards lautet wie folgt:

Der Ausdruck „&podhd->line6“ ist undefiniertes Verhalten in der C-Sprache, wenn „podhd“ vorhanden ist ein Nullzeiger.
Der C99-Standard sagt Folgendes über den „&“-Adress-of-Operator
(6.5.3.2 „Adress- und Indirektionsoperatoren“):
Der Operand des unären &-Operators muss entweder ein Funktionsbezeichner, das Ergebnis eines []- oder unären *-Operators oder ein L-Wert sein, der
ein Objekt bezeichnet, das es ist kein Bitfeld und wird nicht mit
dem Register-Speicherklassenspezifizierer deklariert.
Der Ausdruck „podhd->line6“ ist eindeutig kein Funktionsbezeichner,
das Ergebnis eines []- oder *-Operators. Es handelt sich um einen L-Wert-Ausdruck. Wenn jedoch
der „podhd“-Zeiger NULL ist, bezeichnet der Ausdruck kein
Objekt, da 6.3.2.3 „Zeiger“ sagt:
Wenn eine Nullzeigerkonstante in einen Zeigertyp konvertiert wird, ist der
resultierende Zeiger, der als Nullzeiger bezeichnet wird, garantiert ungleich mit einem Zeiger auf ein beliebiges Objekt oder eine Funktion.
Wenn „ein L-Wert bei der Auswertung kein Objekt bezeichnet, ist das Verhalten undefiniert“ (C99 6.3.2.1 „L-Werte, Arrays und Funktionsbezeichner“):
Ein L-Wert ist ein Ausdruck mit einem Objekttyp oder einem unvollständigen Typ
außer void; Wenn ein L-Wert kein Objekt bezeichnet, wenn er
ausgewertet wird, ist das Verhalten undefiniert.
Also, die gleiche Idee in Kürze:
Als -> auf dem Zeiger ausgeführt wurde, wurde es zu einem L-Wert ausgewertet, bei dem
kein Objekt existiert, und als Ergebnis ist das Verhalten undefiniert.

Diese Frage ist rein sprachbasiert, ich frage nicht, ob ein bestimmtes System es erlaubt, das zu manipulieren, was an Adresse 0 in einer beliebigen Sprache liegt.
Soweit ich sehen kann, gibt es keine Einschränkung bei der Dereferenzierung einer Zeigervariablen, deren Wert gleich nullptr ist, selbst wenn man Vergleiche eines Zeigers mit nullptr (oder (void *) 0) berücksichtigt. Die Konstante kann bei Optimierungen in bestimmten Situationen aufgrund der angegebenen Absätze verschwinden, aber das scheint ein weiteres Problem zu sein, es verhindert nicht die Dereferenzierung eines Zeigers, dessen Wert gleich nullptr ist. Beachten Sie, dass ich andere SO-Fragen und -Antworten überprüft habe. Mir gefallen diese Zitate sowie die Standardzitate oben besonders gut, und ich bin nicht auf etwas gestoßen, das eindeutig aus dem Standard ableitet, dass, wenn ein Zeiger ptr mit nullptr verglichen wird, eine Dereferenzierung ein undefiniertes Verhalten wäre.
Was ich höchstens bekomme, ist die Deferierung der Konstante (oder ihre Umwandlung in einen beliebigen Zeiger). type) ist das, was UB ist, aber es sagt nichts über eine Variable aus, deren Bit dem Wert entspricht, der von nullptr kommt.
Ich möchte die nullptr-Konstante klar von einer Zeigervariablen trennen, die einen ihr gleichen Wert enthält. Aber eine Antwort, die beide Fälle anspricht, ist ideal.
Mir ist klar, dass Optimierungen schnell eingreifen können, wenn Vergleiche mit nullptr usw. durchgeführt werden, und möglicherweise einfach darauf basierenden Code entfernen.
Wenn die Schlussfolgerung lautet, dass, wenn ptr dem Wert von nullptr entspricht, die Dereferenzierung definitiv UB ist, folgt eine weitere Frage:
Implizieren C- und C++-Standards, dass ein spezieller Wert im Adressraum ausschließlich zur Darstellung des Werts von Nullzeigern vorhanden sein muss?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post