2017-02-10 8 views
-1

私はCで1つの信じられないほどのセグメントクラッシュコールスタックを持っています。信じられないほどのプログラムクラッシュコールスタック

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はコンパイラです。データフロー依存性がない限り

トニー

+0

ドキュメンテーションの「クラッシュ」を保証する何かを見たことがありますか? –

+3

無効なポインタへのアクセスは未定義の動作です。コンパイラは、UBに遭遇するとすぐにクラッシュを保証する義務はありません。定義上、UBは行動が予測不能であることを意味する。 – kaylum

+0

信じられないほどのセグメントは何ですか?私はこれらについてもっと知りたいです! –

答えて

0

コンパイラは、命令の実行順序を保証するものではありません。多数の最適化があり、そのうちの1つはdata flow optimizationです。

また、変数cをまったく使用しないと、コンパイラはコード(dead code optimization)から最適化し、プログラムの残りの部分が正常に動作してもクラッシュすることはありません。

どの最適化が起こっているかを簡単に理解するには、c変数にアクセスする必要があります。別の方法は、最適化を無効にすることです(GCCの-O0)。

関連する問題