相同的源代码在两个不同的编译器下给出不同的答案是什么意思?

问题描述 投票:0回答:2

我处于一种非常奇怪的情况,我的代码在我的桌面上运行,但在远程集群上崩溃。我花了无数次检查我的源代码是否有错误,在调试器中运行它以捕获破坏代码的内容,并在 valgrind 下查找内存泄漏(结果证明是干净的 - 至少在 gcc 下)。

最终我到目前为止发现的是,只要我使用相同的编译器(gcc 4.4.5),相同的源代码在两台机器上会产生相同的结果。问题是我想在远程集群上使用英特尔编译器以获得更好的性能以及一些使用英特尔的预构建库。此外,我仍然担心 gcc 可能忽略了 intel 编译器中捕获的一些内存问题。

这对我的代码意味着什么?

c++ memory-leaks valgrind
2个回答
4
投票

这可能意味着您依赖于未定义、未指定或实现定义的行为

也许您忘记初始化变量,或者您访问的数组超出了其有效范围,或者您的代码中有像

a[i] = b[i++]
这样的表达式......可能性几乎是无限的。


0
投票

崩溃是否会产生核心文件? 如果来自多个核心转储的反向跟踪(相当于 gdb 'bt' 命令)是一致的,那么您可以开始有选择地放入 printf 语句,并在堆栈跟踪中向后查找函数列表。

如果没有检测到内存泄漏,那么堆可能没问题。 这使得堆栈成为一个潜在的问题区域。 看起来您可能有一个未初始化的变量正在破坏堆栈。

尝试使用 gcc/g++ 编译命令参数中包含的“-fstack-protector”来编译应用程序。

© www.soinside.com 2019 - 2024. All rights reserved.