人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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


●質問者: 匿名質問者
●カテゴリ:コンピュータ 学習・教育
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● 匿名回答1号

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

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


匿名回答1号さんのコメント
(σ・∀・)σゲッツ!!

2 ● 匿名回答2号

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

gets は、…廃止された。


3 ● 匿名回答4号

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

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

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

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

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

関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