Lex: Check buckets on header map construction

If the number of buckets is not a power of two, immediately recognize
the header map as corrupt, rather than waiting for the first lookup.  I
converted the later check to an assert.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@261448 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Duncan P. N. Exon Smith 2016-02-20 21:00:58 +00:00
Родитель 7dca0f623a
Коммит 4a8b8ff576
2 изменённых файлов: 21 добавлений и 4 удалений

Просмотреть файл

@ -19,6 +19,7 @@
#include "llvm/Support/DataTypes.h"
#include "llvm/Support/MathExtras.h"
#include "llvm/Support/MemoryBuffer.h"
#include "llvm/Support/SwapByteOrder.h"
#include <cstdio>
#include <memory>
using namespace clang;
@ -82,6 +83,15 @@ bool HeaderMapImpl::checkHeader(const llvm::MemoryBuffer &File,
if (Header->Reserved != 0)
return false;
// Check the number of buckets.
auto NumBuckets = NeedsByteSwap
? llvm::sys::getSwappedBytes(Header->NumBuckets)
: Header->NumBuckets;
// If the number of buckets is not a power of two, the headermap is corrupt.
if (NumBuckets & (NumBuckets - 1))
return false;
// Okay, everything looks good.
return true;
}
@ -191,10 +201,8 @@ StringRef HeaderMapImpl::lookupFilename(StringRef Filename,
const HMapHeader &Hdr = getHeader();
unsigned NumBuckets = getEndianAdjustedWord(Hdr.NumBuckets);
// If the number of buckets is not a power of two, the headermap is corrupt.
// Don't probe infinitely.
if (NumBuckets & (NumBuckets-1))
return StringRef();
// Don't probe infinitely. This should be checked before constructing.
assert(!(NumBuckets & (NumBuckets - 1)) && "Expected power of 2");
// Linearly probe the hash table.
for (unsigned Bucket = HashHMapKey(Filename);; ++Bucket) {

Просмотреть файл

@ -91,4 +91,13 @@ TEST(HeaderMapTest, checkHeaderValidButEmpty) {
ASSERT_TRUE(NeedsSwap);
}
TEST(HeaderMapTest, checkHeader3Buckets) {
MapFile<3, 1> File;
ASSERT_EQ(3 * sizeof(HMapBucket), sizeof(File.Buckets));
File.init();
bool NeedsSwap;
ASSERT_FALSE(HeaderMapImpl::checkHeader(*File.getBuffer(), NeedsSwap));
}
} // end namespace