匿名質問者

C初心者です。C言語のgets関数とscanf関数についての質問です。

「scanfは使うな。getsは"絶対に"使うな」というようなことを書いているページがよく見られます。
バッファオーバーフローの危険性は同程度だと思っているのですが、そうではなくてgetsの方が危険性が高かったりするのでしょうか

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2014/07/05 14:35:04

回答3件)

匿名回答1号 No.1

どちらもバッファオーバーフローの防止策が無いので、基本的には同じです。

プログラマがバッファオーバーフローの防止策を作り込む際に、
読み込むデータの書式を利用出来るscanfの方が、getsよりは使いやすいと言えます。

匿名回答1号

(σ・∀・)σゲッツ!!

2014/06/28 20:41:08
匿名回答2号 No.2

http://ja.wikipedia.org/wiki/Gets

gets は、…廃止された。

匿名回答4号 No.3

gets のバッファオーバーフローの問題は、単純に gets に渡したバッファサイズを超えて書き込まれる可能性がある、というものですが、scanf でのバッファオーバーフローは、scanf 自体の問題と言うよりも、不適切な書式指定子の問題になります。

scanf バッファオーバーラン - Wikipedia

%s で受ける時にフィールド幅を指定しないと、バッファーオーバーフローが起こる、という話で、逆に上記ページの例にあるように %19s といった形でフィールド幅を指定すれば問題はありません。

ただ、scanf を使うな、という話は、セキュリティ的にバッファーオーバーフローが話題になるよりずっと前に、「入力が指定した書式と一致しなかった時の問題」があって、匿名回答3号さんがコメントで書かれている通り、「fgets と sscanf を使え」と言われます。この問題は、同じ Wikipedia の下記の章に例も書かれているので、一度、試してみると分かると思います。

scanf 異常な入力が行われた時の処理 - Wikipedia

  • 匿名回答3号
    匿名回答3号 2014/06/28 23:14:31
    じーさんが代わりにfgets+sscanfを使えと言ってた。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません