「バッファオーバーラン」の版間の差分

m
(→‎C言語の場合: 微妙に修正(gets はバッファオーバーランを防げないが scanfは回避する方法が皆無ではないので))
===C言語の場合===
 
[[C言語]]の標準入出力関数である[[gets]]関数はバッファ長のチェックを行わないで標準入力をバッファに書き込むので、この関数を使う全てのプログラムには、バッファオーバーランによる不正動作の危険性がある。また使い方が分かりやすいという理由でC言語初心者向けの入門プログラミングでしばしば用いられる[[scanf]]関数も細かい設定を行わない場合は様の危険性があり、を持っている。これらの関数を実用的なプログラムで用いることあまり推奨されならない。
 
次のプログラムはgets関数を用いた例である(ただしセキュリティ上、''gets関数はそれ自体をテストする以外の目的で使用されるべきではない。Linux Programmer's Manualには「gets()は絶対に使用してはならない。」と書かれている'')。バッファ長として200[[バイト]]確保されている。gets関数はバッファの長さについては関知しないため、200バイトを超えても改行文字かEOFが現れなければバッファオーバーランが発生する。
 
#include <stdio.h>
}
 
例えばgets関数の代わりにfgets関数を用いることで、この問題を回避できる。次のプログラムは上記のプログラムと等価である。fgets関数にはバッファのサイズを渡すことができ、このバイト数を超えてバッファに書き込みを行わない。従ってバッファサイズが正かしく設定されていれば、fgets関数も誤った使にお方をするとバッファオーバーランを引き起こり得ない
 
#include <stdio.h>
840

回編集