/* off-by-one 配列の長さを1つ間違える。 単なるバグならまだいいけども、 セキュリティホールになったりも。 */ #include #define N 16 int main() { int a = -2; int x[N]; /* 長さ N の配列を宣言して・・・ */ int b = -1; int i; x[N] = 0; /* ↑ * やっちゃだめ。長さ N の配列は * x[0] 〜 x[N-1] まで。 */ printf("%d, %d\n", a, b); /* ↑ * 最近のコンパイラは配列の前後に“余白”を取るので、 * x[N] = 0 によって a か b が書き換えられるないこともあるけど。 * コンパイラによっては a か b の値が狂うことがある。 */ for (i = 0; i <= N; ++i) { x[i] = 0; } /* ↑ * for の中の条件式が i <= N になっていると、 * x[N] の値が書き換えられてしまう。 * 正しくは i < N 。 * 1文字違いのミスなので、分かっていてもたまにやっちゃう。 */ return 0; }