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

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



 しらいです。

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

> >> 	if (w > 0) {
> >> 		int n;
> >> 
> >> 		cp = (char *)&def_num(i);
> >> 		for (n = 0; n < sizeof(int); n++)
> >> 			cp[n] = cp[w + n];
> >> 	}
> このコードをmemmoveの代わりに置いて、トレースしてみました。
> 結果としては、一番最初のcp[n] = cp[W + n];の箇所で落ちました。

 一個目ということは n = 0, w = 4 ですから cp[0] = cp[4]; で
落ちてるんですね?参照か代入かどっちで蹴られてるんでしょうね。
cp[n] = 0; にすると?n = cp[w + n]; では?
 cp[0] も cp[4] も dword 境界なので alignment 違反はなさそ
うです。だとすると本当に領域違反?char * 幅が構造体の中でだ
け異なるサイズになる特殊事情でもあるんでしょうか。


> ためしに、
> int n;
> long test = sizeof(def_num(i));
> cp = (char *)&def_num(i);

 def_num() はマクロで (int) でキャストしてありますから、そ
の実体が何であっても必ず sizeof() は 4 になります。なのでこ
の試行は無意味です。
 def_num() で参照している変数実体は envlist[n].def で、これ
は char * で宣言された構造体要素です。sizeof(char *) = 8 な
ので、cp[4] は十分に領域範囲内の筈です。
 def_num(i) ではなく実体の envlist[n].def の sizeof() は幾
らになります?これが 8 でないのなら、sizeof(char *) が文脈に
よりころころと変わることになって収拾がつきませんね。

 もしくは、この envlist[n].def を (int) でキャストした時点
で 4byte 幅の領域に複製を用意して、cp は実はその複製の方を示
しているとかいう話かも知れません。
 例えば往年の DOS エクステンダ環境では、拡張メモリを直接ア
クセス出来ないために、逐一コピーを作成して疑似的にアクセスさ
せていました。それに似た話があるのかも。
 だとすると、def_num(i) を def_str(i) に書換えればうまく行
く筈です。こちらは (int) のキャスト無しなので実体そのものの
ebvlist[n].def を指しています。

 あと考え得る可能性としては、構造体の最適化のために妙な配置
をさせていることでしょうか。
 一般に、構造体に char * 型の要素を宣言すると、構造体の中に
はポインタのみ用意してその先の実体は別領域に確保されます。こ
れは char * が const char * であっても同じことです。
 しかし、const char * の場合は実体を直接構造体領域内に確保
する実装があったとしたらどうでしょう?64bit 環境の 8byte も
の長大ポインタなら結構な長さの文字列を格納可能です。
 この場合は、実体である文字列長に応じて確保されるサイズが変
化します。実体は (char *)d (d は数値) として代入されているの
で、アドレス d を見に行ってその中身をコピーして来るとか?
 envlist[i] を一エントリ分ダンプさせてみるとどうなるんでし
ょうかね?printf() だとこんな感じ。
	{
		int n;

		cp = (char *)&(envlist[n]);
		for (n = 0; n < sizeof(envtable); n++)
			printf("%02x ", cp[n] & 0xff);
	}


 ともあれ、実環境がないと憶測の域を出ませんので、似たような
環境をお持ちの有志を引続き募集しております。誰か助けて...。

                                               しらい たかし