[Subject Prev][Subject Next][Thread Prev][Thread Next][Subject Index][Thread Index]

[OSASK 3048] from OSASK BOARD



このメールは、OSASK伝言板に書き込まれた内容です。
この書き込みに返事を書く場合は、下のURLから書き込みを行なって下さい。


http://www.imasy.or.jp/~mone/osask/index.cgi?REFER=3c53bc8c_11d75

From: 川合秀実
Message-ID: 3c53bc8c_11d75
Date: 2002/01/27 17:38
Subject: Re: obj2bim0.c

[OSASK 3047]へのレスです。

>> これは、linkset1の中のobj2bim0.cに対する不具合のご報告なんでしょうか?
>いえ、違います。
>河合さんのオリジナルバイナリでは不具合は発生しません。
>> それとも、anonymousさんが改良を加えて再コンパイルしたら調子が悪くなっ
>>たということでしょうか?
>そうです。
>ただ、ソースを一行も変更せずにコンパイルしなおしただけの
>バイナリが、Visual C(cl.exe)でもGNU Cでも
>どちらのバイナリも同じ個所で落ちてしまうので
>環境依存の不具合かと思ったのです。

 なるほど。よく分かりました。

 そうすると可能性は3つです。

1.obj2bim0.cにバグがある。しかし、obj2bim0.exeにはバグがない。つまりア
  ップロード時に僕が間違えた。

2.obj2bim0.cにバグがあるが、lcc-win32にもバグがあり、僕がobj2bim0.exe
  を生成したら、運良く「きちんと動くコード」になってしまった。

3.obj2bim0.cにバグはなく、VCやGNU Cのバグを誘発しやすいだけである。lcc
  -win32やその他の処理系では難なく正しいバイナリーを得られる。

>同じobjファイルを河合さんバイナリでロードさせても
>落ちないんですよ。なんだか不思議です。

 それは確かに不思議です。不思議ですし、これを克復しないとanonymousさん
としては、改良以前の話でしょう。ということで克復に協力させてください。

 まず、1.の可能性をつぶしたいです。・・・こちらで再度obj2bim0.cをlcc-
win32でコンパイルしたところかなりよく似たバイナリーが得られました。lccで
ビルドするとバイナリー内にビルド日時などが埋め込まれるので、バイナリー的
に完全に一致することがありません。そのためいまいちよく分かりません。

 そこで、OSASKのpokon0.objとwinman0.objをリンクさせてみましたが、エラー
もなく速やかに終了してしまいました。1.の可能性は完全には否定できません
が、とても小さくなったとは思います。もしよろしければ、anonymousさんが、
lcc-win32をダウンロードしてこれでobj2bim0.exeを作って試していただければ
よりはっきりするでしょう。

 2.や3.はすぐには検証できません。メモリリークが起きているなら、その
個所を完全に特定する必要があります。[OSASK 3043]でご指摘の469行目は、注
釈行でまさかこれが問題ということはないでしょう。その次の行は、結局のとこ
ろ、

  section_param[8] = section_param[4];

ということなんですが、これがエラーなんでしょうか?section_param[]はロー
カルな変数で、79行目で、

  int section_param[12]; /* 最初の4つがコード、次の4つはデーター */

と宣言されています。これでエラーだというなら、僕はVCやGNU Cを責めたくな
ります(笑)。

 link0()がメモリリークを起こしているなら、エラー個所はlink0()内にあるは
ずです。

 ・・・仮に、エラー個所を特定できたとしましょう。そうなれば、その直前で
エラーに直結する変数の値を全部printf()させるようにして、lcc-win32とVCやG
NU Cのバイナリーとで徹底比較するしかありません。おそらく、食い違っている
値があるでしょう。それが分かれば、なぜ問題の変数がそんな異常な値を取るこ
とになったのか、追跡するまでです。

 この問題を起こすための.objファイルを公開していただければ、他の方も協力
してくださるかもしれません。僕も協力したいのですが、ちょっとOSASK ver.2.
1の方が忙しいので、今はできません。すみません。

 この障害とは無関係ですが、324行目の

    if (ps[-2] == *s == 0x22) {

はもちろんバグです(情けないミスです)。

    if (ps[-2] == 0x22 && *s == 0x22) {

に直していただけると嬉しいです。