Grundlagen der Programmiersprache C
int get(int *p) {
int v = *p;
if (p == NULL)
return -1;
return v;
}Wird die obige Funktion mit gcc und aktivierter Optimierung kompiliert, kann die Prüfung if (p == NULL) entfernt werden. Was ist der Grund dafür?
- A*p wird zuvor gelesen, und wäre p NULL, läge dort bereits undefiniertes Verhalten vor; daher darf angenommen werden, dass p nicht NULL ist
- BDer Standard legt fest, dass ein Vergleich mit NULL immer falsch ist
- CBei der Optimierung gilt die Regel, dass if-Anweisungen, die Funktionsargumente prüfen, Sache des Aufrufers sind und alle entfernt werden dürfen
Antwort und Erläuterung anzeigen
Antwort: A. *p wird zuvor gelesen, und wäre p NULL, läge dort bereits undefiniertes Verhalten vor; daher darf angenommen werden, dass p nicht NULL ist
Ist p NULL, dereferenziert das zuerst ausgeführte int v = *p; einen NULL-Zeiger, und an dieser Stelle liegt bereits undefiniertes Verhalten vor. Der Compiler darf annehmen, dass kein undefiniertes Verhalten auftritt; da *p gelesen werden konnte, schließt er, dass p nicht NULL ist, und entfernt die Prüfung p == NULL samt return -1. Mit gcc 13 auf x86-64 und -O2 wird die Funktion zu Code, der nur *p liest und zurückgibt; mit -O0 bleibt die Prüfung erhalten. Damit die Prüfung sicher wirkt, prüft man p, bevor *p gelesen wird.
Weiter: 9 weitere Fragen zu Grundlagen der Programmiersprache C