2011-01-17 18 views

Antwort

3

Kurz gesagt: Nein

C führt keine Laufzeitprüfungen, wenn Sie sie von Hand tun.

Sie können Ihre eigenen Funktionen, Makros und pro-Puffer-Buchführung verwenden, um vor ungültigen Zugriffen zu schützen. Allerdings müssten Sie diese Schnittstelle überall verwenden, was bedeutet, dass Sie den direkten Zugriff auf diesen Puffer verlieren würden.

Sie würden aufgrund der zusätzlichen Zustandsprüfungen auch Auswirkungen auf die Leistung haben. Sie können dies möglicherweise vermeiden, indem Sie direkten Zugriff auf Codezweige verwenden, die nachweislich keine Out-of-Bounds-Zugriffe verursachen.

EDIT:

Es gibt auch die eher große Frage „Was sollte der Code tun, wenn ein ungültiger Zugriff erkannt wird“. Sollte Ihr Programm einen Fehler ausgeben und beenden, als ob es eine Ausnahme in anderen Sprachen gegeben hätte? Sollte es den Fehler ignorieren? Sollte es versuchen, es zu beheben?

Der C-Weg, um mit diesem Problem umzugehen, ist Look-Before-You-Jump und sicherstellen, dass jeder Code-Zweig/Teil im Voraus sicher ist, anstatt jeden Zugriff zu überprüfen.

1

Die kurze Antwort: Nein

Die lange Antwort:
Um sicherzustellen, sogar etwas so dumm, wie buffer[ULLONG_MAX] nicht außerhalb der Grenzen geht, müssen Sie Ihren Puffer mit einem gebunden erklären, größer als die größten ganzen Zahl darstellbar auf dem System. Dies ist natürlich nicht möglich, abgesehen von der Menge an Speicher, die ein solcher Puffer benötigen würde.

Die praktische Lösung ist, dass Sie manuell die Größe Ihres Puffers verfolgen und jede nicht vertrauenswürdige Indexierung in den Puffer gegen die Puffergröße verifiziert wird.

1

Sehen Sie unsere Memory Safety Checker, die als Debugging-Hilfe verwendet wird, instrumentiert Ihren C-Code, um festzustellen, ob Sie Fehler mit Arrays oder Puffern machen. Das findet Probleme, die Valgrind nicht kann.

Verwandte Themen