2017-02-10 82 views
-1

我有一個令人難以置信的段崩潰調用堆棧在C中,任何人都可以幫我嗎?令人難以置信的程序崩潰調用堆棧

int function(struct A *a) 
{ 
    ... some other declare 
    struct B *b = a->b; 
    int count, len; 
    ... some other declare 
    struct C *c = b->c; /* not crash here */ 
    ....some other decalre 

    if (b->e) { /*crash log indicate b is NULL and crash here,first line instrucment code*/ 
    ..... 
    } 
    .... 
} 

我的問題是爲什麼碰撞沒有發生在struct C *c = b->c

GCC是編譯器。

Tony

+0

你見過任何能保證文檔「崩潰」的東西嗎? –

+3

訪問無效指針是未定義的行爲。只要UB遇到,編譯器就沒有義務保證崩潰。根據定義UB意味着行爲是不可預測的。 – kaylum

+0

什麼是令人難以置信的細分市場?我想更多地瞭解這些! –

回答

0

除非存在數據流依賴性,否則編譯器不保證有序的指令執行。它有很多優化,其中之一是data flow optimization。另外,如果根本沒有使用變量c,編譯器將優化代碼(dead code optimization),並且根本不會看到崩潰(如果程序的其餘部分工作正常)。

瞭解發生哪種優化的一個簡單方法是在某處訪問變量c。另一種方法是禁用優化(GCC中的-O0)。

相關問題