The second also break compilation if someone uses MinGW-w64 CRT v 3.x with secure APIs support.
This is because _MEMORY_S_DEFINED macro is defined in sec_api/memory_s.h, resulting in CryptoPP::memcpy_s not declared.
Note:
- v 4.x and later move memcpy_s to string.h and do not define _MEMORY_S_DEFINED anymore.
- v 3.x, 4.x, 5.x are used with GCC 4.x, 5.x, 6.x respectively.
- MINGW_HAS_SECURE_API is defined if CRT has support for secure APIs.
- __MINGW32__ is defined in both cases (32bit vs 64bit).
So I suggest a change as follow:
#if defined(__MINGW32__)
// avoid ambiguity if we have two versions of memcpy_s
#if !defined(MINGW_HAS_SECURE_API) || (MINGW_HAS_SECURE_API + 0 == 0) || defined(CRYPTOPP_WANT_SECURE_LIB)
using CryptoPP::memcpy_s;
#else
using ::memcpy_s;
#endif
#endif
So I suggest a change as follow:
#if defined(__MINGW32__)
// avoid ambiguity if we have two versions of memcpy_s
#if !defined(MINGW_HAS_SECURE_API) || (MINGW_HAS_SECURE_API + 0 == 0) || defined(CRYPTOPP_WANT_SECURE_LIB)
using CryptoPP::memcpy_s;
#else
using ::memcpy_s;
#endif
#endif
The first will break compilation if someone uses MinGW-w64 CRT with secure APIs support.
This is because we have two declaration of memcpy_s imported in global namespace (line 66):
USING_NAMESPACE(CryptoPP)The second also break compilation if someone uses MinGW-w64 CRT v 3.x with secure APIs support.
This is because _MEMORY_S_DEFINED macro is defined in sec_api/memory_s.h, resulting in CryptoPP::memcpy_s not declared.Note:
- v 4.x and later move memcpy_s to string.h and do not define _MEMORY_S_DEFINED anymore.
- v 3.x, 4.x, 5.x are used with GCC 4.x, 5.x, 6.x respectively.
- MINGW_HAS_SECURE_API is defined if CRT has support for secure APIs.
- __MINGW32__ is defined in both cases (32bit vs 64bit).