Ansicht umschalten
Avatar von die kleine Himbeere
  • die kleine Himbeere

mehr als 1000 Beiträge seit 25.10.2012

Nicht nur in Rust, auch in C hätte man das verhindern können

Zumindest ab C99 gibt es in C ein Konstrukt, in dem man einen Pointer definieren kann der nicht NULL sein kann/darf.

Das erreicht man mit einer Änderung in der Deklaration der Funktionsargumente.

Eine Funktion

void f(int *p);

z. B. erlaubt dass der Aufrufer auch einen NULL-Pointer als <p> übergeben könnte.

Will man das verhindern, deklariert man die Funktion statt dessen wie folgt:

void f(int p[static 1]);

Dies teilt dem Compiler mit, dass als Argument nur ein Pointer erlaubt ist, der auf (zumindest) ein real existierendes Array-Element verweist.

Ein Aufruf wie

f(0);

würde vom C-Compiler daher bereits zur Übersetzungszeit als Fehler zurück gewiesen werden... oder zumindest soweit der C-Compiler etwas taugt und diese Möglichkeit zur Fehlerprüfung auch nutzt (was leider nicht alle tatsächlich tun).

Da ich mich nach C++98 aus der C++ Entwicklung zurück gezogen habe weiß ich nicht ob neuere C++ Versionen dieses C99 Feature übernommen haben oder nicht.

Was Rust angeht, kann dieses noch ganz andere Speicherfehler vermeiden als nur null-Pointer, und wo C99 nichts bietet.

Aber in diesem Fall geht es ja um einen null-Pointer, also ist der Vergleich sinnvoll.

Bewerten
- +
Ansicht umschalten