[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[FDclone-users:01033] Re: 64bit Solaris(SPARC)環境下でのSiganl-11エラー



 しらいです。

In Message-Id <1383060985321914.1987482736@pop.brain.riken.jp>
        Hiroshi Kurokawa <hiroshi-k@brain.riken.jp>さんwrites:
> お世話になっております、黒川です。

> cp[n] = 0;のときは1回目から落ちますが、
> test2 = cp[w + n];ではsignal-11は発生しませんでした。

 読めないのではなくて書けないんですね?なら alignment 問題
ではなさそうです。そもそも先頭領域なんですから。


> この部分なのですが、
> 私の環境では、custom.cのマクロ定義部分で、
> #ifdef FORCEDSTDCの部分が生きているらしく、
> def_num(n) は envlist[n].def.numに展開されるようです。
> FORCEDSTDが生きていなければ (int)envlist[n].defなのですが。
> それぞれのsizeofを採ってみますと、
> sizeof(envlist[i].def) = 8
> sizeof(envlist[i].def.num = 4
> となっているようです。

 なるほど。私がすっかり勘違いしていたようです。sparc64 環境
では __STDC__ が未定義で共用体が使えないのだと思い込んでしま
いましたが、良く見ると実際は逆ですね。
 この辺りのコードが実装された 2.08e の頃の ML を読むと、こ
の措置は正に sparc64 用に書かれていて、その時点ではちゃんと
機能していたのだと思います。

 で、改めて 2.08d -> 2.08e の差分を解析してみると、一箇所と
ても重大な変更をしているのを見落としていました。endian 解決
用の memmove() だけではなかったんですね。
 2.08d -> 2.08e で envlist[] 宣言の const が取れています。
確かにこんなものがあれば memmove() は失敗しますね。const な
んだから書込み禁止で当たり前です。
 alignment とか仮想メモリとか全然関係なくて、const 宣言され
た構造体要素に対して memmove() してたから SEGV で落ちたんで
しょう。多分これが正解かと。

 この const がいつの間にまた復活したのか変遷を追ってみると、
2.09d でしれっと追加されていますが、HISTORY にも ML にも特に
理由は書かれていません。
 同時期に他にも何箇所か const を追加してるので、安全を考え
て const を大量導入したついでに勢い余って余計なところまで追
加してしまったんだと思います。

 ということで下記 patch で如何でしょう?

---- Cut Here ----
diff -ur ../old/FD-3.01a/custom.c ./custom.c
--- ../old/FD-3.01a/custom.c	Sat Jun  8 00:00:00 2013
+++ ./custom.c	Wed Oct 30 21:20:22 2013
@@ -74,6 +74,11 @@
 #define	def_num(n)		((int)(envlist[n].def))
 #define	DEFVAL(d)		(char *)(d)
 #endif
+#if	!MSDOS && defined (FORCEDSTDC)
+#define	ENV_CONST
+#else
+#define	ENV_CONST		CONST
+#endif
 
 #define	T_TYPE			0037
 #define	T_PRIMAL		0040
@@ -378,7 +383,7 @@
 int basiccustom = 0;
 #endif
 
-static CONST envtable envlist[] = {
+static ENV_CONST envtable envlist[] = {
 #ifndef	_NOCUSTOMIZE
 	{"FD_BASICCUSTOM", &basiccustom,
 		DEFVAL(BASICCUSTOM), BSCS_E, _B_(T_BOOL)},

---- Cut Here ----

 単に const を削除するだけだと、時間が経ってまた忘れて同じ
過ちを犯しそうなので、どうしてここが const ではいけないのか
読み取れるような実装にしてみました。
 これ以外の箇所でも 64bit 環境に耐性のないところがあるかも
知れませんが、そこはまた今回の SEGV が片付いてから考えること
にして、まずはこの patch をご賞味下さい。

                                               しらい たかし