问题由来
某一项目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<<"1111"<<"2222"<<"3333"<<"4444";
qInfo()<<"getSize return value:"<<getSize(header);
return a.exec();
}
上述代码编译能正常通过,运行输出结果如下:
debug版本的输出:
getSize return value: 4
release版本的输出:
getSize return value: 0
可见gcc编译器在debug和release版本下函数默认返回值不一样,release 版本默认返回了0,这就是release版本崩溃的原因。不得不说,gcc编译的debug和release版本行为不一致,是个很大坑。
问题处理
找到原因,相应的处理措施就有了,即函数中添加return返回相应的值。
但是有没有更好的办法,在编译阶段就避免这样的问题呢?
方法1:
因为是编译器问题,如果有条件可以更换编译器,我试了下MSVC2015_32bit的编译器。在debug下编译不通过:
e:\test\tableview\main.cpp(8) : error C4716: “getSize”: 必须返回一个值
不得不说MSVC的做法更合理。
方法2:
提升gcc的告警等级,加入-Werror 编译参数,将所有的告警当做错误处理,但是这个可能不是我们想要的,我们想要的是将某一类告警(return-type)当做错误处理,小伙伴们有知道方法的,可以留言,多谢了~