(toppers-users 3979) Re: JSP1.4.4の不具合 (原因究明?)
suikan
suikan7 @ yahoo.co.jp
2012年 6月 10日 (日) 21:32:35 JST
みなさんこんにちは、酔漢です。
標記の件ですが、原因らしきものに当たりました。
環境 : 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/
-------------- next part --------------
640c640,664
< ch = getChar();
---
> // check ch== -1 while eof() == true
> do {
> ch = getChar();
>
> //カレントのストリームが空になった
> if( ch == -1 )
> {
> //ファイルスタックから次のストリームを取る
> if(!fileStack.empty())
> {
> if(current->stream != &cin)
> delete current->stream;
> delete current;
>
> current = *fileStack.begin();
> fileStack.pop_front();
> }else
> {
> token.assign("<End of stream>");
> return (token.type = Token::EOS);
> }
> }
> else // break this loop if the ch != -1
> break;
> } while(1);