• ベストアンサー

gcc に mktemp 危険と怒られたのはなぜ?

mktempを使うとこのようなWanringがでる the use of `mktemp' is dangerous, better use `mkstemp' mktempのどこかが危険でしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • ty_cobb
  • ベストアンサー率16% (1/6)
回答No.1

インターポジショニングといいます。 Cではライブラリ関数名と同じ名前の関数をユーザが定義すると、特に警告することも無くユーザ定義関数を採用する仕様になっているのですが、あるとき、ライブラリ関数名をすべて暗記していないプログラマが、知らずに「mktemp」という名前の関数を自作してしまったため、リンク時にライブラリのmktempがすべてこれに置き換えられてしまい、大騒ぎになったという故事があります。 それ以来、ライブラリ関数のmktempを実行すると、「使わない方がいいですよ」とメッセージを表示するようになったという訳です。 余談ですが、他にもgets()などを使うと、やはり故事にちなんだメッセージが出るはずです。(gets()はバッファサイズを定義しないために、それを利用したwormが作られたことがあるため、現在では推奨されていません)

izayoi2004
質問者

お礼

ご回答ありがとうございました。 確かにやりそうですね。

その他の回答 (2)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.3

セキュリティ上の問題がある関数を使ったときに出る警告であることは、既に先の方が回答されています。 これはgccというよりはglicが出している警告です。 glibcのソースを見ていただければ分かることですが、mktemp関数の定義の下のところに、 link_warning (mktemp, "the use of `mktemp' is dangerous, better use `mkstemp'") というコードが書かれています。 他にも、gets関数などにも同様の記述があります。

izayoi2004
質問者

お礼

ご回答ありがとうございました。 ソースを調べる手もありますね、勉強になりました。

回答No.2

参考URLのバグのところだと思います。 -- 抜粋 -- BSD 4.3 系の実装や XXXXXX をプロセス id と1文字により置き換える方式ではせいぜい26の名前を返すことができるにすぎない。この名前は簡単に推測できることや、その名前がすでに存在しているかどうかテストして、そのファイルをオープンする間に競合がある事から、 mktemp() を使うのは毎回セキュリティリスクをおかすことになる。 ----

参考URL:
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/mktemp.3.html
izayoi2004
質問者

お礼

ご回答ありがとうございました。

関連するQ&A