C ++代码不同g ++版本之间的稳定性

时间:2017-08-31 11:34:45

标签: c++ gcc g++

过去几个月,我们一直试图在我们的大型遗留应用中追踪一些奇怪的行为。它遭受随机和偶然的内存损坏,vtable损坏(??),以及其他奇怪和随机的行为,如std :: rbl_tree,std :: map中的无限循环,甚至std :: string s =“abcd”。

目标机器是32位Centos 6所以我们从内置g++ 4.4开始,但是地址清理程序不可用,所以在devtoolset-2中移动到4.8并且现在编译了{{1}来自消息来源。

gcc 4.9(v3.8.1)不适用于其中任何一项 - 它会Valgrind

unhandled instruction bytes: 0xC5 0xF9 0x6E 0xC5报告gcc 4.8和4.9之间的不同错误,并经常报告虚假全局缓冲区溢出错误,如

  

读取0x080e3ad4时出错,其中0x080e3ad4位于0字节   全局变量'x'的权利

除了0x080e3ad4 x的地址外

更糟糕的是,gcc版本之间的错误行为是不同的

我已经阅读了很多帖子,比较了gcc v5,6,7的速度优势,但没有关于它们产生的代码的稳定性。

由于需要花费很多精力来构建一个新的gcc并重新配置我们的大型应用程序来构建它,并且测试&为客户打包分发,问题在于:

  • 更新的gcc在稳定性方面有哪些改进?
  • AddressSanitizer如何改进?
  • 我们可以期待Valgrind不会讨论非法操作码吗?

所有建议都表示赞赏。这个问题花了好几个月。

修改

要清楚,我希望得到有效的工具(例如AddressSanitizerAddressSanitizer或其他),以便我们可以修复基础行为。这些调试工具是否工作与编译器环境相关,而不是我们的C ++程序。 (例如,程序中没有汇编程序,因此Valgrind应该理解编译器的指令和/或编译器应该发出Valgrind理解的操作码,作为一个例子。

编辑II

G ++编译器标志(用于调试编译)

Valgrind

目标硬件:i5-6500

0 个答案:

没有答案