だから私は、簡単なバッファオーバーフローを示すコードのこのシンプルな作品があります。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;
}
出力:
$ ./a.out
c[0] is 'A'
c[0] is 'Z'
を、私は、次のgccのオプションで、このコードをコンパイルしようとしていると、それは飛行を持つ合格色:
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
私もlibefenceとvalgrindのを試してみました。ヒープ上の読み書きをキャッチするように作られて以来、私は寛容が通過することを期待していましたが、バンググラインドが合格したことに驚いていました。
このコードは、c [4]とd [0]が重複しているため、Segfaultを生成しません。
だから、何がありますかCANこれをキャッチしますか? Linux上で動作するものは何か自由であるだろう。
最新バージョンを試すことができます。 –
あなたは正しいですが、それは残念ですが、「cppcheck」はそうです! – SiegeX
gccはこれをキャッチしませんが、しばらく前に逆参照されていなかった配列の最後のポインタについて偽の警告を出していたコンパイラのバグを回避する必要があったことを考えてください。 http://stackoverflow.com/questions/1168525/c-gcc4-4-warning-array-subscript-is-above-array-boundsを参照してください。私はgcc *がこれを診断しようとしていると思います。あなたのオプションがそれを無効にするか、反対のコンパイラのバグを見つけました。 –