当相同的源代码在两个不同的编译器下给出不同的答案时,它意味着什么?

时间:2012-09-25 18:49:03

标签: c++ compiler-construction memory-leaks valgrind

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

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

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

2 个答案:

答案 0 :(得分:4)

这可能意味着您依赖于undefined, unspecified or implementation-defined behavior

也许您忘了初始化变量,或者访问超出其有效范围的数组,或者您的代码中有a[i] = b[i++]这样的表达式......可能性实际上是无限的。

答案 1 :(得分:0)

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

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

尝试使用gcc / g ++编译命令参数中包含的'-fstack-protector'编译您的应用。