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

[FDclone-users:00541] Re: FDclone 2.08e has been released



 しらいです。

 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 でも同じことだとは思いますけどね。

                                               しらい たかし