親子におすすめの新型プラネタリウムとは?

mktempを使うとこのようなWanringがでる

the use of `mktemp' is dangerous, better use `mkstemp'

mktempのどこかが危険でしょうか?

このQ&Aに関連する最新のQ&A

A 回答 (3件)

インターポジショニングといいます。


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

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

お礼日時:2005/02/24 16:13

セキュリティ上の問題がある関数を使ったときに出る警告であることは、既に先の方が回答されています。


これはgccというよりはglicが出している警告です。

glibcのソースを見ていただければ分かることですが、mktemp関数の定義の下のところに、
link_warning (mktemp, "the use of `mktemp' is dangerous, better use `mkstemp'")
というコードが書かれています。
他にも、gets関数などにも同様の記述があります。
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/02/24 16:22

参考URLのバグのところだと思います。


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

参考URL:http://www.linux.or.jp/JM/html/LDP_man-pages/man …
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/02/24 16:15

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QnslookupのNon-autoritative answerとは?

Windows2000上のコマンドプロンプトで
nslookup www.google.com
などとしたときに、応答の一番最初の行に
Non-autoritative answer
と表示されますが、これはどういう意味なのでしょうか?

Aベストアンサー

DNSサーバは、DNSクライアントに対して返す情報を制限することがあります。例えば・・・

OCNに属するホスト名 p2046-ipbf210hodogaya.kanagawa.ocn.ne.jp [222.144.79.46] (1) に関してnslookupで調べると

p2046-ipbf210hodogaya.kanagawa.ocn.ne.jp     internet address = 222.144.79.46

kanagawa.ocn.ne.jp    nameserver = ns-os041.ocn.ad.jp
kanagawa.ocn.ne.jp    nameserver = ns-tk041.ocn.ad.jp
ns-os041.ocn.ad.jp    internet address = 210.145.255.80
ns-tk041.ocn.ad.jp    internet address = 203.139.160.230

と出てきます。そこで、(1)を管理するDNSサーバのホスト名 ns-tk041.ocn.ad.jp [203.139.160.230] (2) と、

http://ocnfaq.ocn.ne.jp/EokpControl?event=ZE0002&tid=17441

にある「OCNダイヤルアップユーザ向けDNSサーバ」のホスト名 nv-td501.ocn.ad.jp [202.234.232.6] (3) に対して(1)と www.goo.ne.jp [210.150.25.37] (4) の問い合わせを行い、どういう反応を返すか調べてみると、以下のようになります。

【DNS:ns-tk041.ocn.ad.jp (2)の場合】

Default Server: ns-tk041.ocn.ad.jp
Address: 203.139.160.230

> set type=any
> p2046-ipbf210hodogaya.kanagawa.ocn.ne.jp.
Server: ns-tk041.ocn.ad.jp
Address: 203.139.160.230

p2046-ipbf210hodogaya.kanagawa.ocn.ne.jp     internet address = 222.144.79.46
kanagawa.ocn.ne.jp    nameserver = ns-os041.ocn.ad.jp
kanagawa.ocn.ne.jp    nameserver = ns-tk041.ocn.ad.jp
ns-os041.ocn.ad.jp    internet address = 210.145.255.80
ns-tk041.ocn.ad.jp    internet address = 203.139.160.230
> www.goo.ne.jp.
Server: ns-tk041.ocn.ad.jp
Address: 203.139.160.230

Non-authoritative answer:
www.goo.ne.jp  internet address = 210.150.25.37

goo.ne.jp     nameserver = ns2.sphere.ad.jp
goo.ne.jp     nameserver = goo201.goo.ne.jp
goo.ne.jp     nameserver = goo202.goo.ne.jp
> exit


【DNS:nv-td501.ocn.ad.jp (3)の場合】

Default Server: nv-td501.ocn.ad.jp
Address: 202.234.232.6

> set type=any
> p2046-ipbf210hodogaya.kanagawa.ocn.ne.jp.
Server: nv-td501.ocn.ad.jp
Address: 202.234.232.6

Non-authoritative answer:
p2046-ipbf210hodogaya.kanagawa.ocn.ne.jp     internet address = 222.144.79.46
> www.goo.ne.jp.
Server: nv-td501.ocn.ad.jp
Address: 202.234.232.6

Non-authoritative answer:
www.goo.ne.jp  internet address = 210.150.25.37
> exit

このように、「OCNが管理するホスト名(1)」が登録されているDNSサーバ(2)は全情報を返しているのに対して、OCNユーザに対して使用するよう指定されているDNSサーバ(3)はホスト名に対応するIPアドレスのみを返しています。

