Inoffizielles Coding Quiz

Cromon

Erfahrenes Mitglied
Hallo zusammen

Letztens hatte ein bekannter von mir mich gefragt ob es legal ist einen nullptr zu inkrementieren oder nicht. Ich überlasse es mal euch als Aufgabe eine schlüssige (das heisst durch Argumente aus dem Standard gestützte) Antwort darauf zu geben :)

Also ist folgender Code gemäss dem C++(11/14/17/2031432)-Standard erlaubt? Und wenn ja, wie lässt sich das Resultat am besten beschreiben?
C++:
int* a = nullptr;
++a;

Viele Grüsse
Cromon
 

sheel

I love Asm
Hi

Beziehe mich im Folgenden auf N3797.

Laut §5.3.2 ist ++x das selbe wie x+=1 (außer für bool),
und laut §5.17.7 ist das x=x+1 (außer Evaluierungsanzahl usw.)

Eine reine Addition nullptr+1, also ohne Einfluss vom int-Pointertyp, ist nicht erlaubt (und wird von Compilern auch nicht akzeptiert), weil laut §5.7.1 entweder beide Typen bei der Addition arithmetisch (int/float-artig) bzw. enums sein müssen, oder eins Pointer und eins Int-artig. Laut §2.14.7 (und dem Rest von $2.14) ist nullptr nichts davon, speziell kein Pointer.

Mit Pointervariable (außer void*, mit dem man sowieso nicht rechnen kann):
§5.7.4 sagt, dass bei Addition/Subtraktion Pointer zu Nichtarrays/Einzeldingen wie Pointer zum ersten Element eines Arrays mit Größe 1 zu behandeln sind, und §5.7.5 beschreibt die Addition als genau dann (und nur dann) definiert, wenn der Anfangswert vom Pointer in einem Array liegt und das Ergebnis nach der Addition entweder im selben Array oder genau ein Element danach. Man kann also, wenn man sich strikt an den Standard hält, nicht beliebig über den Speicher laufen, auch wenn man nichts dereferenziert; es muss etwas "da sein" im Speicher (genauer ein "Objekt" laut §1.8, dieses "Objekt" schließt auch Arrays ein).

Da auf nullptr nichts ist, zumindest nichts was nach §1.8.5 ein gültiges Objekt/Arrayobjekt ist (zB. auch Größe von min. 1 Byte), ist ein Inkrement darauf undefined.

... 01:32 + C++-Standard, also wenn das was da steht für andere nicht nachvollziehbar ist, bitte sagen :D
 
Zuletzt bearbeitet:

Cromon

Erfahrenes Mitglied
Da gibt es kaum mehr was hinzuzufügen, ausser: Wer Speicherverletzungen herbeiführt verstösst gegen den Standard :D