g++有bug吗?clang++呢?使用-O0和-O1选项编译的g++代码行为不同,使用-O0和-O2选项编译的clang++也是如此。

4
下面的代码命名为文件“main000.cpp”,使用以下命令在Linux机器上进行编译和执行:
g++  -std=c++11 -m32 -O0  main000.cpp ; ./a.out

并且会正常执行。

而如果将代码编译并将O0更改为O1后执行

g++  -std=c++11 -m32 -O1  main000.cpp ; ./a.out

为什么代码无法运行并生成堆栈转储?

有没有人知道原因?

#include <stdio.h>
#include <string>

using namespace std;
typedef unsigned int Token;

const Token tokenBase=0x80000000;

enum        classId{
    classNoId=tokenBase,
    classPrimitiveId,
};

struct classInfo{classId id;wstring name;};

classInfo classInfos[]={ 
    {classNoId,L"classNoID"},
    {classPrimitiveId,L"classPrimitiveId"},
};

int main(){
    int id=classInfos[0].id;
    return 0*id;
}

5
这通常是代码中潜在错误的标志。尝试进行调试、压力测试、使用Valgrind等工具进行检查。 - Paul R
2
你在这20行代码中看到任何bug吗? - George Kourtis
3
你的代码存在未定义行为,请使用"-Wall -Wextra -Werror"编译该代码并试图找出问题所在。 - user2485710
2
@GeorgeKourtis 这是你最后的编辑吗?请指出你已经在帖子中解决了这个问题。否则,对于其他人阅读此内容将会非常困惑! - πάντα ῥεῖ
3
"g++有bug吗?clang++也有吗?" 非常不可能... - πάντα ῥεῖ
显示剩余49条评论
1个回答

5
对于-O1-O2,对我来说在以下环境下都能正常运行:
  • Clang 3.2和GCC 4.8.1(Windows)
  • Clang 3.3和GCC 4.7.3(Linux)
所以这可能是你的设置问题。建议在gdb中运行并获取backtrace
确保不要链接具有冲突标识符定义的库。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接