(toppers-users 3986) Re: JSP1.4.4の不具合 (原因究明?)

Masaki Muranaka monamour @ monaka.org
2012年 6月 13日 (水) 14:59:52 JST


みなさま:
こんにちは.

> とのことですので、istreamが処理中にエラーを検出しているということだと思います。
> 入力のデータを疑う方向の方がよいかもしれません。

ええまあ一般論としては,仰る通りなのですが….
種々のバージョンの複数の処理系で長らく動いていたデータが
特定バージョンで固まるという症状です.
データを疑うのはスジが悪いのではないでしょうか.


…ということで,本業のビルド中に軽く掘り込んでみました.

結果,新しめの libstdc++ では,eof の istream に対して putback() を呼ぶと,
eof ではなく fail になるのではないかという気がしてきました.
// 仕事以外でC++0xの仕様書を読むような元気はありませんので
// この挙動の妥当性については識者のみなさまに委ねたいところです.

sample1.cfg の場合に限って言うと,base/parser.cpp:388 付近の putBack()周りを
 if (ch != -1) putBack(ch)
などすると直ります.
ch != -1 かどうかを見ないで putBack を呼んでいる箇所は複数ありますから,
putBack() の中で good() をチェックしたほうがよいのかもしれません.
(副作用については,深く考えていません)

余談ですが,Ubuntu10.04 でも gcc-4.6 に上げると同様の問題が出ます.
libstdc++ か g++ のバージョン依存で発生という線でほぼ間違いなさそうです.


