まず第一に、使用しないでくださいgets
。今ではほとんどの人が、 で発生する可能性のあるセキュリティと信頼性の問題をすべて知っていますgets
。しかし、歴史的な理由からもここに含まれています。これは、悪いプログラミングの非常に良い例だからです。
コードのすべての問題を見てみましょう。
// Really bad code
char line[100];
gets(line);
gets
100 文字を超える文字列の境界チェックを行わないため、メモリが上書きされます。運が良ければ、プログラムがクラッシュするか、奇妙な動作を示す可能性があります。
このgets
関数は非常に悪いため、GNU gcc リンカは使用されるたびに警告を発します。
/tmp/ccI5WJ5m.o(.text+0x24): In function `main':
: warning: the `gets' function is dangerous and should not be used.
assert で配列アクセスを保護する
C/C++ は境界チェックを行いません。
例えば:
int data[10]
i = 20
data[20] = 100 //Memory Corruption
assert
上記のコードの関数を使用します
#include<assert.h>
int data[10];
i=20
assert((i >= 0) && (i < sizeof(data) / sizeof(data[0]))); // throws
data[i] = 100
配列のオーバーフローは、最も一般的なプログラミング エラーの 1 つであり、見つけようとするのは非常に面倒です。このコードはそれらを排除するものではありませんが、問題を非常に見つけやすくする方法で、バグのあるコードを早期に中止させます。
そしてsnprintf(buffer, sizeof(buffer), "%s", "abcdefghpapeas")
、valgrind や GDB などのツールを使用します。
これがあなたに役立つことを願っています..