]> granicus.if.org Git - clang/commitdiff
Lex: Check for 0 buckets on header map construction
authorDuncan P. N. Exon Smith <dexonsmith@apple.com>
Mon, 22 Feb 2016 22:24:22 +0000 (22:24 +0000)
committerDuncan P. N. Exon Smith <dexonsmith@apple.com>
Mon, 22 Feb 2016 22:24:22 +0000 (22:24 +0000)
Switch to using `isPowerOf2_32()` to check whether the buckets are a
power of two, and as a side benefit reject loading a header map with no
buckets.  This is a follow-up to r261448.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@261585 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Lex/HeaderMap.cpp
unittests/Lex/HeaderMapTest.cpp

index 67b663158f0b78af1cbaec68200f332387f4fae9..be0d477e8b55efd81d54c25979dd5b62240ba0a5 100644 (file)
@@ -86,10 +86,10 @@ bool HeaderMapImpl::checkHeader(const llvm::MemoryBuffer &File,
 
   // Check the number of buckets.  It should be a power of two, and there
   // should be enough space in the file for all of them.
-  auto NumBuckets = NeedsByteSwap
-                        ? llvm::sys::getSwappedBytes(Header->NumBuckets)
-                        : Header->NumBuckets;
-  if (NumBuckets & (NumBuckets - 1))
+  uint32_t NumBuckets = NeedsByteSwap
+                            ? llvm::sys::getSwappedBytes(Header->NumBuckets)
+                            : Header->NumBuckets;
+  if (!llvm::isPowerOf2_32(NumBuckets))
     return false;
   if (File.getBufferSize() <
       sizeof(HMapHeader) + sizeof(HMapBucket) * NumBuckets)
@@ -208,7 +208,7 @@ StringRef HeaderMapImpl::lookupFilename(StringRef Filename,
   unsigned NumBuckets = getEndianAdjustedWord(Hdr.NumBuckets);
 
   // Don't probe infinitely.  This should be checked before constructing.
-  assert(!(NumBuckets & (NumBuckets - 1)) && "Expected power of 2");
+  assert(llvm::isPowerOf2_32(NumBuckets) && "Expected power of 2");
 
   // Linearly probe the hash table.
   for (unsigned Bucket = HashHMapKey(Filename);; ++Bucket) {
index e8921709604296a5d8b0935d77ad0857f443e5ab..ad0579a236eda376d5a143ae8ce76f99ef5d9d15 100644 (file)
@@ -143,6 +143,15 @@ TEST(HeaderMapTest, checkHeader3Buckets) {
   ASSERT_FALSE(HeaderMapImpl::checkHeader(*File.getBuffer(), NeedsSwap));
 }
 
+TEST(HeaderMapTest, checkHeader0Buckets) {
+  // Create with 1 bucket to avoid 0-sized arrays.
+  MapFile<1, 1> File;
+  File.init();
+  File.Header.NumBuckets = 0;
+  bool NeedsSwap;
+  ASSERT_FALSE(HeaderMapImpl::checkHeader(*File.getBuffer(), NeedsSwap));
+}
+
 TEST(HeaderMapTest, checkHeaderNotEnoughBuckets) {
   MapFile<1, 1> File;
   File.init();