なぜOCNがこのような違い(制限)を導入しているのかについては分かりません。管理が楽になるのかもしれませんし、それとも他の用途になるべく使われたくないということなのかもしれません。

※以上、1つ目の疑問の回答です。

次に2つ目の疑問への回答ですが、もう一度上の2組のDNSサーバへの問い合わせの回答を見てください。(1)のホスト名はOCNに属するものですが、ユーザが(2)のDNSサーバを使用しない限り(例えば(3)のDNSサーバを使用しているような場合)、そのホスト名を引いてもNon-authoritative answerが返ります。

「使用を勧められたDNSサーバが、割り当てられたホスト名を管理している」という必要性は全くないので、このようなことは起こり得ます。

DNSサーバは、DNSクライアントに対して返す情報を制限することがあります。例えば・・・

OCNに属するホスト名 p2046-ipbf210hodogaya.kanagawa.ocn.ne.jp [222.144.79.46] (1) に関してnslookupで調べると

p2046-ipbf210hodogaya.kanagawa.ocn.ne.jp     internet address = 222.144.79.46

kanagawa.ocn.ne.jp    nameserver = ns-os041.ocn.ad.jp
kanagawa.ocn.ne.jp    nameserver = ns-tk041.ocn.ad.jp
ns-os041.ocn.ad.jp    internet address = 210.145.255.80
ns-tk041.ocn.ad...続きを読む

QFORTRAN で出力した文字の 左寄せについて

C Pad for Salford FTN77というコンパイラを使っております。
下記の様にOPENで開いてCLOSEでとじたTEXT文についてですが…

WRITE(*,*) '入力した数に1プラスされます。'
READ (*,*) A
B=A+1
OPEN(UNIT=10,FILE='C:\001.txt')
WRITE(10,100) '入力したのは',A
WRITE(10,100) '1たすと',B
100 FORMAT(A)
CLOSE(10)
STOP

…計算もされず、左寄せにもなりません。
仮に「100 FORMAT(A)」を消して(10,100)を(10,*)にすると左寄せにはなりませんが 計算して結果は表示されます。

計算して結果を左寄せにするにはどうすればよいでしょうか。
ご存知の方、アドバイスをお願いします。

Aベストアンサー

私が知っているfortranは77なのでもしかすると違っているかもしれませんが、

先ず変数Aは型宣言がないので実数扱いになります。

B=A+1(正確に記述するなら1ではなく1.)
が計算されることからもそういえます。

つぎに、FORMAT(A)の中のAは文字型を出力する際にし要するものですので、変数の型が一致していません。だから出力されないのだと思います。またAの後に桁数を示す数字が必要です。

実数に対してはFORMAT(F8.1)とかFORMAT(E8.3)とかのFやEを使用する必要があります。

また数値型の場合プラスマイナスの記号が入ることから、正値の場合+記号が省略されて、代わりにブランクが出力されたと思います。すなわち1つ目はブランクになります。
FORMAT(F1.0)等とすると桁オーバーを意味する*が出力されます。

整数型にしておけば1桁の場合FORMAT(I1)としておけば、左の1桁目に数字が出ますが、2桁以上やマイナス値のある数字の場合この方法は使用できません。

ブランクを取りたい場合、文字型で出力しなければなりませんが、たしかfortranには数値型データを文字型データに変換するコマンドがありません。

他の方法もあるかもしれませんが、そこで、一度数値データとしてファイルに出力して、そのファイルから文字型データとして1文字ずつ読み取るという方法で私自身は対処していました。

たしかこんな感じでした。
CHARACTER*1 H(8) 文字型と配列宣言
WRITE (10,601) A
601 FORMAT(F8.2)
BACKSPACE(10)
READ(10,602) (H(I),I=1,8)
602 FORMAT(8A1)

この後H(I)がブランクなら出力しない、ブランクでなければ出力するという判定作業を行って、ブランク以外の値が入っているI番目から後ろの値全部を文字型出力をします。

記憶が薄いので、上のとおりしてもうまくいきませんかもしれませんが、数値データを文字型データにうまく変換してやればできると思います。

私が知っているfortranは77なのでもしかすると違っているかもしれませんが、

先ず変数Aは型宣言がないので実数扱いになります。

B=A+1(正確に記述するなら1ではなく1.)
が計算されることからもそういえます。

つぎに、FORMAT(A)の中のAは文字型を出力する際にし要するものですので、変数の型が一致していません。だから出力されないのだと思います。またAの後に桁数を示す数字が必要です。

実数に対してはFORMAT(F8.1)とかFORMAT(E8.3)とかのFやEを使用する必要があります。

