gpt4 book ai didi

c++ - 编译器优化使程序崩溃

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:56:50 25 4
gpt4 key购买 nike

我正在用 C++/Qt 编写一个程序,其中包含一个图形文件解析器。我使用 g++ 编译项目。

在开发过程中,我一直在比较不同编译器标志之间关于优化和调试信息的低级解析器层的性能,加上 Qt 的调试标志(打开/关闭 qDebug() 和 Q_ASSERT())。

现在我面临一个问题,唯一正确运行的构建是没有任何优化的构建。所有其他版本,即使使用 -O1,似乎都以另一种方式工作。它们由于不满足的断言而崩溃,这些断言在没有 -O... 标志的情况下编译时得到满足。即使使用 -Wall,该代码也不会产生任何编译器警告。

我非常确定我的程序中有一个错误,它似乎只在启用优化时有害。问题是:调试程序也找不到。解析器似乎从文件中读取了错误的数据。当我运行一些简单的测试用例时,它们运行得很完美。当我运行一个更大的测试用例(直接从文件读取的图表上的路由计算)时,文件中出现错误读取,我无法解释。

我应该从哪里开始追踪这个未定义行为的问题? 这种不同的行为可能涉及哪些优化方法?(我可以一个接一个地启用所有标志,但我不知道那么多编译器标志,但 -O... 而且我知道有很多,所以这需要很长时间。)一旦我知道错误的类型,我相信我迟早会找到它。

如果你能告诉我哪些编译器优化方法可能是解决此类问题的候选者,你将对我有很大帮助。

最佳答案

有几类错误通常出现在优化构建中,而通常不会出现在调试构建中。

  1. 未初始化的变量。编译器可以捕获一些但不是全部。看看你所有的构造函数,看看全局变量。等等。特别是寻找未初始化的指针。在调试版本中内存重置为零,但在发布版本中它不是。

  2. 使用超出范围的临时对象。例如,当您在函数中返回对局部临时变量的引用时。这些通常在调试版本中工作,因为堆栈被填充得更多。临时对象往往会在堆栈中存活更长的时间。

  3. 数组超出了临时对象的写入范围。例如,如果您在函数中创建一个临时数组,然后在结尾处写入一个元素。同样,堆栈将在调试中有额外的空间(用于调试信息)并且您的溢出不会命中程序数据。

关于c++ - 编译器优化使程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11423826/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com