diff --git a/storage/innobase/include/sync0types.h b/storage/innobase/include/sync0types.h
index d7583f87f3b..fb70b391f72 100644
--- a/storage/innobase/include/sync0types.h
+++ b/storage/innobase/include/sync0types.h
@@ -552,7 +552,7 @@ class LatchCounter {
 		}
 
 		/** Rest the values to zero */
-		void reset()
+		void reset() __attribute__((no_sanitize("address")))
 			UNIV_NOTHROW
 		{
 			m_spins = 0;
@@ -602,7 +602,7 @@ class LatchCounter {
 	mutex and we don't care about atomicity. Unless it is a
 	demonstrated problem. The information collected is not
 	required for the correct functioning of the server. */
-	void reset()
+	void reset() __attribute__((no_sanitize("address")))
 		UNIV_NOTHROW
 	{
 		m_mutex.enter();
@@ -620,7 +620,7 @@ class LatchCounter {
 	}
 
 	/** @return the aggregate counter */
-	Count* sum_register()
+	Count* sum_register() __attribute__((no_sanitize("address")))
 		UNIV_NOTHROW
 	{
 		m_mutex.enter();
@@ -678,6 +670,7 @@ class LatchCounter {
 	/** Iterate over the counters */
 	template <typename Callback>
 	void iterate(Callback& callback) const
+		__attribute__((no_sanitize("address")))
 		UNIV_NOTHROW
 	{
 		Counters::const_iterator	end = m_counters.end();
@@ -691,7 +684,7 @@ class LatchCounter {
 	}
 
 	/** Disable the monitoring */
-	void enable()
+	void enable() __attribute__((no_sanitize("address")))
 		UNIV_NOTHROW
 	{
 		m_mutex.enter();
@@ -711,7 +704,7 @@ class LatchCounter {
 	}
 
 	/** Disable the monitoring */
-	void disable()
+	void disable() __attribute__((no_sanitize("address")))
 		UNIV_NOTHROW
 	{
 		m_mutex.enter();
diff --git a/storage/innobase/include/ut0pool.h b/storage/innobase/include/ut0pool.h
index f60608bf6c6..84010413207 100644
--- a/storage/innobase/include/ut0pool.h
+++ b/storage/innobase/include/ut0pool.h
@@ -29,6 +29,12 @@ Created 2012-Feb-26 Sunny Bains
 #include <vector>
 #include <queue>
 #include <functional>
+#if __has_feature(address_sanitizer) || defined(__SANITIZE_ADDRESS__)
+# include <sanitizer/asan_interface.h>
+#else
+# define ASAN_UNPOISON_MEMORY_REGION(buf,len) /* empty */
+# define ASAN_POISON_MEMORY_REGION(buf,len) /* empty */
+#endif
 
 #include "ut0new.h"
 
@@ -85,6 +91,7 @@ struct Pool {
 
 		for (Element* elem = m_start; elem != m_last; ++elem) {
 
+			ASAN_UNPOISON_MEMORY_REGION(elem, sizeof *elem);
 			ut_ad(elem->m_pool == this);
 			Factory::destroy(&elem->m_type);
 		}
@@ -106,7 +113,7 @@ struct Pool {
 
 			elem = m_pqueue.top();
 			m_pqueue.pop();
-
+			ASAN_UNPOISON_MEMORY_REGION(elem, sizeof *elem);
 		} else if (m_last < m_end) {
 
 			/* Initialise the remaining elements. */
@@ -116,6 +123,7 @@ struct Pool {
 
 			elem = m_pqueue.top();
 			m_pqueue.pop();
+			ASAN_UNPOISON_MEMORY_REGION(elem, sizeof *elem);
 		} else {
 			elem = NULL;
 		}
@@ -159,6 +167,7 @@ struct Pool {
 		ut_ad(elem >= m_start && elem < m_last);
 
 		ut_ad(Factory::debug(&elem->m_type));
+		ASAN_POISON_MEMORY_REGION(elem, sizeof *elem);
 
 		m_pqueue.push(elem);
 
@@ -175,6 +184,7 @@ struct Pool {
 
 			m_last->m_pool = this;
 			Factory::init(&m_last->m_type);
+			ASAN_POISON_MEMORY_REGION(m_last, sizeof *m_last);
 			m_pqueue.push(m_last);
 		}
 
