[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) {
に直していただけると嬉しいです。