ま...続きを読む

QC言語で構造体のメンバを簡単に出力する方法ありますか?

いつもお世話になっています。

C言語の質問です。
単体テストログを取るために、
“関数Aをコールする前後で、関数Aに引数として渡す構造体のメンバをすべて”printf(もしくはfprintf)で出力して比較確認しなければならないのですが、

構造体のメンバが250とか、150とかあり、メンバ名もxxx_01,xxx_02などのようにエクセルなどで簡単に加工して作れるものではないので、いちいちメンバ名を指定しなければならないのでとても大変です。

オブジェクト指向言語なら、for each文とかでオブジェクトのメンバを簡単に取り出せるのでしょうが(間違っているかもしれません・・・)、C言語で構造体のメンバを、for文などのループを使って簡単に出力できる方法はないでしょうか?

メンバの型は、一定ではなく、char、int、double、別の構造体のポインタ型(これは出力しなくて良い)と混在しています。メンバが全て同一の型ならポインタで構造体の先頭アドレスからsizeof(メンバの型)の分インクリメントしていけば出力できそうな気もしますが、メモリ上に連続して確保されるのかも私にはわからないので困っています。

enumで列挙して・・・というのも調べてみましたが、応用は出来ないようでした。

どなたか、地道にメンバ名を書いて出力する以外の方法をご存知の方、いらっしゃいましたらお知恵をお貸しください。
よろしくお願いいたします。
※説明不足の点がありましたら補足いたします。

いつもお世話になっています。

C言語の質問です。
単体テストログを取るために、
“関数Aをコールする前後で、関数Aに引数として渡す構造体のメンバをすべて”printf(もしくはfprintf)で出力して比較確認しなければならないのですが、

構造体のメンバが250とか、150とかあり、メンバ名もxxx_01,xxx_02などのようにエクセルなどで簡単に加工して作れるものではないので、いちいちメンバ名を指定しなければならないのでとても大変です。

オブジェクト指向言語なら、for each文とかでオブジェクトのメンバを...続きを読む

Aベストアンサー

コードを書かないという方向性の提案を一つ。
デバッガに構造体の内容を出力させるというのはどうでしょうか。

struct {
int a;
char *b;
double c;
}
という型を持つ変数xがあったとして、gdbでは下記のような出力が得られます。
(gdb) print x
$1 = {
a = 123,
b = 0x2fd0 "ABC",
c = -9876.5
}

Qintel fortranのエラーで困ってます.

character chrc*49・・・
real Tmom,Mw,H0・・・
・・・
・・
write(chrc,'(a7,e12.3,a5,f7.2,a12,f6.1)') 'Mo[Nm]=',Tmom*1.e18,' Mw=', Mw,' Depth[km]=', H0
・・・
・・

をコンパイルすると,以下のようなエラーが出ます.

Main/graphics.f(93): error #5082: 構文エラー、END-OF-STATEMENT が見つかりました、 ( <IDENTIFIER> <CHAR_CON_KIND_PARAM> <CHAR_NAM_KIND_PARAM> <CHARACTER_CONSTANT> <INTEGER_CONSTANT> ... の 1 つを指定してください。
write(chrc,'(a7,e12.3,a5,f7.2,a12,f6.1)') 'Mo[Nm]=',Tmom*1.e18,' Mw=', Mw,' Depth[km]=', H0
----------------------------------------------------------------------------------^
コンパイルは Main/graphics.f で異常終了しました (コード 1)。
(矢印の位置はH0の一文字後)

原因がイマイチよく分かりません...
考えられる原因・解決法を教えて頂けると幸いです.
よろしくお願いします.

character chrc*49・・・
real Tmom,Mw,H0・・・
・・・
・・
write(chrc,'(a7,e12.3,a5,f7.2,a12,f6.1)') 'Mo[Nm]=',Tmom*1.e18,' Mw=', Mw,' Depth[km]=', H0
・・・
・・

をコンパイルすると,以下のようなエラーが出ます.

Main/graphics.f(93): error #5082: 構文エラー、END-OF-STATEMENT が見つかりました、 ( <IDENTIFIER> <CHAR_CON_KIND_PARAM> <CHAR_NAM_KIND_PARAM> <CHARACTER_CONSTANT> <INTEGER_CONSTANT> ... の 1 つを指定してください。
write(chrc,'(a7,e12.3,a5,f7.2,a12,f6.1)'...続きを読む

Aベストアンサー

ファイルの拡張子が.fであるからfixed-formatだと判断されて,1行あたりの最大文字数が72になっている。
継続行を使って2行に分割するのが吉。


人気Q&Aランキング