]> git-server-git.apps.pok.os.sepia.ceph.com Git - rocksdb.git/commitdiff
Not using aligned_alloc with gcc4 + asan
authorYi Wu <yiwu@fb.com>
Wed, 30 Aug 2017 04:41:46 +0000 (21:41 -0700)
committerFacebook Github Bot <facebook-github-bot@users.noreply.github.com>
Wed, 30 Aug 2017 04:56:02 +0000 (21:56 -0700)
Summary:
GCC < 5 + ASAN does not instrument aligned_alloc, which can make ASAN
report false-positive with "free on address which was not malloc" error.
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61693

Also suppress leak warning with LRUCache::DisownData().
Closes https://github.com/facebook/rocksdb/pull/2783

Differential Revision: D5696465

Pulled By: yiwu-arbug

fbshipit-source-id: 87c607c002511fa089b18cc35e24909bee0e74b4

cache/lru_cache.cc
port/port_posix.cc

index 47e40233648d2ac893ed265eec3986a735b736d3..268378b9d2bdd7893bf2315d7984db06a009c819 100644 (file)
@@ -234,35 +234,19 @@ void LRUCacheShard::EvictFromLRU(size_t charge,
 }
 
 void* LRUCacheShard::operator new(size_t size) {
-#if __SANITIZE_ADDRESS__
-  return malloc(size);
-#else
   return port::cacheline_aligned_alloc(size);
-#endif
 }
 
 void* LRUCacheShard::operator new[](size_t size) {
-#if __SANITIZE_ADDRESS__
-  return malloc(size);
-#else
   return port::cacheline_aligned_alloc(size);
-#endif
 }
 
 void LRUCacheShard::operator delete(void *memblock) {
-#if __SANITIZE_ADDRESS__
-  free(memblock);
-#else
   port::cacheline_aligned_free(memblock);
-#endif
 }
 
 void LRUCacheShard::operator delete[](void* memblock) {
-#if __SANITIZE_ADDRESS__
-  free(memblock);
-#else
   port::cacheline_aligned_free(memblock);
-#endif
 }
 
 void LRUCacheShard::SetCapacity(size_t capacity) {
@@ -518,7 +502,12 @@ uint32_t LRUCache::GetHash(Handle* handle) const {
   return reinterpret_cast<const LRUHandle*>(handle)->hash;
 }
 
-void LRUCache::DisownData() { shards_ = nullptr; }
+void LRUCache::DisownData() {
+// Do not drop data if compile with ASAN to suppress leak warning.
+#ifndef __SANITIZE_ADDRESS__
+  shards_ = nullptr;
+#endif  // !__SANITIZE_ADDRESS__
+}
 
 size_t LRUCache::TEST_GetLRUSize() {
   size_t lru_size_of_all_shards = 0;
index ee073a55d3f2f96fb7261cf491368d44b8effa7e..129933bb1f95bcac2f849e2aa68ce7bbbfaea4c6 100644 (file)
@@ -185,7 +185,9 @@ int GetMaxOpenFiles() {
 }
 
 void *cacheline_aligned_alloc(size_t size) {
-#if defined (_ISOC11_SOURCE)
+#if __GNUC__ < 5 && defined(__SANITIZE_ADDRESS__)
+  return malloc(size);
+#elif defined(_ISOC11_SOURCE)
   return aligned_alloc(CACHE_LINE_SIZE, size);
 #elif ( _POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600 || defined(__APPLE__))
   void *m;