C++ 这是一个gcc优化错误吗?

C++ 这是一个gcc优化错误吗?,c++,gcc,gcc3,C++,Gcc,Gcc3,这是我的密码: bool func(const MY_STRUCT *const ptr, some_struct *x, int y) { printf("IN: %p\n", ptr); // ok for (int i = 0; i < y; ++i) { if (ptr->foo(x[i].key) == 0) { return false; } } printf("OUT: %p\n",

这是我的密码:

bool func(const MY_STRUCT *const ptr, some_struct *x, int y)
{
    printf("IN: %p\n", ptr); // ok
    for (int i = 0; i < y; ++i) {
        if (ptr->foo(x[i].key) == 0) {
            return false;
        }
    }
    printf("OUT: %p\n", ptr); // ok
    return true;
}

void process(void)
{
    ... ...
    for (i = 0; i < num; ++i) {
        MY_STRUCT *ptr = obj->GetPtr(); // success
        printf("BEFORE: %p\n", ptr); // ok
        if (func(ptr, x, y) == false) {
            continue;
        }
        printf("AFTER: %p\n", ptr); // <nil> when compile with -O2
        printf("%s", ptr->data); // *** segment fault here ***
    }
}
bool func(const MY_STRUCT*const ptr,some_STRUCT*x,int y)
{
printf(“IN:%p\n”,ptr);//确定
对于(int i=0;ifoo(x[i].key)==0){
返回false;
}
}
printf(“输出:%p\n”,ptr);//确定
返回true;
}
作废处理(作废)
{
... ...
对于(i=0;iGetPtr();//成功
printf(“之前:%p\n”,ptr);//确定
if(func(ptr,x,y)==false){
继续;
}
printf(“之后:%p\n”,ptr);//使用-O2编译时
printf(“%s”,ptr->data);//***此处的段错误***
}
}
输出:

BEFORE: 0x0612d3fa
IN: 0x0612d3fa
OUT: 0x0612d3fa
AFTER: <nil>
segment fault
之前:0x0612d3fa
IN:0x0612d3fa
输出:0x0612d3fa
之后:
分段断层
如果我用-O0编译上述代码,一切都很好。 但是,如果我使用-O2编译它,在调用函数
func
之后,
ptr
将变为
NULL

这是一个gcc错误吗?有没有人遇到过类似的错误


我的gcc版本是:
gcc版本3.4.5 20051201(Red Hat 3.4.5-2)

无论您的编译器可能有或没有错误,如果您在发布的代码中看到所描述的问题,那么您的gcc在任何优化级别都会被破坏

根本不应该到达有问题的代码行

func
始终返回true,如果返回true,则跳过循环体的最后一部分

如果您怀疑编译器有错误,请先编写一个代码示例来复制它

当我们不知道您的实际代码是什么样子时,我们就不可能猜测GCC的行为是否正确。

很可能您在
func
中有一个堆栈粉碎机,它正在覆盖调用方堆栈上的
ptr
。确保
func
中的任何数组或结构访问保持在边界内。如果不是因为我对gcc 3.x的酸涩记忆,我会说这几乎肯定就是实际发生的事情。即便如此,这也是最有可能的解释

在这一点上,如果您的代码确实与问题中发布的代码相同,那么这可能是一个编译器错误:

    printf("BEFORE: %p\n", ptr); // ok
    if (func(ptr, x, y)) {
        continue;
    }
    printf("AFTER: %p\n", ptr); // <nil> when compile with -O2
printf(“之前:%p\n”,ptr);//好啊
if(func(ptr,x,y)){
继续;
}
printf(“之后:%p\n”,ptr);//当使用-O2编译时
ptr
通过值传递给
func
,因此无论在
func
中发生什么,调用函数中的值都不应更改


然而,您使用的是一个真正古老的编译器;即使你报告了这个错误,也不会有任何结果。很有可能导致这种情况的原因在
gcc
中早已改变。请尝试更新版本或其他编译器。

可能是编译器的错误,但在开始搜索之前,请在valgrind下运行程序,并确保没有内存访问问题。也许你的某个地方出现了堆栈损坏。代码中有99.999%的错误。请发布更多代码和执行的实际使用情况+输出。编程的第三条规则:“始终怀疑错误存在于您的代码中,而不是其他人或编译器”旁注:GCC中的许多错误自2005年以来已经修复。在较新的编译器下,这段代码是如何运行的?我不明白的是,你对
func
的snipet总是返回
true
,而你说的崩溃部分只有在
func
返回
false
时才应该被调用。我假设
中的某个地方有
返回false
;另一种选择太可怕了。很有可能,但如果我们不知道它在哪里,以及可能发生的其他情况,就不可能猜测正确的行为应该是什么。稍后我将尝试使用gcc4编译它,并发布结果。奇怪的是,
ptr
总是
NULL
。我认为如果
func
重写
ptr
中的某个值,它将是一个随机值,几乎不可能是0。