2012年6月13日 13:26 Yusuke Mitsuki <mitsukiyusuke @ gvwave.com>:
> 酔漢様、邑中様
> みなさま
>
> 横から失礼します。
> 三ッ木と申します。はじめまして。
>
>> 現象としては eof() では無く fail() が true になっているようです.
>>
> とのことですので、istreamが処理中にエラーを検出しているということだと思います。
> 入力のデータを疑う方向の方がよいかもしれません。
>
> c++のstreamクラスの説明です。
> http://www.cppll.jp/cppreference/cppio_details.html
>
> ただ、ここの無限ループを修正するということであれば
> この前のブロックのエラーチェックにcurrent->stream->fail()を含めるとよいかと思います。
>
> ubuntuの環境がないので申し訳ありませんが未検証です。
> 何かの参考になればと思います。
>
> 以上、よろしくお願いいたします。
>
>
>
> From: Masaki Muranaka <monamour @ monaka.org>
> Subject: (toppers-users 3984) Re: JSP1.4.4の不具合 (原因究明?)
> Date: Wed, 13 Jun 2012 12:13:32 +0900
>
>> こんにちは.
>>
>> ざっと追試してみました.おそらく,
>> -            if( current->stream->eof() )
>> +            if( !current->stream->good() )
>> だと動くのではと思います.
>> 理由は定かではありませんが,
>> 現象としては eof() では無く fail() が true になっているようです.
>>
>> 2012年6月12日 23:01 suikan <suikan7 @ yahoo.co.jp>:
>>> こんにちは。
>>>
>>> 試してみましたが私の環境では eof()を使うと無限ループになってしまいまし
>>> た。原因はわかりませんが、
>>> eof()は真にならないようです。
>>>
>>> 修正ですが、添付の修正でどうやらうまく動きます。
>>>
>>> 酔漢
>>>
>>> (2012/06/12 7:26), suikan wrote:
>>>> おはようございます
>>>>
>>>> 邑中さん
>>>>
>>>> コメントありがとうございます。eof()についてはもう少しつついてからもう一
>>>> 度報告します。
>>>>
>>>> 酔漢
>>>>
>>>>
>>>> (2012/06/11 10:15), Masaki Muranaka wrote:
>>>>> おはようございます.
>>>>>
>>>>> istream.eof() は,ファイルの最後に達していてさらに読み込んだ時に true になります.
>>>>> なので,g++のデグレードではなく,今までの parse.cpp が動いていたほうがおかしかった
>>>>> のではないかという気がします.(きちんと追いきれていないかもしれませんが)
>>>>>
>>>>> 修正案は添付頂いたパッチの通りでOKのはずです.
>>>>> ですが,個人的な好みですが,
>>>>>>                     if( ch == -1 )
>>>>>>>>>>>                       if( current->stream->eof() )
>>>>> のほうが意味が掴みやすいかなとは思います.
>>>>>
>>>>> 2012年6月10日 21:32 suikan <suikan7 @ yahoo.co.jp>:
>>>>>> みなさんこんにちは、酔漢です。
>>>>>>
>>>>>> 標記の件ですが、原因らしきものに当たりました。
>>>>>>
>>>>>> 環境 : Ubuntu 12.04, g++ 4.6.3
>>>>>> ソース : jsp 1.4.4-full ( UTF8に変換済み )
>>>>>> ターゲット linux
>>>>>>
>>>>>> 上記環境で jsp/configure -C linux を実行した後、 make depend すると既に
>>>>>> 報告されているとおりcfgが暴走します(実行状態から返ってこなくなる)。
>>>>>>
>>>>>> デバッガで追跡したところ、.cfg ファイルの末尾で無限ループに陥っていまし
>>>>>> た。どうやら、istream.eof() == FALSEかつ ch==-1 となるライブラリのよう
>>>>>> ですが、parser.cpp がそれに対応できておらず、ファイル末尾を検出できない
>>>>>> ことが原因のようです。
>>>>>>
>>>>>> 添付ファイルのような変更を行ったところ、とりあえずはsample1のmake depが
>>>>>> 通るようになりました。
>>>>>>
>>>>>> 恥ずかしながら c++ のライブラリには精通していないため、皆さんの検証をお
>>>>>> 願いします。
>>>>>>
>>>>>> 酔漢
>>>>>>
>>>>>> (2012/06/06 22:49), suikan wrote:
>>>>>>> みなさんこんにちは。酔漢です。
>>>>>>>
>>>>>>> 邑中さんが報告されている cfg の暴走の件ですが、Ubuntu 12.04 LTS でも同じ
>>>>>>> と思われる問題が発生します。g++ のバージョンは 4.6.3です。
>>>>>>>
>>>>>>> TOPPERS/JSP for Blackfinをバージョンアップしたいのですが、頭を抱えています。
>>>>>>>
>>>>>>> 酔漢
>>>>>>>
>>>>>>> (2012/01/21 14:53), Masaki Muranaka wrote:
>>>>>>>> みなさま:
>>>>>>>> こんにちは.
>>>>>>>>
>>>>>>>> 下記の件,Ubuntu 10.04.3 TLS と同 11.10 で動作チェックをしたところ,
>>>>>>>> 11.10 の共有ライブラリと jsp-1.4.4 の cfg での組み合わせで発生することが判りました.
>>>>>>>> (10.04.3 TLS では再現しません.また10.04.3 LTS で静的リンクした cfg は 11.10でも動作します.)
>>>>>>>>
>>>>>>>> 問題発生の箇所がソースコードのどの部分に対応するのかは現時点では不明です.
>>>>>>>> また,他のディストリビューションでの発生有無も同じく不明です.
>>>>>>>>
>>>>>>>> とりいそぎの対応策として,10.04.3 LTS
>>>>>>>> 上でビルドしたバイナリを下記の場所に置きました.(TOPPERSライセンスの報告条項を満たす手間を省くため,ソースコードも含んでいます.)
>>>>>>>> おそらくカーネルリビジョンが同じ他のディストリビューションでも動作すると思います.
>>>>>>>>
>>>>>>>> https://bitbucket.org/monaka/jsp_core/get/cfg-binary-ubuntu-32bit.zip
>>>>>>>> https://bitbucket.org/monaka/jsp_core/get/cfg-binary-ubuntu-64bit.zip
>>>>>>>>
>>>>>>>> TOPPERS公式のものではないことに留意してください.
>>>>>>>> また,上記バイナリを適用した結果に対して,私および私の所属組織は一切の責任を取りません.
>>>>>>>> 軽微な修正提案については,
>>>>>>>> https://bitbucket.org/monaka/jsp_core/issues にいただければ検討します.
>>>>>>>> 追加の個別サポートが必要な場合は,メールにてご相談ください.
>>>>>>>>
>>>>>>>> 2011年12月22日7:09 Masaki Muranaka <monamour @ monaka.org>:
>>>>>>>>> また,sample1 のビルドを試みると,cfg が暴走します.
>>>>>>>> (snip)
>>>>>>>>> 再現条件はまだよく判っていません.
>>>>>>>>> GCC4.6.1固有の問題なのか,このg++のビルドのみの問題なのか….
>>>>>> --
>>>>>> 酔漢
>>>>>> 組み込みBlog              http://d.hatena.ne.jp/suikan+embedded/
>>>>>> TOPPERS/ASP for LPC       http://sourceforge.jp/projects/toppersasp4lpc/
>>>>>> Blackfin Blog             http://d.hatena.ne.jp/suikan+blackfin/
>>>>>> TOPPERS/JSP for Blackfin  http://sourceforge.jp/projects/toppersjsp4bf/
>>>>>>
>>>>>>
>>>>
>>>
>>>
>>> --
>>> 酔漢
>>> 組み込みBlog              http://d.hatena.ne.jp/suikan+embedded/
>>> TOPPERS/ASP for LPC       http://sourceforge.jp/projects/toppersasp4lpc/
>>> Blackfin Blog             http://d.hatena.ne.jp/suikan+blackfin/
>>> TOPPERS/JSP for Blackfin  http://sourceforge.jp/projects/toppersjsp4bf/
>>>
>>>
>>