2017-01-18 12 views
0

逆参照されているマングルされたポインタでプログラムがクラッシュする問題をデバッグするとき、私はlldbを実行し、クラッシュ関数の逆アセンブリを実行しました。私はコードは、この代わりのように見えることを期待するClangのアセンブラ出力が条件付きで無条件ジャンプにジャンプするのはなぜですか?

0x100002b06 <+86>: cmpl $0x0, %eax 
0x100002b09 <+89>: je  0x100002b14 
0x100002b0f <+95>: jmp 0x10000330e 
0x100002b14 <+100>: jmp 0x100002c1d 

0x100002b06 <+86>: cmpl $0x0, %eax 
0x100002b09 <+89>: je  0x100002c1d 
0x100002b0f <+95>: jmp 0x10000330e 

I逆アセンブルコードを熟読しながら、私は、命令のこの奇妙な選択肢に気づきましたなぜクラングがこの選択をしたのか不思議だ。これはブランチ予測の最適化の一種ですか?これはNULLポインターチェックであり、一致する可能性は非常に低いですか?

編集:This is the originating C code,特にNULLポインタチェックの行。

traverse = travdone_head; 
while (1) { 
    if (traverse == NULL) nullptr("grokdir() traverse"); 
    /* Don't re-traverse directories we've already seen */ 
    if (inode == traverse->inode && device == traverse->device) { 
+0

コードはデバッグモードでコンパイルされましたか?もしそうなら、それはアセンブリコードがこのように記述された理由を説明することができます。 –

+0

これは '-O0 -g3'でコンパイルされました。それはまだジャンプのジャンプを生成したが、それはおそらくそれを説明するだろう少し奇妙に思えます。 –

+0

タグCを追加したので、このコードの原因となったソース行は何ですか? – usr2564301

答えて

0

-O0コンパイル時間を短縮し、デバッグが期待される 結果を生成します

ためです。これがデフォルトです。

ソースコードと比較すると面白いかもしれません。

関連する問題