- ベストアンサー
gcc に mktemp 危険と怒られたのはなぜ?
mktempを使うとこのようなWanringがでる the use of `mktemp' is dangerous, better use `mkstemp' mktempのどこかが危険でしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
インターポジショニングといいます。 Cではライブラリ関数名と同じ名前の関数をユーザが定義すると、特に警告することも無くユーザ定義関数を採用する仕様になっているのですが、あるとき、ライブラリ関数名をすべて暗記していないプログラマが、知らずに「mktemp」という名前の関数を自作してしまったため、リンク時にライブラリのmktempがすべてこれに置き換えられてしまい、大騒ぎになったという故事があります。 それ以来、ライブラリ関数のmktempを実行すると、「使わない方がいいですよ」とメッセージを表示するようになったという訳です。 余談ですが、他にもgets()などを使うと、やはり故事にちなんだメッセージが出るはずです。(gets()はバッファサイズを定義しないために、それを利用したwormが作られたことがあるため、現在では推奨されていません)
その他の回答 (2)
- jacta
- ベストアンサー率26% (845/3158)
セキュリティ上の問題がある関数を使ったときに出る警告であることは、既に先の方が回答されています。 これはgccというよりはglicが出している警告です。 glibcのソースを見ていただければ分かることですが、mktemp関数の定義の下のところに、 link_warning (mktemp, "the use of `mktemp' is dangerous, better use `mkstemp'") というコードが書かれています。 他にも、gets関数などにも同様の記述があります。
お礼
ご回答ありがとうございました。 ソースを調べる手もありますね、勉強になりました。
- toshi_3_3
- ベストアンサー率0% (0/3)
参考URLのバグのところだと思います。 -- 抜粋 -- BSD 4.3 系の実装や XXXXXX をプロセス id と1文字により置き換える方式ではせいぜい26の名前を返すことができるにすぎない。この名前は簡単に推測できることや、その名前がすでに存在しているかどうかテストして、そのファイルをオープンする間に競合がある事から、 mktemp() を使うのは毎回セキュリティリスクをおかすことになる。 ----
お礼
ご回答ありがとうございました。
お礼
ご回答ありがとうございました。 確かにやりそうですね。