Branch data Line data Source code
# 1 : : // Copyright (c) 2009-2010 Satoshi Nakamoto # 2 : : // Copyright (c) 2009-2018 The Bitcoin Core developers # 3 : : // Distributed under the MIT software license, see the accompanying # 4 : : // file COPYING or http://www.opensource.org/licenses/mit-license.php. # 5 : : # 6 : : #ifndef BITCOIN_SUPPORT_ALLOCATORS_ZEROAFTERFREE_H # 7 : : #define BITCOIN_SUPPORT_ALLOCATORS_ZEROAFTERFREE_H # 8 : : # 9 : : #include <support/cleanse.h> # 10 : : # 11 : : #include <memory> # 12 : : #include <vector> # 13 : : # 14 : : template <typename T> # 15 : : struct zero_after_free_allocator : public std::allocator<T> { # 16 : : // MSVC8 default copy constructor is broken # 17 : : typedef std::allocator<T> base; # 18 : : typedef typename base::size_type size_type; # 19 : : typedef typename base::difference_type difference_type; # 20 : : typedef typename base::pointer pointer; # 21 : : typedef typename base::const_pointer const_pointer; # 22 : : typedef typename base::reference reference; # 23 : : typedef typename base::const_reference const_reference; # 24 : : typedef typename base::value_type value_type; # 25 : 10728448 : zero_after_free_allocator() noexcept {} # 26 : 225924 : zero_after_free_allocator(const zero_after_free_allocator& a) noexcept : base(a) {} # 27 : : template <typename U> # 28 : : zero_after_free_allocator(const zero_after_free_allocator<U>& a) noexcept : base(a) # 29 : : { # 30 : : } # 31 : 10954373 : ~zero_after_free_allocator() noexcept {} # 32 : : template <typename _Other> # 33 : : struct rebind { # 34 : : typedef zero_after_free_allocator<_Other> other; # 35 : : }; # 36 : : # 37 : : void deallocate(T* p, std::size_t n) # 38 : 14816361 : { # 39 [ + - ]: 14816361 : if (p != nullptr) # 40 : 14816361 : memory_cleanse(p, sizeof(T) * n); # 41 : 14816361 : std::allocator<T>::deallocate(p, n); # 42 : 14816361 : } # 43 : : }; # 44 : : # 45 : : /** Byte-vector that clears its contents before deletion. */ # 46 : : using SerializeData = std::vector<uint8_t, zero_after_free_allocator<uint8_t>>; # 47 : : # 48 : : #endif // BITCOIN_SUPPORT_ALLOCATORS_ZEROAFTERFREE_H