2005年5月11日
JRCSのとほほなバグ
カテゴリー: [プログラミング]研究というか,研究室の他の研究への協力の成り行きで開発を手伝った,実験レポート提出システムに拙作のWebアプリケーションフレームワークが使われています.そこには,拙作のWikiエンジンも乗っています.
このWikiエンジンは,変更履歴をとるために,内部でRCS(Revision Control System) を使っていますが,RCSのアーカイブ操作のために,JRCSというライブラリを使っています.JRCSは,Javaから,RCSアーカイブを読み書きするためのライブラリです.
JRCSは,一度は,Apache Jakarta Project の sandbox のプロジェクトでしたが,今はまた,Jakarta Project からはずれているようです.
今は,ここで手に入ります.
http://www.suigeneris.org/kb/display/JRCS
ちなみに,日本語が通らないので,1カ所いじりました.
このシステムは,実験として,実際に使われているのですが,最近,特定のレポートを提出すると,RCSアーカイブの解釈中に落ちるようになってしまいました.
調べたところ,RCSアーカイブを出力する部分がおかしいのです.RCSでは,テキストを'@'で囲みます.テキスト自体に'@'が含まれていると,'@@'のようにエスケープします.ところが,そのレポートに使われている最後の'@'は,エスケープされないのです.
もうメンテナンスされていない感じなので,自分で直しました.
ただ,それがなんというか,とほほなバグだったんです.問題の,'@' を処理する部分です.
org.apache.commons.jrcs.rcs.Archive
static public String quoteString(String s)
{
//!!! use org.apache.commons.jrcs.RegExp here !!!
StringBuffer result = new StringBuffer(s);
for (int i = 0; i < s.length(); i++)
{
if (result.charAt(i) == '@')
{
result.insert(i++, '@');
}
}
result.insert(0, '@');
result.append('@');
return new String(result);
}
StringBuffer に入れて,先頭から順番に見ていって, '@'を見つけたら,'@'を挿入するわけですが...
赤いところにご注目.文字列はだんだんのびていくのに,もともとの文字列の長さしかループしてません.
これじゃ,'@'がいくつかあると,後ろのほうの'@'を取りこぼします.
正しくはこうです.
static public String quoteString(String s)
{
//!!! use org.apache.commons.jrcs.RegExp here !!!
StringBuffer result = new StringBuffer(s);
for (int i = 0; i < result.length(); i++)
{
if (result.charAt(i) == '@')
{
result.insert(i++, '@');
}
}
result.insert(0, '@');
result.append('@');
return new String(result);
}
まあ,こういうバグを入れてしまう気持ちは分かる気もします.そして,この手のバグを一度入れてしまうと,再現する入力に出会わない限り,見つからないのもよくわかります.
これを見ても,最初はちょっと気づきませんでした.
でも,やっぱり,なんだかなあ,と思うわけです.
このコードのコメントにあるように,正規表現を使った方が良かったような気がします.
しばらく,何でRCSアーカイブが壊れるんだろうと思っていたのですが,まさかこんなバグとは(^^;
ところで,こういうのやってると研究が進まないんですけど...(^^;
投稿者 shingo : 2005年5月11日 15:29
トラックバック
このエントリーのトラックバックURL:
http://isolinear.info/cgi-bin/mt/mt-tb.cgi/105