(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);