Rework getLongestCommonPrefixLen() so that it doesn't access string null
terminators. The old version with std::mismatch would do this:
|
v
Strings[0] = ['a', nil]
Strings[1] = ['a', 'a', nil]
^
|
This should silence a warning from the MSVC runtime (PR30515). As
before, I tested this out by preparing a coverage report for FileCheck.
Thanks to Yaron Keren for the report!
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@282422
91177308-0d34-0410-b5e6-
96231b3b80d8
unsigned getLongestCommonPrefixLen(ArrayRef<std::string> Strings) {
unsigned LCP = Strings[0].size();
for (unsigned I = 1, E = Strings.size(); LCP > 0 && I < E; ++I) {
- auto Mismatch =
- std::mismatch(Strings[0].begin(), Strings[0].end(), Strings[I].begin())
- .first;
- LCP = std::min(LCP, (unsigned)std::distance(Strings[0].begin(), Mismatch));
+ unsigned Cursor;
+ StringRef S = Strings[I];
+ for (Cursor = 0; Cursor < LCP && Cursor < S.size(); ++Cursor)
+ if (Strings[0][Cursor] != S[Cursor])
+ break;
+ LCP = std::min(LCP, Cursor);
}
return LCP;
}