Verhindern von Puffer-überlauf in C/C++
Viele Male habe ich Probleme mit Buffer-Overflow.
int y[10][10][10];
...
y[0][15][3] = 8;
Wie kann ich dieses problem verhindern?
Gibt es irgendein gutes tool, das mir helfen kann?
- schreiben Sie in C oder C++?
- Du bekommst bessere Antworten, wenn du make-up bist du der Geist über der Sprache, die Sie verwenden. C und C++ sind sehr verschiedene Sprachen.
- Ich wünschte, ich könnte Kommentare Bearbeiten... sollten Sie "Ihren Geist" natürlich.
- Löschen Sie einfach Ihren Kommentar und es erneut hinzuzufügen.
- Sie müssen nicht zu einem überlauf in deinem Beispiel. 10x10x10 = 1000, so haben Sie ein array von 1000 int-Werten. Index [0][15][3] 15*10 + (3+1) = 154th int Sie sind also in Grenzen.
- Ich benutze sowohl C als auch C++. Das problem ist für raw-C-arrays wie im Beispiel.ù Sie haben Recht, es ist nicht ein buffer overflow auf, über den ganzen mehrdimensionales array, aber wenn ich definieren ein array als 10x10x10 ich will nicht zu gehen in den einzelnen dimension von array. Danke Mit Freundlichen GRÜßEN
- Ja, im Ernst, ich sehe nicht ein Pufferüberlauf hier!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Neil ' s Antwort ist besser im Allgemeinen Fall, wenn man aber einen Grund für die Verwendung von plain old arrays verwenden, können Sie Funktionen zum abrufen und festlegen der Werte und überprüfen Sie auch, dass Sie innerhalb der array-Grenzen:
..., die alle eingewickelt in eine Klasse, ideal.
Nicht in raw C-style arrays. Verwenden Sie stattdessen C++ container-Klassen wie std::vector, die die Fähigkeit haben, zu prüfen, ungültige Zugriffe und erhöhen die Ausnahmen, wenn Sie auftreten.
Auch, was Sie beschreiben, ist nicht wirklich ein Pufferüberlauf.
Lösung auf die code-Ebene
In C++, eine Lösung ist nie arrays verwenden, aber C++ - Container statt. Vektoren, zum Beispiel, haben out-of-bounds-Erkennung nutzen, wenn Sie bei intead von [] für die Indizierung
In C, sollten Sie immer Ihre design-Funktionen, wie Sie geben, die Zeiger und die dimension(en) des arrays, es gibt keine Möglichkeit um ihn herum.
Lösung auf der tool-Ebene
Ein großes Werkzeug für die überprüfung der out-of-bounds Zugriff ist valgrind. Es funktioniert, indem Sie Ihre binäre unverändert und geben kann, die genaue Zeile wo der Fehler tritt auf, wenn Sie das kompilieren mit debug-Informationen. Valgrind funktioniert auf vielen unix, einschließlich mac os x.
Beachten Sie, dass valgrind kann nicht immer erkennen, dass diese schlechten Zugriffe (in deinem Beispiel, vorausgesetzt, es war eine echte out-of-bounds Zugriff, es hätte gonve unbemerkt von valgrind, weil die variable wird auf dem stack, nicht auf dem heap).
Zusätzlich zu den anderen Kommentaren, können Sie auch einen Blick auf die Vorschläge in diesem thread, die sich mit statischer code-Analyse-tools:
C/C++ - Freie alternative zu Flusen?
Habe ich ein interessante software für Puffer-überlauf.
Sie können es kostenlos herunterladen von http://www.bugfighter-soft.com
Er sagt, dass er entdecken kann, buffer overflow und, dass es unabhängig vom compiler und der Plattform.
Versuchte ich es mit Visual C++ Express 2008 und es funktionierte gut. Ich konnte erkennen Puffer-überlauf in ein mehrdimensionales array wie
int y[10][10][10];
Glaubst du, es ist cross-Plattform?
Wissen Sie etwas mehr darüber?
mittels sprintf in den TRACE-MAKROS ist das größte übel