[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[FDclone-users:01033] Re: 64bit Solaris(SPARC)環境下でのSiganl-11エラー
- Subject: [FDclone-users:01033] Re: 64bit Solaris(SPARC)環境下でのSiganl-11エラー
- From: Takashi SHIRAI <shirai@unixusers.net>
- Date: Wed, 30 Oct 2013 22:20:39 +0900
しらいです。
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 をご賞味下さい。
しらい たかし