2009年6月 8日(月) 23時54分34秒 [ソフト開発 ]
私が製作して公開しているRSS・Atomフィード自動生成ソフト「Fumy RSS & Atom Maker 」について、ユーザさんからバグ報告が届きました。
このソフトでは、フィードの中に本文を含めることができるのですが、その際、含める最大文字数を指定できるようになっています。指定できる数値には特に制限はないのですが、ユーザさんの報告によると
「最大文字数」を214以下に設定すると正しく反映されるが、215に設定すると途端に全文が最後まで収録されてしまう
とのことでした。
そんな中途半端な値で字数制限処理が行われなくなるとは、さっぱり原因が想像できません……。255文字目と256文字目とか、65535文字目と65536文字目とかが境になっているなら分からないでもないですが。(^_^;;;
でも、現実に問題は発生しているようなので、何らかの原因があるはずです。
というわけで、ソースコードを覗いてみました。
なんだか、C++言語のソースコードを見たのはずーいぶん久しぶりのような気が。^^;
で、字数制限処理を行っている箇所を探してみていきなり驚愕!
たしかに、ある条件下では字数制限処理をすっ飛ばしてしまう記述になっていました。ただ、境界は214文字というわけではありません。ユーザさんの検証で214文字目が境だったのは、たまたまそういうHTMLファイルを対象にしたからです。
その原因は、以下のようにプログラムを書いていたからでした。
指定された文字数目が『2バイト文字の後半1バイト』であれば、その直後でカットする。
指定された文字数目が『2バイト文字の前半1バイト』であれば、その1バイト先でカットする。
これは、本文中に日本語などの2バイト文字が使われている場合、2バイト文字の真ん中でぶった切ってしまうと文字化けが発生するので、それを避けることを考慮した処理です。
ユーザの設定が「300文字目」だったとして、文字列の先頭から300バイト目がたまたま2バイト文字の前半1バイトだった場合、そこで切るわけにはいきません。文字化けを避けるためには、さらに1バイト進めて、301バイト目までを含めて切らなければなりません。
そんな処理をするための記述です。
がー。
重大な処理が欠損していました!
それは、
指定された文字数目が1バイト文字(半角英数字・記号)だった場合の処理がない!
ということ。(爆)
つまり、以下のような処理になっていたわけです。
ユーザが指定した文字数目に2バイト文字があれば、指定文字数(またはその1バイト先)でカット処理が行われるので問題はない。
ユーザが指定した文字数目が1バイト文字であれば、カット処理を行わずに全文を収録!
……とんでもねえな!(爆)
我ながら驚きましたですよ。こんな大穴のあるコードを書いていたとは!(^_^;;;
つまり、バグ報告をして下さったユーザさんが検証に使ったHTMLは、(ソフトウェアが抽出した文字列の)先頭から214バイト目は2バイト文字(の後半1バイト)で、215バイト目は1バイト文字だったのでしょう。(^_^;;;
ぬおーう。
不覚すぎるっっっ!
早速その辺を修正して、Ver 0.972β として公開しました。
昨年10月からだから、なんと8ヶ月ぶりのバージョンアップです。
そんなに間が空いてたのか……。
◆RSS自動作成ソフト - Fumy RSS&Atom Maker