-
Notifications
You must be signed in to change notification settings - Fork 2.4k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
src/secure_allocator.hpp: define missing 'rebind' type #4480
Conversation
Build fails on windows:
|
Thank you! Let's mark as draft. I'll need some time to understand why |
@@ -99,6 +99,10 @@ bool operator!= (const secure_allocator_t<T> &, const secure_allocator_t<U> &) | |||
#else | |||
template <typename T> struct secure_allocator_t : std::allocator<T> | |||
{ | |||
template <class U> struct rebind |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
template <class U> struct rebind | |
secure_allocator_t() { } | |
template<class U> secure_allocator_t(const secure_allocator_t<U>&) { } | |
template <class U> struct rebind |
The error is because you need a converting constructor that can be used to construct Alloc<U>
from Alloc<T>
and vice versa. This adds it.
The other requirements for an allocator type are value_type
, allocate
and deallocate
, and operator==
which can both come from the std::allocator
base class.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
became special
It didn't.
To rebind an allocator you need to be able to determine the rebound type, and construct an instance of the rebound type from the original type. With the missing rebind
the rebound type is std::allocator<U>
and that can be constructed from a secure_allocator_t<T>
(via slicing). But that's broken.
With the new rebind member the rebound type is correct: secure_allocator_t<U>
. But you can't construct that from secure_allocator_t<T>
. So you need to add a converting constructor, and then you also need a user-declared default constructor.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thank you! Taken default constructor and conversion constructor definitions from the non-no-op variant as well. I think it is equivalent to the definition you suggested.
`gcc-13` added an assert to standard headers to make sure custom allocators have intended implementation of rebind type instead of inherited rebind. gcc change: https://gcc.gnu.org/git/?p=gcc.git;a=commitdiff;h=64c986b49558a7 Without the fix build fails on this week's `gcc-13` as: [ 92%] Building CXX object tests/CMakeFiles/test_security_curve.dir/test_security_curve.cpp.o In file included from /<<NIX>>/gcc-13.0.0/include/c++/13.0.0/ext/alloc_traits.h:34, from /<<NIX>>/gcc-13.0.0/include/c++/13.0.0/bits/stl_uninitialized.h:64, from /<<NIX>>/gcc-13.0.0/include/c++/13.0.0/memory:69, from tests/../src/secure_allocator.hpp:42, from tests/../src/curve_client_tools.hpp:49, from tests/test_security_curve.cpp:53: /<<NIX>>/gcc-13.0.0/include/c++/13.0.0/bits/alloc_traits.h: In instantiation of 'struct std::__allocator_traits_base::__rebind<zmq::secure_allocator_t<unsigned char>, unsigned char, void>': /<<NIX>>/gcc-13.0.0/include/c++/13.0.0/bits/alloc_traits.h:94:11: required by substitution of 'template<class _Alloc, class _Up> using std::__alloc_rebind = typename std::__allocator_traits_base::__rebind<_Alloc, _Up>::type [with _Alloc = zmq::secure_allocator_t<unsigned char>; _Up = unsigned char]' /<<NIX>>/gcc-13.0.0/include/c++/13.0.0/bits/alloc_traits.h:228:8: required by substitution of 'template<class _Alloc> template<class _Tp> using std::allocator_traits< <template-parameter-1-1> >::rebind_alloc = std::__alloc_rebind<_Alloc, _Tp> [with _Tp = unsigned char; _Alloc = zmq::secure_allocator_t<unsigned char>]' /<<NIX>>/gcc-13.0.0/include/c++/13.0.0/ext/alloc_traits.h:126:65: required from 'struct __gnu_cxx::__alloc_traits<zmq::secure_allocator_t<unsigned char>, unsigned char>::rebind<unsigned char>' /<<NIX>>/gcc-13.0.0/include/c++/13.0.0/bits/stl_vector.h:88:21: required from 'struct std::_Vector_base<unsigned char, zmq::secure_allocator_t<unsigned char> >' /<<NIX>>/gcc-13.0.0/include/c++/13.0.0/bits/stl_vector.h:423:11: required from 'class std::vector<unsigned char, zmq::secure_allocator_t<unsigned char> >' tests/../src/curve_client_tools.hpp:64:76: required from here /<<NIX>>/gcc-13.0.0/include/c++/13.0.0/bits/alloc_traits.h:70:31: error: static assertion failed: allocator_traits<A>::rebind_alloc<A::value_type> must be A 70 | _Tp>::value, | ^~~~~ The change adds trivial `rebind` definition with expected return type and satisfies conversion requirements.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looks OK to me
Is it possible to release new version with that fix? 🤔 |
gcc-13
added an assert to standard headers to make sure custom allocators have intended implementation of rebind type instead of inherited rebind. gcc change:https://gcc.gnu.org/git/?p=gcc.git;a=commitdiff;h=64c986b49558a7
Without the fix build fails on this week's
gcc-13
as:The change adds trivial
rebind
definition with expected return type.