[Momonga-devel.ja:00899] Re: dbskkd-cdb (Re: Re: GCC3 マージ後のビルド状況)


むらけんです.

In message <20021124221728.7B28D72501@xxxxxxxxxxxxxxxxxxxx> at Mon, 25 Nov 2002 07:17:27 +0900,
KOMATSU Shinichiro <koma2@xxxxxxxxxxxxxxxxxxxx> wrote:
> ウチだと dbskkd-cdb-1.01-9m の修正で直りましたが、
> さくさんのところではどうですか?
> 
> # 別なところを直したつもりだったのに直ってしまったので、
> # 本当にこれが原因だったのかは調べてないです。
> # 詳しくは patch を。

見てみました.rpm でビルドされる時と同じコンパイルオプションを用いて

  gcc -g -O2 -march=i586 -funroll-loops -fomit-frame-pointer -ffast-math -DSERVER_DIR=\"/usr/sbin\" -S dbskkd-cdb.c

でアセンブル言語のソースを吐かせました (-g はデバッグ情報が入
るだけで,コンパイルの結果には影響しません).この出力結果であ
る dbskkd-cdb.s は添付します.

僕が注目したのは,問題の現象より search 関数の

  } else if (length == 0) {
    syslog(LOG_NOTICE, "end of file detected");
    return -1;
  }

の部分です.問題の現象はこの部分が無限に実行されることで起こり
ます.

この部分に対応するアセンブリ言語ソースは 189 行目なんですが,
その前の部分から追っていきます.まず 184 行目の

	call	read

ここで,戻り値が 0 になっていると仮定します.これを仮定しない
と問題の現象は起きません.関数の戻り値は %eax に格納された状態
で返されます.

	movl	%eax, %ebx
	addl	$16, %esp

戻り値が %ebx に保存(?)され,read を呼び出す際に使用したスタッ
クをクリアしている部分です.

	testl	%eax, %eax
	js	.L68

ここは,if (length > 0) の条件の判定ですが,この js ではジャン
プされません (∵ %eax == 0).ちなみに,testl は2つのオペランド
同士で AND をとってフラグを変化させる命令です.

	testl	%eax, %eax
	je	.L69

ここが問題の else if (length == 0) の条件判定で,%eax == 0 よ
り je でジャンプされます.僕も飛びたいと思います.

.L69:
	pushl	%edi
	pushl	%edi
	pushl	$.LC6
	jmp	.L66

ここでは,syslog を呼び出す時の文字列 "end of file ..." (.LC6) 
をスタックに入れています..L66 に飛ぶと

.L66:
	pushl	$5
	call	syslog
	jmp	.L65

実際に syslog が呼び出されます..L65 に飛ぶと

.L65:
	addl	$16, %esp

ここで syslog を呼ぶ際に使用したスタックがクリアされ

.L9:
	addl	$3100, %esp

ここで search 関数のローカル変数がクリアされ

	popl	%ebx
	popl	%esi
	popl	%edi
	popl	%ebp
	ret

呼び出し元にリターンします.

問題の現象が起こる場合の search 関数の動きはこれで終りです.し
かし,

    return -1;

の -1 がどこにも出てきていません.main 関数の

  /* command loop */
  while (search() == 0) {}

このコードに対応するアセンブリ言語のソースは 592 行目からの

.L88:
	call	search
	testl	%eax, %eax
	je	.L88

これなんですが,search 関数で,read を呼び出して以後,ret する
までの間,%eax は 0 のままなので,上の .L88 の部分は一生ループ
している事になります.

結論としては,dbskkd-cdb の問題は gcc-3.2 のバグによる現象だと
考えて良いのではないでしょうか?

でわ.

--
1024D/2A3FDBE6 2001-08-26 Kenta MURATA (MURAKEN) <muraken2@xxxxxxxxx>
Key fingerprint = 622A 61D3 280F 4991 4833  5724 8E2D C5E1 2A3F DBE6


Attachment: dbskkd-cdb.s
Description: Binary data