« 誕生日 | メイン | 片づけと掃除 »

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

コメント

コメントしてください

コメントスパム等の対策のために,大量のURLを含むコメント,古いエントリーに対するコメント,連続したコメントなどは,一旦保留されます.




保存しますか?