/*
off-by-one

配列の長さを1つ間違える。
単なるバグならまだいいけども、
セキュリティホールになったりも。
 */

#include<stdio.h>

#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;
}
