Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1865)

Unified Diff: Source/wtf/Atomics.h

Issue 556443003: Oilpan: Fix ASan instrumentation around heap object headers. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Don't duplicate. Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/platform/heap/Heap.cpp ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/wtf/Atomics.h
diff --git a/Source/wtf/Atomics.h b/Source/wtf/Atomics.h
index aaad9c9e90cbe954fd9d30ec7a89488822201298..acce1845b8da2f27314c09b3a31c5944d0005a53 100644
--- a/Source/wtf/Atomics.h
+++ b/Source/wtf/Atomics.h
@@ -43,6 +43,10 @@
#include <sanitizer/tsan_interface_atomic.h>
#endif
+#if defined(ADDRESS_SANITIZER)
+#include <sanitizer/asan_interface.h>
+#endif
+
namespace WTF {
#if COMPILER(MSVC)
@@ -125,6 +129,21 @@ ALWAYS_INLINE unsigned acquireLoad(volatile const unsigned* ptr)
{
return static_cast<unsigned>(__tsan_atomic32_load(reinterpret_cast<volatile const int*>(ptr), __tsan_memory_order_acquire));
}
+
+#if defined(ADDRESS_SANITIZER)
+
+__attribute__((no_sanitize_address)) ALWAYS_INLINE void asanReleaseStore(volatile unsigned* ptr, unsigned value)
Alexander Potapenko 2014/09/09 09:40:30 This is not gonna work. ASan doesn't provide the _
Mads Ager (chromium) 2014/09/09 09:51:36 Thanks! Since they can't be defined together in th
+{
+ __tsan_atomic32_store(reinterpret_cast<volatile int*>(ptr), static_cast<int>(value), __tsan_memory_order_release);
+}
+
+__attribute__((no_sanitize_address)) ALWAYS_INLINE unsigned asanAcquireLoad(volatile const unsigned* ptr)
+{
+ return static_cast<unsigned>(__tsan_atomic32_load(reinterpret_cast<volatile const int*>(ptr), __tsan_memory_order_acquire));
+}
+
+#endif // defined(ADDRESS_SANITIZER)
+
#else
#if CPU(X86) || CPU(X86_64)
@@ -179,10 +198,41 @@ ALWAYS_INLINE unsigned acquireLoad(volatile const unsigned* ptr)
return value;
}
+#if defined(ADDRESS_SANITIZER)
+
+__attribute__((no_sanitize_address)) ALWAYS_INLINE void asanReleaseStore(volatile unsigned* ptr, unsigned value)
+{
+ MEMORY_BARRIER();
+ *ptr = value;
+}
+
+__attribute__((no_sanitize_address)) ALWAYS_INLINE unsigned asanAcquireLoad(volatile const unsigned* ptr)
+{
+ unsigned value = *ptr;
+ MEMORY_BARRIER();
+ return value;
+}
+
+#endif // defined(ADDRESS_SANITIZER)
+
#undef MEMORY_BARRIER
#endif
+#if !defined(ADDRESS_SANITIZER)
+
+ALWAYS_INLINE void asanReleaseStore(volatile unsigned* ptr, unsigned value)
+{
+ releaseStore(ptr, value);
+}
+
+ALWAYS_INLINE unsigned asanAcquireLoad(volatile const unsigned* ptr)
+{
+ return acquireLoad(ptr);
+}
+
+#endif
+
} // namespace WTF
using WTF::atomicAdd;
@@ -194,4 +244,10 @@ using WTF::atomicSetOneToZero;
using WTF::acquireLoad;
using WTF::releaseStore;
+// These methods allow loading from and storing to poisoned memory. Only
+// use these methods if you know what you are doing since they will
+// silence use-after-poison errors from ASan.
+using WTF::asanAcquireLoad;
+using WTF::asanReleaseStore;
+
#endif // Atomics_h
« no previous file with comments | « Source/platform/heap/Heap.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698