我正在用包含图形文件解析器的C++/Qt编写程序。我使用g++
编译该项目。在开发过程中,我经常比较不同编译器标志之间关于优化和调试信息以及Qt调试标志(打开/关闭qDebug()和Q_ASSERT())的低级别解析器层的性能。编译器优化使程序崩溃
现在我面临一个问题,其中唯一正确运作的版本是没有任何优化。所有其他版本,即使是-O1
,似乎都以另一种方式工作。他们由于不满意的断言而崩溃,当编译时没有-O...
标志时,它们得到满足。该代码不会产生任何编译器警告,即使使用-Wall
。
我很确定我的程序中有一个错误,这似乎只对启用优化有害。问题是:即使在调试程序时我也找不到它。解析器似乎从文件中读取错误的数据。当我运行一些简单的测试用例时,它们运行得很完美。当我运行一个更大的测试用例(一个直接从文件读取的图上的路由计算)时,文件中有一个不正确的读取,我无法解释。
我应该从哪里开始追踪这种未定义行为的问题? 这种不同的行为可能涉及哪些优化方法?(我可以一个接一个地启用所有的标志,但我不知道那么多的编译器标志,但是我知道它们有很多,所以这将需要很长时间。)只要我知道哪种类型的错误是,我相信我迟早会发现它。
如果你能告诉我哪种编译器优化方法可能成为这类问题的候选者,你可以帮助我很多。
听起来像某处的未定义的行为。 – 2012-07-11 00:17:28
@ R.MartinhoFernandes是的,但我怎么找到它?也许使用valgrind? – leemes 2012-07-11 00:18:08
是的,valgrind会警告你未经初始化的值。 – MatijaSh 2012-07-11 00:22:32