Borland C++ Builder 5.02 (1997 年以降) を使用して作成された C++ アプリケーションをサポートしています。Borland 文字列クラスの find() メソッドは、期待どおりに動作しません。
#include <cstring>
#include <iostream>
int main (int argc, char *argv[])
{
string needle = "length == eighteen";
string haystack = "<" + needle + ">";
if (haystack.find(needle) != NPOS)
cout << "Found it!" << endl;
else
cout << "Not found" << endl;
return 0;
}
このプログラムは を出力しますNot found
。針を短いものに変更すると、 が出力されますFound it!
。山かっこを他の文字に交換すると、それが見つかります。スペースは機能しますが、括弧も機能しません。
ここでは Borland 文字列ライブラリを使用していることに注意してください。代わりに I#include <string>
を使用するstd::string
と、期待どおりに動作します。残念ながら、STL 文字列を使用するようにアプリケーション全体を変更することは、実現可能な答えではありません。
ドキュメントによると、Borland は文字列検索にハッシュ ベースのアルゴリズムを使用しているようです。これについてこれ以上の詳細を見つけることができず、分解を進めましたが、それほど賢明ではありません.
これが本当に文字列ライブラリのバグであるとはとても信じがたいと思います。もしそうなら、それについての記事か何かを見つけることができると期待しているからです。そのような情報は見つかりません。
しかし、私はアイデアを使い果たしました!これは既知のバグですか? 修正はありますか?
編集:逆アセンブリをもう一度見てみると、ハッシュ関数が mod 33554393 (最大素数 < 2^25) で計算される Rabin-Karp アルゴリズムのようなことをしようとしていると思います。これは、底が 32 の多項式ハッシュ関数 (つまり、a_0 + 32 a_1 + 32^2 a_2 + .. + 32^n a_n) である可能性がありますが、それはただの予感です。Daniel Fischer が示唆したように、オーバーフローの可能性があるように思えます。