ページ 11

コンパイラのバグ?が見つかったときどうしますか。

Posted: 2007年10月04日(木) 00:14
by 組木紙織
今日。コンパイラのバグ?と思われるものを見つけました。
ソースコードは長くなるのでほとんど記述しませんが、

起きた現象はある自作関数中のコンソール出力の部分が全て無視されるというものです。

Releaseで実行したり、Debugでステップ実行をすると正しく動くのですが、
Debugでデバッグなしで実行をしたときのみ上記のような現象が起きます。

気をつけていれば気にすることでもなく、特定のソースのみ常に現象が起こり、少し変更を
かけたらすぐにこの現象は起こらなくなるので、別段何の問題もないのですが、

コンパイラのバグが起きたときの対処をどのようにしているのか気になったので投稿をしました。

#コンパイラを変えるということは不可能なので、その対処法だけはできません。

Re:コンパイラのバグ?が見つかったときどうしますか。

Posted: 2007年10月04日(木) 00:44
by Sleepy
怪しいのは以下の3点です。

変数の初期化漏れ。
領域破壊。
スタックオーバーフロー。

Re:コンパイラのバグ?が見つかったときどうしますか。

Posted: 2007年10月04日(木) 00:46
by Justy
 ソースを見ないと何ともいえませんが、そういう場合大抵ソースコードにバグがあります。

 もし、本当にコンパイラのバグであるなら、その周辺をアセンブルコードを見ながら
ステップ実行してどのインストラクションでどう間違ったコードを出力したのか
調べるしかありません。
(或いは、あきらめてMLかBBSに丸ごと投げて調べて貰うとか)


> コンソール出力の部分が全て無視されるというものです
 単純にバッファに溜まってる可能性がありそうです。
 '\n'を最後に入れるとか、fflush()とかを使って出力ストリーム内のバッファを
出力してみてはどうでしょうか?

Re:コンパイラのバグ?が見つかったときどうしますか。

Posted: 2007年10月04日(木) 01:15
by 組木紙織
C言語系の話では無いのでソースコードここで上げるのはどうかと思っているのですが、
(言語はfortran77です。というより始めに言語をかくべきでしたね。忘れてました。)

>変数の初期化漏れ。
全部初期化してます。

>領域破壊。
動的に領域を確保していないので関係ないと思います。

>スタックオーバーフロー
PCのスタックを消費するほど深い再帰は使ってないはずなんですが。
#それとも私のほうが勘違いしてる?

とりあえずzipで圧縮したものを上げておきます。
一応簡単な説明文を書き込んでおきます。
大学の卒論の関係なので何の計算をしているのか分からないかもしれませんが、
何処で何をしたら現象が起きるかという部分はコメントで入れてあります。

>アセンブルコード
何かあるとすぐアセンブルコードを表示するので、見るだけなら慣れてきた。。。
意味は全然読めないですが。

Re:コンパイラのバグ?が見つかったときどうしますか。

Posted: 2007年10月04日(木) 01:38
by Justy
 fortranですか。

 申し訳ない。ちょっと手が出ないです。
 でもちょっと気になったところが。

 TRparaを get2spacePot()の引数に指定していますが、未初期化な気がします。
 代わりに TPparaという変数?を 0で初期化してたりするので、このあたりが怪しいような。

Re:コンパイラのバグ?が見つかったときどうしますか。

Posted: 2007年10月04日(木) 01:55
by 組木紙織
>TPpara =0
>PSpara =0

この部分ですか?
私がしたかったのは以下です。
TRpara =0
PSpara =0

多分これで、問題なくなるとおもいます。
まさか。PとRのミスあったなんて、思いもよらなかったです。

#fortranは宣言が絶対に必要なわけではないので、変数名のミスに気づきにくくて困ります。

Re:コンパイラのバグ?が見つかったときどうしますか。

Posted: 2007年10月04日(木) 09:45
by Justy
 やっぱり、そこはタイポでしたか。
 それでうまくいくといいですね。


> 変数名のミスに気づきにくくて困ります
 コンパイラオプションで何か警告とかないですか?

Re:コンパイラのバグ?が見つかったときどうしますか。

Posted: 2007年10月04日(木) 10:45
by 組木紙織
今使っているコンパイラの詳しい説明書がなく、詳しく使い方を教えてくれる人もいなかったので
コンパイラオプションの設定の仕方がまだよくわからないのです。

色んなことを試してはいますが、言語仕様自体に宣言なしの変数を一部容認しているので、
(i,j,k,l,m,nなどは宣言なしで扱える整数型となっています。ほかはどうだったかな覚えていませんが、)

期待はしないほうがいいのかなと思います。

Re:コンパイラのバグ?が見つかったときどうしますか。

Posted: 2007年10月04日(木) 12:49
by hoge
そのコンパイラではimplicit noneは使えないの?

Re:コンパイラのバグ?が見つかったときどうしますか。

Posted: 2007年10月04日(木) 15:27
by TT414
>i,j,k,l,m,nなどは宣言なしで扱える整数型となっています。ほかはどうだったかな覚えていませんが

はi,j,k,l,m,nから始まる変数は整数型、i~n以外の変数は実数型です。

Re:コンパイラのバグ?が見つかったときどうしますか。

Posted: 2007年10月04日(木) 15:32
by GPGA
>i,j,k,l,m,nから始まる変数は整数型、i~n以外の変数は実数型です。
Fortranでこの仕様があったため、Cでfor文を使用するときの
ループ変数に、iやjが使われているとか、いないとか。

Re:コンパイラのバグ?が見つかったときどうしますか。

Posted: 2007年10月05日(金) 20:22
by 組木紙織
>そのコンパイラではimplicit noneは使えないの?

実際に使ってみたら使えました。
私の持っている参考書にその記述がなかったので、知らなかっただけでした。
ありがとうございます。