1

奇妙な最適化のみのバグが発生しているため、どのフラグが原因であるかを特定しようとしています。エラー (不正な計算) は で発生しますが-O1、 では発生しません-O0。したがって、私はそれをすべて使用できると考えまし-f flags-O1 includes to narrow down the culprit。ただし、(このリストhttp://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.htmlを使用して) 試してみると、再び正常に動作します!

誰かがこれを説明したり、何を探すべきかについて他の提案をしたりできますか? でコードを実行しましたが、valgrindエラーは報告されません。

編集

計算は で正しく、-O0で正しくありませんが-O1、 で再び正しいことがわかりました-O1 -ffloat-store。何を探すべきかについての考えは、それなしでは機能しません-ffloat-storeか?

EDIT2

通常のリリース フラグでコンパイルすると、計算エラーが発生します。ただし、次のいずれかを追加すると:

-ffloat-store

また

-mpc64

フラグのリストに追加すると、エラーはなくなります。

このフラグが違いを生んでいる行を追跡する方法を誰かが提案できますか?

4

1 に答える 1

3

私の GCC/C++ 時代から、私が覚えているこのような最適化のバグは-O0、戻り値が指定されていない on メソッドを使用すると、メソッド内のその型の最後の値が返されるということでした (おそらく、あなたが返したかったものは正しいでしょうか?)その最適化は、メソッド内の型の最後の値ではなく、型のデフォルト値を返しました(これは値型にのみ当てはまる可能性があり、覚えていません)。これは、デバッグ フラグをオンにして何年にもわたって開発し、すべてが正常に見えることを意味し、最適化すると動作しなくなります。

戻り値を指定しないのはコンパイル エラーですが、当時は C++ でした。

これに対する解決策は、最も強力な警告セットをオンにしてから、すべての警告をエラーとして扱うことでした。これにより、次のようなことが強調されます。(まだこれを行っていない場合は、非常に苦労することになります!)

すでにすべてのエラー/警告がオンになっている場合、唯一の他のオプションは、副作用のあるメソッド呼び出しが最適化されていることです。それは追跡するのが難しくなるでしょう。

于 2012-12-08T16:35:46.097 に答える