diff --git a/misc.h b/misc.h index f0df03c2..f2b44e50 100644 --- a/misc.h +++ b/misc.h @@ -61,6 +61,17 @@ # pragma GCC diagnostic ignored "-Wunused-parameter" #endif +#if defined(_MSC_VER) && (_MSC_VER >= 1400) +# pragma intrinsic(_ReadWriteBarrier) +# define MEMORY_BARRIER() _ReadWriteBarrier() +#elif defined(_INTEL_COMPILER) +# define MEMORY_BARRIER() __memory_barrier() +#elif defined(__GNUC__) || defined(__clang__) +# define MEMORY_BARRIER() __asm__ __volatile__ ("" ::: "memory") +#else +# define MEMORY_BARRIER() +#endif + NAMESPACE_BEGIN(CryptoPP) // ************** compile-time assertion *************** diff --git a/smartptr.h b/smartptr.h index 057f5213..db5441fe 100644 --- a/smartptr.h +++ b/smartptr.h @@ -3,6 +3,7 @@ #include "config.h" #include "stdcpp.h" +#include "misc.h" #include "trap.h" NAMESPACE_BEGIN(CryptoPP) @@ -51,11 +52,8 @@ template simple_ptr::~simple_ptr() delete m_p; m_p = NULL; -#ifdef __GNUC__ - // From Andrew Haley (GCC Dev), to tame the optimizer so the assignment is always performed. - // See "Disable optimizations in one function" on the GCC mailing list. - asm volatile ("" : : : "memory"); -#endif + // https://github.com/weidai11/cryptopp/issues/6 + MEMORY_BARRIER(); } template class member_ptr