So habe ich dieses einfache Stück Code, das einen einfachen Pufferüberlauf zeigt:Welches Tool kann Pufferüberläufe in C fangen?
#include <stdio.h>
int main(void)
{
char c[4] = { 'A', 'B', 'C', 'D' };
char d[4] = { 'W', 'X', 'Y', 'Z' };
printf("c[0] is '%c'\n", c[0]);
d[4] = 'Z'; /* Overflow that overwrites c[0] */
printf("c[0] is '%c'\n", c[0]);
return 0;
}
Der Ausgang:
$ ./a.out
c[0] is 'A'
c[0] is 'Z'
ich diesen Code mit den folgenden gcc Optionen kompiliert habe versucht, und es bestand mit dem Fliegen Farben:
gcc -Wall -Wextra -Wformat=2 -Wswitch-default -Wcast-align -Wpointer-arith \
-Wbad-function-cast -Wstrict-prototypes -Winline -Wundef -Wnested-externs \
-Wcast-qual -Wshadow -Wwrite-strings -Wconversion -Wunreachable-code \
-Wstrict-aliasing=2 -ffloat-store -fno-common -fstrict-aliasing \
-Wstack-protector -fstack-protector-all -std=c99 -pedantic -O0 -ggdb3
ich habe auch versucht libefence und valgrind. Ich habe erwartet, dass die Libefence passieren wird, da sie dazu gebracht wird, außerhalb der Grenzen zu lesen/schreibt auf dem Heap, aber ich war überrascht, dass Valgrind bestanden hat.
Dieser Code erzeugt keinen Segfault, da sich c [4] und d [0] zufällig überlappen und ich denke, dass dies dazu führt, dass Werkzeuge es vermissen.
Also, was gibt es da CAN fangen Sie das? Etwas Freies, das unter Linux funktioniert, wäre nett.
Die neueste Version von Schiene versuchen, dies nicht zu fangen, leider. –
Sie haben Recht, das ist bedauerlich, aber 'cppcheck' tut! – SiegeX
Enttäuschend, dass gcc dies nicht bemerkt, wenn man bedenkt, dass ich vor einiger Zeit einen Compiler-Fehler umgehen musste, der fälschlicherweise vor einem End-of-Array-Zeiger warnte, der nicht einmal dereferenziert wurde. Siehe http://stackoverflow.com/questions/1168525/c-gcc4-4-warning-array-subscrip-is-above-array-bounds. Ich denke, gcc * versucht * dies zu diagnostizieren, obwohl es nicht erforderlich ist, also entweder deaktivieren Sie Ihre Optionen, oder Sie haben den umgekehrten Compiler-Fehler gefunden ... –