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

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



お世話になっております、黒川です。

>> 	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];の箇所で落ちました。

ためしに、
int n;
long test = sizeof(def_num(i));
cp = (char *)&def_num(i);
…
として、トレースしてみましたら、test = 4となっておりました。

黒川
----- Original Message -----
>> From: Takashi SHIRAI <shirai@unixusers.net>
>> To: FDclone-users@unixusers.net
>> Date: 2013-10-27 21:00:49
>> Subject: [FDclone-users:01029] Re: 64bit Solaris(SPARC)環境下でのSiganl-11エラー
>> 
>>  しらいです。
>> 
>> In Message-Id <1382844003788147.810553295@pop.brain.riken.jp>
>>         Hiroshi Kurokawa <hiroshi-k@brain.riken.jp>さんwrites:
>> > お世話になります、黒川と申します。
>> 
>> > トレースしてみますと、発生箇所は
>> > custom.cの、initenv関数内、memmoveの場所で起きております。
>> > 関連する各値は
>> > w = 4
>> > sizeof(char *) = 8
>> > sizeof(int) = 4;
>> > でした。
>> 
>>  値の範囲としては領域内に収まっているので、buffer overflow
>> している訳ではなさそうです。となると、例えば奇数アドレスへの
>> アクセス禁止とかいった alignment 問題でしょうか。
>>  試しに memmove() と同じことを loop で実現してみると、どの
>> 辺りで落ちているのか確認出来ると思います。
>> 
>> 	if (w > 0) {
>> 		int n;
>> 
>> 		cp = (char *)&def_num(i);
>> 		for (n = 0; n < sizeof(int); n++)
>> 			cp[n] = cp[w + n];
>> 	}
>> 
>>  もし alignment 問題だったら、sizeof(char *) が sizeof(int)
>> の整数倍だと仮定して int 幅単位でコピーするしかないんでしょ
>> うかね?
>>  現実的にはどんな変数型の幅も 2^n 以外になることはないので、
>> この仮定が間違っている環境はあり得ないとは思うんですが、余り
>> 気持ち良くありませんね。実装するならこんな(↓)感じ?
>> 
>> 	if (w > 0) {
>> 		int *ip;
>> 
>> 		ip = &def_num(i);
>> 		ip[0] = ip[w / sizeof(int)];
>> 	}
>> 
>> 
>> > なお当方の環境ですが、
>> > コンパイラ:SunStudio 12.3
>> > CPU:UltraSPARC III-Cu(Sun Blade2000に搭載のもの)
>> > OS:Oracle Solaris 1/13
>> > となっております。
>> 
>>  64bit big endian で尚且つ __STDC__ が未定義という稀有な環
>> 境がこれまでなかったもので、この部分のコードは実装されている
>> だけで一度も使われて来なかったんだと思います。
>>  手元にも 64bit big endian な環境が無いのでどうにも検証し切
>> れません。どなたか他に 64bit big endian な環境をお持ちの方が
>> いらっしゃいましたら、ご協力お願い出来ませんでしょうか。
>> 
>>                                                しらい たかし
>> 
>>