Qt debugバージョン正常releaseバージョン実行クラッシュ問題レコード
問題の由来
あるプロジェクトの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)をエラーとして処理することです.