编译没有优化?尽可能安全?

Posted

技术标签:

【中文标题】编译没有优化?尽可能安全?【英文标题】:compile with no optimization? as safe as possible? 【发布时间】:2012-11-10 00:57:38 【问题描述】:

我有一些代码表现得很奇怪。奇怪的人指责我的输出并没有真正发生(我希望这会让我的生活更轻松)。该代码在 windows (ms vc++, gcc) 中运行良好,但在 linux (gcc, clang) 上失败。

我目前使用g++ -g -std=c++0x -Wall -c file.cpp 进行编译,有什么比这更安全的吗?哦,这个段错误(在 linux 上)即使没有任何警告......

【问题讨论】:

另见***.com/questions/13317010/…和***.com/questions/13316371/…。 【参考方案1】:

Seg 错误表示运行时错误,例如堆损坏。无论您使用何种编译选项,它都无助于捕捉所有可能的运行时错误和问题。

即没有 catch-all-errors 选项与 any 组 gcc 选项。

您可以使用静态分析器、valgrind 等工具,也可以检查出现段错误的代码。

【讨论】:

valgrind 在段错误发生之前没有报告任何错误,我的 printfs 在段错误之前看到错误,我向某人展示了程序集,他们说这看起来像是一个返回值优化错误。 -Wall 上没有出现错误/警告,它完全可以在 Windows 上运行,而且我正在使用 C++11 功能,所以可能有一些事情没有解决。但是......应该有什么要说的禁用内联和其他小的优化? 很难想象编译器优化会引入运行时错误。它可能会积极或消极地影响性能,但不会引入错误。运行 GDB 和 valgrind 没有发现段错误? 我用它来找出它为什么会出现段错误。那是因为地址不好。该变量位于堆栈上。我从堆栈中打印了两个变量,一个具有正常的地址,另一个具有无效的地址。这让我大吃一惊。如果您真的有兴趣并了解 x86 程序集,请随时查看我的最后一个问题。但是这个问题仍然是我如何关闭所有优化 Bug 是(命名的)返回值优化。那就是我想关掉的。我只是不知道它叫什么 @acidzombie24:考虑到标准明确允许该行为,这并不完全是一个错误。重新设计代码以使用它而不是关闭它可能是一个更好的主意。

以上是关于编译没有优化?尽可能安全?的主要内容,如果未能解决你的问题,请参考以下文章

2017-2018-1 20155214 《信息安全系统设计基础》第14周学习总结

“项目名称”经过优化编译

创建系统调用的编译器优化?

现代 Prolog 编译器是不是会在安全的情况下自动优化发生检查?

07:线程安全-可见性问题

程序编译与代码优化 -- 早期(编译期)优化