Optimized equal() functions in StringImpl.h are not ASan compatible
authorap@apple.com <ap@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 4 Feb 2015 23:38:42 +0000 (23:38 +0000)
committerap@apple.com <ap@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 4 Feb 2015 23:38:42 +0000 (23:38 +0000)
https://bugs.webkit.org/show_bug.cgi?id=141258

Reviewed by Daniel Bates.

* wtf/text/StringImpl.h: (WTF::equal): Add custom implementations for ASan.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@179644 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WTF/ChangeLog
Source/WTF/wtf/text/StringImpl.h

index 68df01b7f458644a4f9dd6c00e4799a61d317ec5..b22b3ba0d6bd1dc73ad777a7cfeb0b1e356fe1c2 100644 (file)
@@ -1,3 +1,12 @@
+2015-02-04  Alexey Proskuryakov  <ap@apple.com>
+
+        Optimized equal() functions in StringImpl.h are not ASan compatible
+        https://bugs.webkit.org/show_bug.cgi?id=141258
+
+        Reviewed by Daniel Bates.
+
+        * wtf/text/StringImpl.h: (WTF::equal): Add custom implementations for ASan.
+
 2015-02-04  Chris Dumez  <cdumez@apple.com>
 
         Add removeFirst(value) / removeAll(value) methods to WTF::Vector
 2015-02-04  Chris Dumez  <cdumez@apple.com>
 
         Add removeFirst(value) / removeAll(value) methods to WTF::Vector
index 9cb02148bde069d9ef07deb2a1d7d1e5cb68a3b9..266b97e4c88667bf1460e7b91bb051c4ba53897b 100644 (file)
@@ -875,7 +875,7 @@ inline T loadUnaligned(const char* s)
 }
 
 // Do comparisons 8 or 4 bytes-at-a-time on architectures where it's safe.
 }
 
 // Do comparisons 8 or 4 bytes-at-a-time on architectures where it's safe.
-#if CPU(X86_64) || CPU(ARM64)
+#if (CPU(X86_64) || CPU(ARM64)) && !ASAN_ENABLED
 ALWAYS_INLINE bool equal(const LChar* aLChar, const LChar* bLChar, unsigned length)
 {
     unsigned dwordLength = length >> 3;
 ALWAYS_INLINE bool equal(const LChar* aLChar, const LChar* bLChar, unsigned length)
 {
     unsigned dwordLength = length >> 3;
@@ -945,7 +945,7 @@ ALWAYS_INLINE bool equal(const UChar* aUChar, const UChar* bUChar, unsigned leng
 
     return true;
 }
 
     return true;
 }
-#elif CPU(X86)
+#elif CPU(X86) && !ASAN_ENABLED
 ALWAYS_INLINE bool equal(const LChar* aLChar, const LChar* bLChar, unsigned length)
 {
     const char* a = reinterpret_cast<const char*>(aLChar);
 ALWAYS_INLINE bool equal(const LChar* aLChar, const LChar* bLChar, unsigned length)
 {
     const char* a = reinterpret_cast<const char*>(aLChar);
@@ -992,7 +992,7 @@ ALWAYS_INLINE bool equal(const UChar* aUChar, const UChar* bUChar, unsigned leng
 
     return true;
 }
 
     return true;
 }
-#elif PLATFORM(IOS) && WTF_ARM_ARCH_AT_LEAST(7)
+#elif PLATFORM(IOS) && WTF_ARM_ARCH_AT_LEAST(7) && !ASAN_ENABLED
 ALWAYS_INLINE bool equal(const LChar* a, const LChar* b, unsigned length)
 {
     bool isEqual = false;
 ALWAYS_INLINE bool equal(const LChar* a, const LChar* b, unsigned length)
 {
     bool isEqual = false;
@@ -1080,9 +1080,26 @@ ALWAYS_INLINE bool equal(const UChar* a, const UChar* b, unsigned length)
         );
     return isEqual;
 }
         );
     return isEqual;
 }
-#else
+#elif !ASAN_ENABLED
 ALWAYS_INLINE bool equal(const LChar* a, const LChar* b, unsigned length) { return !memcmp(a, b, length); }
 ALWAYS_INLINE bool equal(const UChar* a, const UChar* b, unsigned length) { return !memcmp(a, b, length * sizeof(UChar)); }
 ALWAYS_INLINE bool equal(const LChar* a, const LChar* b, unsigned length) { return !memcmp(a, b, length); }
 ALWAYS_INLINE bool equal(const UChar* a, const UChar* b, unsigned length) { return !memcmp(a, b, length * sizeof(UChar)); }
+#else
+ALWAYS_INLINE bool equal(const LChar* a, const LChar* b, unsigned length)
+{
+    for (unsigned i = 0; i < length; ++i) {
+        if (a[i] != b[i])
+            return false;
+    }
+    return true;
+}
+ALWAYS_INLINE bool equal(const UChar* a, const UChar* b, unsigned length)
+{
+    for (unsigned i = 0; i < length; ++i) {
+        if (a[i] != b[i])
+            return false;
+    }
+    return true;
+}
 #endif
 
 ALWAYS_INLINE bool equal(const LChar* a, const UChar* b, unsigned length)
 #endif
 
 ALWAYS_INLINE bool equal(const LChar* a, const UChar* b, unsigned length)