予期せぬ結果を返す何らかの数学的計算のために失敗しているユニットテストがあります。make/gcc:「不良ビルド」の考えられる原因は何ですか?
- コード自体は正しいことがわかっています。
- ビルドシステムは、私たちが私のmakefileが正しいことを高い信頼度を与える、私たちのmakefileを生成するためにcmakeのを使用するコンパイラフラグが
を変更していない
ビルドは何ヶ月も働いていますが、それはまさにこのようなものです。
私は失敗したテストのためのオブジェクトファイルを見ました。そして期待どおり、ソースファイルよりも新しいので、makeは再ビルドする必要はないと考えています。
-rw------- 1 steve steve 64578 Feb 7 11:13 foo_tests.cc
-rw------- 1 steve steve 12930760 Feb 14 13:18 foo_tests.cc.o
オブジェクトファイルを削除して再構築すると、テストに合格するようになりました。
-rw------- 1 steve steve 12931080 Feb 16 13:57 foo_tests.cc.o
私は新しいオブジェクトファイルが少し大きかったことに気付きました。それはやや困惑している。
このような不良ビルドの原因は何ですか?
実行前に誤ったビルドを検出して偽のエラーを検出する方法はありますか?
ビルドの詳細:
これは、メイクファイルとリリースモードのバイナリでは、我々が使用コンパイラフラグがあるcmakeのを使用して生成、およびCentOSに7.2
上のgcc 5.2.1を使用して構築
CXX_FLAGS
-Werror
-Wall
-Wextra
-m64
-msse2
-msse4.2
-mfpmath=sse
-ftemplate-depth-128
-Wno-unused-parameter
-Wno-maybe-uninitialized
-Wno-strict-aliasing
-pthread
-DBOOST_DATE_TIME_POSIX_TIME_STD_CONFIG
-ggdb2
-DNDEBUG
-O3
-funroll-loops
-fdevirtualize
-finline-functions
-fno-builtin-malloc
-fno-builtin-calloc
-fno-builtin-realloc
-fno-builtin-free
LINKER_FLAGS:
-m64
-rdynamic
_「悪いビルドを検出して偽のエラーを発見するためにできることはありますか?」_一部のビルドシステムでは_dry runs_を実行できます。 –
あまりにも広すぎると投票する。ビルドを壊す原因となるものが多すぎます。 –
'.cc'ファイルが使うヘッダファイルが変わったかもしれませんが、あなたのmakefileはヘッダファイルを' .o'ファイルの前提条件としてリストアップしていません。おそらくあなたのソースファイルのタイムスタンプが誤って古い値にリセットされていたか、 '.o'ファイルのタイムスタンプが再構築されずに間違って更新された可能性があります。あなたのmakefileを見たり、あなたの設定についてもっと知ることなく、言うことは不可能です。 – MadScientist