Qt debugバージョン正常releaseバージョン実行クラッシュ問題レコード

1360 ワード


問題の由来
あるプロジェクトのdebugバージョンが正常に実行され、リリース段階に入ると、release後のバージョンがクラッシュする問題が発生しました.releaseバージョンなので、debugが実行できません.printf debugを通過するしかありません.問題の原因は簡単ですが、時間がかかりました.この記録を作成して、後続の参考にします.
問題環境
    :Qt 5.6.1

   :gcc version 4.9.2 (i686-posix-dwarf-rev1, Built by MinGW-W64 project)

問題の原因
問題コードの例:
サンプルコードの内容は少なく、getSize()にreturn戻り値がないというコードに問題があることがわかりやすい.
int getSize(const QStringList &list)
{
    list.size();
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QStringList header;
    header<

上記のコードコンパイルは正常に通過でき、実行出力結果は以下の通りである.
debug     :
getSize return value: 4

release     :
getSize return value: 0

gccコンパイラはdebugとreleaseバージョンで関数のデフォルト戻り値が異なり、releaseバージョンではデフォルトで0を返していることがわかります.これがreleaseバージョンのクラッシュの原因です.gccコンパイルのdebugとreleaseバージョンの動作が一致せず、大きな穴であると言わざるを得ない.
問題処理
理由を見つけると、対応する処理措置があります.すなわち、関数にreturnを追加して対応する値を返します.
しかし、コンパイル段階でこのような問題を避ける方法はありますか?
方法1:
コンパイラの問題なので、条件があればコンパイラを交換できるので、MSVC 2015_を試してみました.32 bitのコンパイラ.デバッグでコンパイルが失敗しました:
e:\test\tableview\main.cpp(8) : error C4716: “getSize”:        

MSVCの方が合理的だと言わざるを得ない.
方法2:
gccのアラームレベルを上げて、-Werrorコンパイルパラメータを加えて、すべてのアラームをエラーとして処理しますが、これは私たちが望んでいるものではないかもしれません.私たちが望んでいるのは、ある種類のアラーム(return-type)をエラーとして処理することです.