2011-11-12 4 views
1

私はapple-darwin11-llvm-g ++ - 4.2コンパイラでコンパイルしているプロジェクトを持っています。このプロジェクトはRedHat Linux上のGCC 4.4.5でコンパイルされますが、実行時には非常に奇妙なことが起こります。実行時エラーはありませんが、プログラムの出力はまったく異なります。RedHatのGCC 4.4.5でランタイムに問題が発生しましたが、Apple llvm 4.2では問題なく動作しますか?

私はGDBにとってかなりひどいので、私は今夜真夜中にこのプロジェクトを学校に提出する必要があります。これを引き起こしている可能性のあることを誰かが示唆することはありますか?おそらく、私はどこかで見ることができるこれらの2つのコンパイラのいくつかの既知の違いは?

私はこれが非常に曖昧であることを認識しています。私は何が起こっているのか把握できるようにgdbを使用する方法を学んでいます。私は@AdrianCornishによって提案されたチェックリストを経て、この問題解決するために

+1

コンパイラの警告が表示されますか? – Pubby

+3

プログラムの出力が同じでない場合は、言語を誤って使用している可能性が高く、未定義の動作が発生している可能性があります。コンパイラの違いはほとんどありません。あなたは使用する前にすべての変数を初期化しましたか?境界内でメモリを正しく割り当てて使用していますか?関数内の変数はデフォルト値に初期化されていますか? –

+0

どちらも64ビットをビルドしていますか?静的アナライザーを試しましたか? –

答えて

1

「プログラムの出力が同じでない場合は、あなたが言語を悪用していると、未定義の動作を引き起こしている可能性が非常に高いことがあります。コンパイラの違いはほとんどありません。使用する前にすべての変数を初期化しましたか?範囲内でメモリを正しく割り当てて使用していますか?関数内の変数がデフォルト値に初期化されていますか? - Adrian Cornish

これまでに、コンストラクタでゼ​​ロに初期化するのを忘れてしまった整数変数があることがわかりました。どうやらllvmは自動的に変数をゼロに初期化しますが、gccはゼロに初期化します。

+0

嬉しいです:-) –

1

@weezbizzleが見つけたように、コンパイラの動作は異なり、1つのデフォルトではメンバ変数が初期化されます。