出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2015/01/16 01:55 UTC 版)
gets は、C言語における標準入力から1行分の文字列を取り出す関数である。この関数はバッファオーバーランを防ぐことが不可能という致命的な脆弱性を持っており、2011年の改定のC11の標準CライブラリやC++14の標準C++ライブラリより廃止された[1]。
C11の1つ前の版の標準規格であるC99までにおいて、<stdio.h> で gets は以下のような形式で宣言されていることが規定されていた。
char *gets(char *s);
gets は標準入力から改行 ('\n') が現れるまでデータを読み込み、引数で渡された s に格納する、このとき改行文字は終端記号 ('\0') に置き換える。戻り値にはエラーが発生した場合は NULL を、それ以外は s を返す。
scanf の %d や %s と異なり、改行文字は読み込んだ後で終端記号に書き換えるためストリームに改行文字は残らない。このため scanf のような改行文字の処理は必要とはしない。逆に scanf で呼ばれた直後に gets を呼ぶと、入力ストリームの先頭に改行文字が残っているため gets は空の文字列を返してしまう。このため scanf と混在して使うべきではないとされている[2]。
以下のようなコードがあった場合を考えてみる。
char a[10]; gets(a);
このとき、入力されたデータが a の長さから終端記号を除いた9バイトより大きいものであるなら、このコードではバッファオーバーランが発生する。入力されるデータの長さの予測は不可能なので、他の関数(scanf や fgets など)では格納先に入力できる最大長を指定することでバッファオーバーランを回避する方法がとられる。しかし、上記の宣言を見てもわかるように、gets には入力される文字列の長さを制限する機能が存在しない。
以上、gets を用いるとバッファオーバーランを防ぐ手段はないため gets は実用的なプログラミングでは絶対に使用してはならない関数とされており、実際に2011年に行われた改定(ISO/IEC 9899:2011、通称C11)で廃止された。POSIX.1-2008では廃止予定の分類である。例えばGCCでは、getsを使用するプログラムをコンパイルすると「the `gets' function is dangerous and should not be used. ('gets' 関数は危険なため使うべきではありません。)」と警告される。
gets の使用を停止し、以下の関数に置き換えることが考えられる。
|
|||||||||||||||||
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2022/05/13 19:37 UTC 版)
「ビッグ・アスホールズ」の記事における「GETS (2006年 - )」の解説
※この「GETS (2006年 - )」の解説は、「ビッグ・アスホールズ」の解説の一部です。
「GETS (2006年 - )」を含む「ビッグ・アスホールズ」の記事については、「ビッグ・アスホールズ」の概要を参照ください。
固有名詞の分類