我支持使用Borland C++ Builder 5.02(从1997年)编写的C++应用程序。在Borland的string类的find()方法并不表现我怎么会想到:Borland字符串::发现bug
#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字符串库:如果我使用#include <string>
并使用std::string
,那么它的工作原理与我所期望的完全相同。不幸的是,改变整个应用程序来使用STL字符串并不是一个可行的答案!
从文档似乎Borland公司进行字符串搜索基于散列的算法。我无法找到更多有关这方面的细节,而且我已经完成了反汇编,但没有太多明智之举。
我觉得很难相信,这是真的在字符串库中的错误,特别是因为如果它是那么我会希望能够找到关于它的文章什么的。我找不到任何此类信息。
但是,我已经用完了想法!这是一个已知的错误?有没有修复?
编辑:再看看反汇编,我认为它试图做一些像拉宾卡普算法,其中散列函数计算国防部33554393(最大质数< 2^25)。它很可能是基数为32的多项式哈希函数(即a_0 + 32 a_1 + 32^2 a_2 + .. + 32^n a_n),但这只是一种预感。听起来像Daniel Fischer建议的那样可能会出现溢出。
“基于散列算法”,“如果我改变了针到更短的东西“< - 整数溢出的气味。 –
当你依赖15岁的编译器时,会发生这种情况。分手后要往前看了。 –
@DavidHeffernan在没有预算的情况下可能很难继续前进。 –