我支持使用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在沒有預算的情況下可能很難繼續前進。 –