Così ho questo semplice pezzo di codice che dimostra un semplice buffer overflow:Quale strumento può catturare buffer overflow in C?
#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;
}
L'output:
$ ./a.out
c[0] is 'A'
c[0] is 'Z'
ho provato la compilazione di questo codice con le seguenti opzioni gcc ed è passato con il volo colori:
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
ho anche provato libefence e Valgrind. Mi aspettavo che la libefence passasse dal momento che è stata creata per catturare i limiti di lettura/scrittura sull'heap, ma sono rimasto sorpreso dal fatto che valgrind sia passato.
Questo codice non produce un Segfault dal c [4] e d [0] capita di sovrapporsi e penso che sia questo che sta causando strumenti perdere.
Quindi, che cosa c'è CAN prendere questo? Qualcosa di gratuito che funziona su Linux sarebbe bello.
L'ultima versione di valgrind della stecca non prendere questo, purtroppo. –
Hai ragione, è sfortunato, ma fa 'cppcheck'! – SiegeX
Deludente per il fatto che gcc non se ne accorga, considerato che un po 'di tempo fa ho dovuto aggirare un bug del compilatore in cui si trattava di falsi allarmi su un puntatore end-of-array che non era nemmeno referenziato. Vedi http://stackoverflow.com/questions/1168525/c-gcc4-4-warning-array-subscript-is-above-array-bounds. Penso che gcc * cerchi * di diagnosticare questo problema, anche se non è richiesto, quindi le tue opzioni lo disabilitano oppure hai trovato il bug del compilatore opposto ... –