I would rather call the used class unique_ptr and revert to auto_ptr, instead
of calling it auto_ptr when in fact it will be a unique_ptr in the future. It
will avoid confusion for people fiddeling with the code, because people will
think they can pass them around at will when they in fact can't.
Other than that, going towards C++11: I like it!
My excuses to Jeffry Walton for receiving this email twice. Potato phone reply
all button was hidden.
Am Mo. Juli 27 22:51:38 2015 GMT+0200 schrieb Jeffrey Walton:
> C++11 is deprecating autor_ptr (or maybe its C++14).
>
> Below is the meat and potatoes of a patch to handle the deprecation so it
> does not surprise us with a broken compile. The idea is if C++03, then we
> want to use auto_ptr. If C++11, then we want to use unique_ptr.
>
> Crypto++'s use of auto_ptr did *not* involve sharing or ownership, so its
> pretty much a straight switch from auto_ptr to unique_ptr when appropriate.
> Also, auto_ptr vs unique_ptr is an internal implementation detail, so we
> should not have a mess to clean up if applications and library use a
> different compiler.
>
> Because the switch occurs on the command line, we have this little piece of
> goodness in smartptr.h:
>
> // This must be kept in sync with stdcpp.h because <memory> is included
> based on the same logic.
> #if ((__cplusplus >= 201103L) || (_MSC_VER >= 1600)) && !defined(__clang__)
> # include <memory>
> template<typename T>
> using auto_ptr = std::unique_ptr<T>;
> #elif defined(__clang__)
> # if (__has_include(<tr1/memory>))
> # include <tr1/memory>
> using std::auto_ptr;
> # endif
> #elif (__cplusplus < 201103L)
> # include <tr1/memory>
> using std::auto_ptr;
> #else
> # include <memory>
> template<typename T>
> using auto_ptr = std::unique_ptr<T>;
> #endif
>
> The gyrations above are due to Apple and LLVM/Clang, and the cross product
> of {C++03,C++11} x {libc++,libstdc++} (4 configurations). Jonathan Wakely
> and David Chisnall were a big help in getting it right.
>
> Any comments or objections?
>
> **********
>
> diff --git a/oaep.cpp b/oaep.cpp
> index 2caa544..51675bc 100644
> --- a/oaep.cpp
> +++ b/oaep.cpp
> @@ -5,8 +5,9 @@
> #ifndef CRYPTOPP_IMPORTS
>
> #include "cryptlib.h"
> +#include "smartptr.h"
> +#include "stdcpp.h"
> #include "oaep.h"
> -#include <functional>
>
> NAMESPACE_BEGIN(CryptoPP)
>
> @@ -19,13 +20,12 @@ size_t OAEP_Base::MaxUnpaddedLength(size_t
> paddedLength) const
>
> void OAEP_Base::Pad(RandomNumberGenerator &rng, const byte *input, size_t
> inputLength, byte *oaepBlock, size_t oaepBlockLen, const NameValuePairs
> ¶meters) const
> {
> - CRYPTOPP_ASSERT (inputLength <= MaxUnpaddedLength(oaepBlockLen));
> + // They gyrations below are due to C++11 deprecating auto_ptr; see
> "smartptr.h".
> + using CryptoPP::auto_ptr;
> + using std::auto_ptr;
>
> -#if defined(CRYPTOPP_CXX11)
> - std::unique_ptr<HashTransformation> pHash(NewHash());
> -#else
> - std::auto_ptr<HashTransformation> pHash(NewHash());
> -#endif
> + CRYPTOPP_ASSERT (inputLength <= MaxUnpaddedLength(oaepBlockLen));
> + auto_ptr<HashTransformation> pHash(NewHash());
>
> // convert from bit length to byte length
> if (oaepBlockLen % 8 != 0)
> @@ -49,11 +49,7 @@ void OAEP_Base::Pad(RandomNumberGenerator &rng, const
> byte *input, size_t inputL
> maskedDB[dbLen-inputLength-1] = 0x01;
> memcpy(maskedDB+dbLen-inputLength, input, inputLength);
>
> -#if defined(CRYPTOPP_CXX11)
> - std::unique_ptr<MaskGeneratingFunction> pMGF(NewMGF());
> -#else
> - std::auto_ptr<MaskGeneratingFunction> pMGF(NewMGF());
> -#endif
> + auto_ptr<MaskGeneratingFunction> pMGF(NewMGF());
>
> rng.GenerateBlock(maskedSeed, seedLen);
> pMGF->GenerateAndMask(*pHash, maskedDB, dbLen, maskedSeed, seedLen);
> @@ -62,13 +58,13 @@ void OAEP_Base::Pad(RandomNumberGenerator &rng, const
> byte *input, size_t inputL
>
> DecodingResult OAEP_Base::Unpad(const byte *oaepBlock, size_t
> oaepBlockLen, byte *output, const NameValuePairs ¶meters) const
> {
> + // They gyrations below are due to C++11 deprecating auto_ptr; see
> "smartptr.h".
> + using CryptoPP::auto_ptr;
> + using std::auto_ptr;
> +
> bool invalid = false;
>
> -#if defined(CRYPTOPP_CXX11)
> - std::unique_ptr<HashTransformation> pHash(NewHash());
> -#else
> - std::auto_ptr<HashTransformation> pHash(NewHash());
> -#endif
> + auto_ptr<HashTransformation> pHash(NewHash());
>
> // convert from bit length to byte length
> if (oaepBlockLen % 8 != 0)
> @@ -87,12 +83,7 @@ DecodingResult OAEP_Base::Unpad(const byte *oaepBlock,
> size_t oaepBlockLen, byte
> byte *const maskedSeed = t;
> byte *const maskedDB = t+seedLen;
>
> -#if defined(CRYPTOPP_CXX11)
> - std::unique_ptr<MaskGeneratingFunction> pMGF(NewMGF());
> -#else
> - std::auto_ptr<MaskGeneratingFunction> pMGF(NewMGF());
> -#endif
> -
> + auto_ptr<MaskGeneratingFunction> pMGF(NewMGF());
> pMGF->GenerateAndMask(*pHash, maskedSeed, seedLen, maskedDB, dbLen);
> pMGF->GenerateAndMask(*pHash, maskedDB, dbLen, maskedSeed, seedLen);
>
> diff --git a/trdlocal.cpp b/trdlocal.cpp
> index 6ca9222..9c83e12 100644
> --- a/trdlocal.cpp
> +++ b/trdlocal.cpp
> @@ -36,11 +36,11 @@ ThreadLocalStorage::ThreadLocalStorage()
> ThreadLocalStorage::~ThreadLocalStorage() CRYPTOPP_THROW
> {
> #ifdef HAS_WINTHREADS
> - if (!TlsFree(m_index))
> + if (!TlsFree(m_index) && !std::uncaught_exception())
> throw Err("TlsFree", GetLastError());
> #else
> int error = pthread_key_delete(m_index);
> - if (error)
> + if (error && !std::uncaught_exception())
> throw Err("pthread_key_delete", error);
> #endif
> }
> diff --git a/zinflate.cpp b/zinflate.cpp
> index 5ba6325..94e7003 100644
> --- a/zinflate.cpp
> +++ b/zinflate.cpp
> @@ -8,6 +8,7 @@
> #include "pch.h"
> #include "cryptlib.h"
> #include "zinflate.h"
> +#include "smartptr.h"
> #include "trap.h"
>
> NAMESPACE_BEGIN(CryptoPP)
> @@ -587,12 +588,16 @@ struct NewFixedLiteralDecoder
> {
> HuffmanDecoder * operator()() const
> {
> + // They gyrations below are due to C++11 deprecating auto_ptr; see
> "smartptr.h".
> + using CryptoPP::auto_ptr;
> + using std::auto_ptr;
> +
> unsigned int codeLengths[288];
> std::fill(codeLengths + 0, codeLengths + 144, 8);
> std::fill(codeLengths + 144, codeLengths + 256, 9);
> std::fill(codeLengths + 256, codeLengths + 280, 7);
> std::fill(codeLengths + 280, codeLengths + 288, 8);
> - std::auto_ptr<HuffmanDecoder> pDecoder(new HuffmanDecoder);
> + auto_ptr<HuffmanDecoder> pDecoder(new HuffmanDecoder);
> pDecoder->Initialize(codeLengths, 288);
> return pDecoder.release();
> }
> @@ -602,13 +607,13 @@ struct NewFixedDistanceDecoder
> {
> HuffmanDecoder * operator()() const
> {
> + // They gyrations below are due to C++11 deprecating auto_ptr; see
> "smartptr.h".
> + using CryptoPP::auto_ptr;
> + using std::auto_ptr;
> +
> unsigned int codeLengths[32];
> std::fill(codeLengths + 0, codeLengths + 32, 5U);
> -#if defined(CRYPTOPP_CXX11)
> - std::unique_ptr<HuffmanDecoder> pDecoder(new HuffmanDecoder);
> -#else
> - std::auto_ptr<HuffmanDecoder> pDecoder(new HuffmanDecoder);
> -#endif
> + auto_ptr<HuffmanDecoder> pDecoder(new HuffmanDecoder);
> pDecoder->Initialize(codeLengths, 32);
> return pDecoder.release();
> }
>
> --
> --
> You received this message because you are subscribed to the "Crypto++ Users"
> Google Group.
> To unsubscribe, send an email to [email protected].
> More information about Crypto++ and this group is available at
> http://www.cryptopp.com.
> ---
> You received this message because you are subscribed to the Google Groups
> "Crypto++ Users" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> For more options, visit https://groups.google.com/d/optout.
>
--
Gesendet von meinem Jolla
--
--
You received this message because you are subscribed to the "Crypto++ Users"
Google Group.
To unsubscribe, send an email to [email protected].
More information about Crypto++ and this group is available at
http://www.cryptopp.com.
---
You received this message because you are subscribed to the Google Groups
"Crypto++ Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.