プロが教える店舗&オフィスのセキュリティ対策術

今回fortranとC言語で書かれたWindows用プログラムをLinux用に移植することになりました。GNUのコンパイラを使用し無事コンパイルできたので実行したのですが"Segmentation fault"となりうまく実行できませんでした。そこで試しにIntelのコンパイラを使用しコンパイルしてみたところGNUのときとは違い"Segmentation fault"とは出ず、プログラム内のエラーチェックに引っかかり止ってしまいました。同じソースコードにもかかわらず止まる箇所が異なります。
今まで考えたことがなかったのですがGNUとIntelのコンパイラの違いはなんなのでしょうか?また、この二つ以外にいいコンパイラはあるのでしょうか?

A 回答 (2件)

#1 の onosuke さんが言われているとおりで、プログラムのバグが原因であることがほとんどでしょう。


移植によって、眠っていたバグが表面化することは珍しくないです。原因を突き止めるしかありません。

例えば、

char *p;
*p = 1;

としたときに、p が初期化されていないので、p の値は不定になりますよね?そうすると、*p = 1 がどこに書き込むかも不定になります。

不定といっても、乱数のようなものではなく、直前のコードで、ある程度固定した値になる可能性が高いです。コンパイラが違えば、その値が Segmentation fault になるかならないかの違いが出ることもあります。

Segmentation fault にならないと、気づかないうちに、別の変数を書き換えていたりすることもあるので、そちらの方が怖いです。
    • good
    • 0
この回答へのお礼

教えていただいたのに、お礼が遅くなり大変申し訳ありません。
私でもわかるように優しく丁寧に書いて下さってありがとうございます。一生懸命バグを探したいと思います。

お礼日時:2003/11/17 18:00

第一に,コンパイラの吐く機械語のコードが違います。


ですから,ソースコードレベルでメモリアクセスのバグがあれば,質問のようなことは普通に起こります。
    • good
    • 0
この回答へのお礼

同じソースコードなのに不思議ですね。一つのプログラムを作りたいとき色々な書き方があるのと同じ感覚でしょうか?
そう考えると納得ですね。
わかりやすい回答ありがとうございます。

お礼日時:2003/11/10 10:42

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