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) {
コードはデバッグモードでコンパイルされましたか?もしそうなら、それはアセンブリコードがこのように記述された理由を説明することができます。 –
これは '-O0 -g3'でコンパイルされました。それはまだジャンプのジャンプを生成したが、それはおそらくそれを説明するだろう少し奇妙に思えます。 –
タグCを追加したので、このコードの原因となったソース行は何ですか? – usr2564301