Plug-in内でのsetjmp/longjmpについて (kana) 1998/08/31 01:24
以前長いファイル名でSusieが落ちるという話があったと思いますが、今日はその1つの原因に
ついて私の方に報告があったので質問がてら書かせてもらいます。プログラマー以外にはさっぱ
りわからないような内容かつ長文になっていますが・・・。

まずは状況説明:
私のJPEG Plug-inではjpeg展開ライブラリの中からのエラー処理にsetjmp/longjmpを
使っています。つまりSusieからIsSupportedが呼ばれたら先頭でsetjmpしています。
フルパスで129文字以上のファイル名で未対応の画像形式の場合次のような現象が発生し
ます
1) IsSupportedが呼ばれ、setjmpしフォーマット確認し、結果エラー(0)を返却する
2) もう一度IsSupportedが呼ばれ、setjmpし、setjmp内で不正なメモリアクセスが発生する
  アセンブラでfs:[00000000]という場所の値が変らしい(x86はわからないので詳細不明)
これがフルパスで128文字までのファイル名の場合はsetjmpは正常に終了し、問題は発
生しない。この時点ではPlug-inはファイル名の内容を操作することはない。
aが129個続くファイル名でも発生することからファイル名には依存しない現象と思われる。

IsSupportedを2度呼び出すテストプログラムも書いてみましたが、そちらでは別段問題
は発生しませんでした。

それで質問なんですが、Plug-in内でsetjmp/longjmpは使うものじゃないんでしょうかって
ことです(前振りが長くて済みません)。

環境は
OS: WinNT4.0SP3 マシン: 互換機。
コンパイラ: VC++4.0(たぶん4.2でも同じことだと思います。5.0は不明です)
Susieは0.45です。
問題のPlug-inはifjpegv6.spiでどのバージョンでも発生します(^^;;)。

この現象を見ている時に若干いままで思っていた動作とSusieが違う動作をするので
ついでに報告しておきます。
1)50byteほどの長さのファイルの場合に、(たぶん)MacBinaryのために呼ばれる2度目の
IsSupportedが呼ばされた時に前回と全く同じメモリ内容が渡される。
2) (1)の時にファイルの長さが2k未満のときに余った部分が0クリアされていない。
実害はないと思いますが一応ご報告まで。





--「Plug-in内でのsetjmp/longjmpについて」に対するコメント--
タイトル(Subject):
お名前(Your name):
Mail address:
Password: :入力しておくとあとで削除できます
Your message:




7thBridge P ver0.26 (c)Takechin