バッファとは
メインメモリ内の、一時的な記憶領域である。
バッファという英語は、本来は緩衝材という意味である。なので、ハードディスクとメモリなどの、速度の違いを吸収するバッファ(緩衝材)という意味がもともとだ。だが、ここでのバッファは、一時的な記憶領域という意味で使われる。バッファ領域には、メモリ上のヒープ領域とスタック領域がある。
buffer
★参考:データの構造
午前問題でやったかと思うが、キューとスタックがある。
キューはFIFO(First In First Out)、スタックはLIFO(Last in First Out)である。

buffer2
過去問
ここで、過去問(H19春SV午後1問1)を見てみよう。この問題では、C言語にてstrcpy関数を使ったプログラムが掲載されている。
T君 :はい。このプログラムでは,バッファオーバフローの結果,[ a:スタック]領域に確保された変数の値が,意図に反して書き換えられる可能性があります。私がこのプログラムを実行して確認したところ,変数val1がメモリ上に展開されたときの先頭アドレスは0xbffffa60で,同様に変数val2では0xbffff9e0,変数val3では0xbffff5e0でした。このとき,コマンドライン引数として一定バイト数以上の長さの文字列が与えられると,変数[ b:val2 ]がバッファオーバフローを起こして,変数[ c:val1 ]の値が書き換えられてしまいます。
決められた領域に記憶されるのであるが、文字数が大きいと、他の領域も書き換えてしまう。
b3
まつもとゆきひろさんの「コードの世界」

この本に、バッファオーバフローの解説があるので、引用させてもらう。
・「バッファ」という言葉の解説として、「データを保持するために確保する記憶領域」と述べられている。
・「バッファオーバーフロー」の解説として「固定長のバッファに対して入力していた場合、想定よりもはるかに大きなデータを入力することで、プログラムを異常終了させるものです
・「最悪の場合、プログラムの制御を奪われます」という理由として、「Cではローカル変数はシステム・スタック上に取られますから、システム・スタックをある特定のパターンで書きつぶすことで、関数からの戻り先アドレスを書き換えることが可能だからです
・解決策として「これらの関数には配列の長さを指定する「より良い代替関数」が存在しますから、そちらをお勧めします」として、strcpyではなくstrncpy、strcatではなくstrncatなどが紹介されている。
c2f058cb
「Cでは」という表現がありますが、
C言語(CやC++)以外では、起こらないのでようか?
そう考えてよい(と思います)。
まつもとさんの上記の本でも「そもそも、Cのように、配列の長さをチェックさえしない言語を使っていることが、トラブルの原因であるといえます」と述べられている。C#やRubyなどを使いましょうということだろう。