C標準ライブラリにおいてバッファオーバーフロー脆弱性の代名詞とされていた関数gets
は、プログラミング言語Cの最新規格C11にて標準規格から削除された。
2018-09-01追記:プログラミングC++言語においてもC++14で削除された。
#include <stdio.h> char buf[10]; gets(buf); /* 10文字以上入力されるとバッファオーバーフロー(C99以前) C11ではgets関数は存在しないためill-formedとなる */
C11でもバッファサイズとファイルポインタを指定する関数fgets
はそのまま使えるため、fgets(buf, sizeof(buf), stdin)
などで代替可能。
JTC1/SC22/WG14 N1570 Foreword/p6より部分引用。
6 This third edition cancels and replaces the second edition, ISO/IEC 9899:1999, as corrected by ISO/IEC 9899:1999/Cor 1:2001, ISO/IEC 9899:1999/Cor 2:2004, and ISO/IEC 9899:1999/Cor 3:2007. Major changes from the previous edition include:
- removed the
gets
function (<stdio.h>
)
同関数の危険性は各所で指摘されてはいたものの、C11で突然公式に削除された訳では無く、C99 TC1〜TC3*1までをまとめたJTC1/SC22/WG14 N1256において廃止予定かつ非推奨とされていた。(N1256 7.26.9/p2)
7.26.9 Input/output
2 The gets function is obsolescent, and is deprecated.
ちなみに、プログラミング言語C++の最新規格にあたるC++11ではgets
関数はまだ残っている。(JTC1/SC22/WG21 N3337 27.9.2/p1)
関連URL
- c++ - Is gets() officially deprecated? - Stack Overflow
- http://www.open-std.org/jtc1/sc22/wg14/www/standards
*1:ISO/IEC 9899:1999 に対して、これまで3回の Technical Corrigendum; ISO/IEC 9899:1999 Cor.1:2001, ISO/IEC 9899:1999 Cor.2:2004, ISO/IEC 9899:1999 Cor.3:2007 が発行されている。