這裏是我的代碼:這是一個gcc優化錯誤嗎?
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 ***
}
}
輸出:
BEFORE: 0x0612d3fa
IN: 0x0612d3fa
OUT: 0x0612d3fa
AFTER: <nil>
segment fault
如果我編譯上面的代碼用-O0,一切工作正常。 但是,如果我使用-O2編譯它,在函數func
被調用後,ptr
變爲NULL
!
這是一個海灣合作委員會的錯誤?有沒有人遇到類似的錯誤?
我的gcc版本是:gcc version 3.4.5 20051201 (Red Hat 3.4.5-2)
你可能在'func'中的「做某事」代碼中存在一個bug,該代碼會搗毀調用者的'ptr' –
也許這是一個編譯器的bug,但在開始搜索之前,在valgrind下運行你的程序,確定沒有內存訪問問題。也許你在某處存在堆棧損壞。 –
這是代碼中的99.999%的錯誤。請發佈更多代碼和實際用法+執行輸出。 –