[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[FDclone-users:01029] Re: 64bit Solaris(SPARC)環境下でのSiganl-11エラー
- Subject: [FDclone-users:01029] Re: 64bit Solaris(SPARC)環境下でのSiganl-11エラー
- From: Takashi SHIRAI <shirai@unixusers.net>
- Date: Sun, 27 Oct 2013 21:00:49 +0900
しらいです。
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 な環境をお持ちの方が
いらっしゃいましたら、ご協力お願い出来ませんでしょうか。
しらい たかし