Speicher Sicherheit ist ein Anliegen in der Softwareentwicklung, die auf Software-Bugs, die Sicherheitslücken, die sich mit Random-Access Memory Zugang, wie Pufferüberläufe und dangling Zeiger verursachen zu vermeiden soll.
Computer-Sprachen wie C und C ++, die beliebige Zeigerarithmetik, Gießen und Freigabe Unterstützung sind in der Regel nicht die Speicher sicher. Es gibt verschiedene Ansätze, um Fehler in solchen Sprachen zu finden: siehe Erkennung weiter unten.
Die meisten High-Level-Programmiersprachen zu vermeiden das Problem, indem das Verbot des Zeigerarithmetik und Gießen vollständig, und die Durchsetzung Tracing Garbage Collection als einzige Speicherverwaltungsschema.
Eine Sprache, könnte noch mehr Anwendungen von Pointer-Arithmetik, Gießen und Freigabe ohne Speichersicherheit durch automatisierte Theorem-Bestätigung als eine Form der statische Code-Analyse zu unterstützen. ESC / Java und D zeigen zwei Möglichkeiten, die Programmierer können ihre Invarianten in einer Weise, die von einem Theorembeweiser verstanden werden kann, zu erklären.
Arten von Speicherfehlern
Mehrere Arten von Speicherfehler können auftreten, je nachdem, welche Programmiersprache verwendet wird:
- Pufferüberlauf - Out-of gebundenen Schreib beschädigen kann der Gehalt an benachbarten Objekten oder interne Daten wie Buchhaltung Informationen für den Heap oder Rücksprungadressen.
- Dynamische Speicherfehler - Falsche Management von dynamischen Speicher und Zeiger:
- Schlenker Zeiger - Ein Zeiger Speichern der Adresse eines Objektes, das gelöscht wurde.
- Doppel befreit - wiederholte Aufruf zu befreien, obwohl das Objekt bereits befreit worden kann dazu führen, Freelist-basierten Verteiler zu scheitern.
- Ungültige kostenlos - Passing eine ungültige Adresse zu korrumpieren können die Haufen zu befreien. Oder manchmal wird zu einem undefinierten Verhalten führen.
- Null-Pointer-Zugriffe wird eine Ausnahme oder Beendigung des Programms in den meisten Umgebungen verursachen, kann aber Korruption im Betriebssystem-Kernel oder Systemen ohne Speicherschutz verursachen, oder wenn die Verwendung des Null-Zeiger beinhaltet ein großes oder negativ gegenüber.
- Nicht initialisierte Variablen - eine Variable, die einen Wert verwendet, nicht zugewiesen wurde. Es kann eine unerwünschte enthalten oder in einigen Sprachen, eine korrupte Wert.
- Wilde Zeiger entstehen, wenn ein Zeiger vor verwendet werden, um bis zu einem gewissen bekannten Zustand Initialisierung. Sie zeigen das gleiche Fehlverhalten als dangling Zeiger, obwohl sie weniger wahrscheinlich unentdeckt zu bleiben.
- Aus Speicherfehler:
- Stack-Überlauf - Tritt auf, wenn ein Programm läuft aus Stapelspeicher, in der Regel wegen der zu tief Rekursion.
- Zuordnungsfehler - Das Programm versucht, mehr Speicher als die verfügbare Menge zu verwenden. In einigen Sprachen, muss diese Bedingung für manuell nach jeder Zuweisung überprüft werden.
Erkennung
Es gibt viele verschiedene Möglichkeiten, um Speicherfehler in Programmen in unsicheren Sprachen geschrieben zu erkennen:
- Durch die Verwendung von speziellen Heap Verteiler, die toten Zonen um Heap Lagerung, und prüfen Sie, greift nicht in solcher toten Zonen zu erreichen. DieHard tut dies durch Zuordnen Objekte in ihrem eigenen virtuellen Speicherseite.
- Durch die Instrumentierung des Quellcodes. Tools wie Broschiert, CheckPointer und AddressSanitizer
tun dies, um zu sammeln und zu verfolgen legitime Werte für Zeiger und überprüfen Sie jeden Zeiger Zugang gegen die Metadaten für die Gültigkeit.
- Durch Ausführen des kompilierten Programms in einem virtuellen Speicherprüfung Maschine. Die MemCheck Werkzeug der Valgrind arbeitet auf diese Weise.
- Statische Code-Analyse kann Fehler in einigen Fällen aber auch zu erkennen.
Kommentare - 0