[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[FDclone-users:00541] Re: FDclone 2.08e has been released
- Subject: [FDclone-users:00541] Re: FDclone 2.08e has been released
- From: Takashi SHIRAI <shirai@unixusers.net>
- Date: Wed, 02 Aug 2006 21:33:00 +0900
しらいです。
2.09 の release は週明けくらいでいいでしょうかね?
In Message-Id <20060802113231.69BBD40C508@yuka.unixusers.net>
Takashi SHIRAI <shirai@unixusers.net>writes:
> しらいです。
> > CPU はともかく、 OS が 32bit だからとかが、関係しているので
> > しょうか。
>
> 32bit OS でも流石に char が 32bit ってことはないと思うんで
> すが、endian が big endian でないか、compiler が気を効かせて
> 何か適切な処置をしてくれてるかでしょうかね。
よく考えたら決してそういうことではありませんね。また大ポカ
をやらかすところでした。
FORCEDSTDC 未定義時には union を使わないので、initenv() が
行なっているような bias はそもそも必要ないんですよ。その証拠
に大昔の union を使わない実装の頃には支障なかったんですから。
union が明確にその変数領域を規定しているのに対して、普通に
cast しただけの FORCEDSTDC 見定義時の実装では、変数領域は飽
くまでも pointer の大きさなんですね。
char * サイズの領域から取り出したデータをどう cast したと
ころで、桁溢れこそすれ変数領域の境界がずれたりはしないのでし
た。
ということで、[FDclone-users:00534] のような patch は全く
無意味で、FORCEDSTDC 未定義時にはこの部分が omit されるよう
にしないといけないんですね。
なので下記 patch が正しい対処になると思います。
---- Cut Here ----
diff -u ../old/FD-2.08e/custom.c ./custom.c
--- ../old/FD-2.08e/custom.c Fri Jul 28 00:00:00 2006
+++ ./custom.c Wed Aug 2 21:09:24 2006
@@ -551,13 +551,13 @@
VOID initenv(VOID_A)
{
-#if !MSDOS
+#if !MSDOS && !defined (FORCEDSTDC)
char *cp;
int w;
#endif
int i;
-#if !MSDOS
+#if !MSDOS && !defined (FORCEDSTDC)
if ((w = sizeof(char *) - sizeof(int)) > 0) {
i = 0x5a;
cp = (char *)(&i);
@@ -566,7 +566,7 @@
#endif
for (i = 0; i < ENVLISTSIZ; i++) {
-#if !MSDOS
+#if !MSDOS && !defined (FORCEDSTDC)
if (w > 0) switch (env_type(i)) {
case T_CHARP:
case T_PATH:
@@ -577,11 +577,11 @@
case T_NOVAR:
break;
default:
- cp = (char *)(&(envlist[i].def.num));
+ cp = (char *)&def_num(i);
memmove(cp, &(cp[w]), sizeof(int));
break;
}
-#endif /* !MSDOS */
+#endif /* !MSDOS && !FORCEDSTDC */
_evalenv(i);
}
}
---- Cut Here ----
AIX 環境でこの patch の有用性を敢えて試すとしたら、こうい
うことになると思います。
1.上記 patch をあてただけの状態で compile し動作確認。
2.custom.c の一番頭に #define FORCEDSTDC を追加。
3.L.178 辺りにある union の「int」を「char」に変更。
4.この状態で compile し落ちることを確認。
5.L.561,581 辺りにある「int」を「char」に変更。
6.この状態で compile して正常動作することを確認。
1.の状態では initenv() の bias は全然効かないので、compile
さえ通れば特に問題はないでしょう。
4.の時点で落ちるのは /0 error のせいです。もし落ちないよう
なら -N 付で起動して、全ての変数を既定値にしてみるといいでし
ょう。整数変数の値が全て 0 になるので落ちる筈です。
6.の状態では bias をかけて char で確保された変数領域に既定
値の有効数字を移動させて来るので、変数値が 0 になってしまう
のを防ぎます。
一方、sparc64 環境で試すとしたら、2.08d で落ちることをまず
確認し、2.08e + 上記 patch では落ちないことを確認するといい
と思います。
sparc64 の場合は FORCEDSTDC が未定義な OS が存在しないと思
うので、素の 2.08e でも同じことだとは思いますけどね。
しらい たかし