[llvm] 72eac42 - [xxHash] Don't trigger UB on empty StringRef

Benjamin Kramer via llvm-commits llvm-commits at lists.llvm.org
Wed Feb 8 03:55:38 PST 2023


Author: Benjamin Kramer
Date: 2023-02-08T12:53:54+01:00
New Revision: 72eac42f21c0f45a27f3eaaff9364cbb5189b9e4

URL: https://github.com/llvm/llvm-project/commit/72eac42f21c0f45a27f3eaaff9364cbb5189b9e4
DIFF: https://github.com/llvm/llvm-project/commit/72eac42f21c0f45a27f3eaaff9364cbb5189b9e4.diff

LOG: [xxHash] Don't trigger UB on empty StringRef

This is quite silly, but casting to uintptr_t seems like the easiest
option to quiet ubsan.

llvm/lib/Support/xxhash.cpp:107:12: runtime error: applying non-zero offset 8 to null pointer
    #0 0x7fe3660404c0 in llvm::xxHash64(llvm::StringRef) llvm/lib/Support/xxhash.cpp:107:12

Added: 
    

Modified: 
    llvm/lib/Support/xxhash.cpp
    llvm/unittests/Support/xxhashTest.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Support/xxhash.cpp b/llvm/lib/Support/xxhash.cpp
index 9a3f5faa336b..99b94a966bc9 100644
--- a/llvm/lib/Support/xxhash.cpp
+++ b/llvm/lib/Support/xxhash.cpp
@@ -104,14 +104,15 @@ uint64_t llvm::xxHash64(StringRef Data) {
 
   H64 += (uint64_t)Len;
 
-  while (P + 8 <= BEnd) {
+  while (reinterpret_cast<uintptr_t>(P) + 8 <=
+         reinterpret_cast<uintptr_t>(BEnd)) {
     uint64_t const K1 = round(0, endian::read64le(P));
     H64 ^= K1;
     H64 = rotl64(H64, 27) * PRIME64_1 + PRIME64_4;
     P += 8;
   }
 
-  if (P + 4 <= BEnd) {
+  if (reinterpret_cast<uintptr_t>(P) + 4 <= reinterpret_cast<uintptr_t>(BEnd)) {
     H64 ^= (uint64_t)(endian::read32le(P)) * PRIME64_1;
     H64 = rotl64(H64, 23) * PRIME64_2 + PRIME64_3;
     P += 4;

diff  --git a/llvm/unittests/Support/xxhashTest.cpp b/llvm/unittests/Support/xxhashTest.cpp
index 7dc7c40c69ec..f5c49e43df54 100644
--- a/llvm/unittests/Support/xxhashTest.cpp
+++ b/llvm/unittests/Support/xxhashTest.cpp
@@ -12,6 +12,7 @@
 using namespace llvm;
 
 TEST(xxhashTest, Basic) {
+  EXPECT_EQ(0xef46db3751d8e999U, xxHash64(StringRef()));
   EXPECT_EQ(0x33bf00a859c4ba3fU, xxHash64("foo"));
   EXPECT_EQ(0x48a37c90ad27a659U, xxHash64("bar"));
   EXPECT_EQ(0x69196c1b3af0bff9U,


        


More information about the llvm-commits mailing list