r261448 - Lex: Check buckets on header map construction

Duncan P. N. Exon Smith via cfe-commits cfe-commits at lists.llvm.org
Mon Feb 22 14:32:00 PST 2016


> On 2016-Feb-22, at 10:39, Adrian Prantl <aprantl at apple.com> wrote:
> 
>> 
>> On Feb 20, 2016, at 1:00 PM, Duncan P. N. Exon Smith via cfe-commits <cfe-commits at lists.llvm.org> wrote:
>> 
>> Author: dexonsmith
>> Date: Sat Feb 20 15:00:58 2016
>> New Revision: 261448
>> 
>> URL: http://llvm.org/viewvc/llvm-project?rev=261448&view=rev
>> Log:
>> 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.
>> 
>> Modified:
>>   cfe/trunk/lib/Lex/HeaderMap.cpp
>>   cfe/trunk/unittests/Lex/HeaderMapTest.cpp
>> 
>> Modified: cfe/trunk/lib/Lex/HeaderMap.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/HeaderMap.cpp?rev=261448&r1=261447&r2=261448&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/Lex/HeaderMap.cpp (original)
>> +++ cfe/trunk/lib/Lex/HeaderMap.cpp Sat Feb 20 15:00:58 2016
>> @@ -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 ll
>>  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.
> 
> Support/MathExtras.h defines isPowerOf2_32 which is IMHO more readable and also checks for 0 (which may or may not be what we want here).

r261585.  Thanks.

> -- adrian
>> +  if (NumBuckets & (NumBuckets - 1))
>> +    return false;
>> +
>>  // Okay, everything looks good.
>>  return true;
>> }
>> @@ -191,10 +201,8 @@ StringRef HeaderMapImpl::lookupFilename(
>>  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) {
>> 
>> Modified: cfe/trunk/unittests/Lex/HeaderMapTest.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/Lex/HeaderMapTest.cpp?rev=261448&r1=261447&r2=261448&view=diff
>> ==============================================================================
>> --- cfe/trunk/unittests/Lex/HeaderMapTest.cpp (original)
>> +++ cfe/trunk/unittests/Lex/HeaderMapTest.cpp Sat Feb 20 15:00:58 2016
>> @@ -91,4 +91,13 @@ TEST(HeaderMapTest, checkHeaderValidButE
>>  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
>> 
>> 
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits



More information about the cfe-commits mailing list