So che std::array
è completamente allocato nello stack, ma questa domanda è motivata da problemi di sicurezza che richiedono due cose:
- I dati
std::array
saranno zerod o randomizzati alla distruzione - I dati in
std::array
ingresso verranno bloccati , in modo tale da non andare mai sul disco né in caso di arresto anomalo o di memoria di swap
Di solito, con std::vector
, la soluzione è creare un allocatore personalizzato che faccia queste cose . Tuttavia, per std::array
, non vedo come farlo, e quindi questa domanda.
Il meglio che potrei fare è questo:
template <typename T, std::size_t Size>
struct SecureArray : public std::array<T, Size>
{
static_assert(std::is_pod<T>::value, "Only POD types allowed")
static_assert(sizeof(T) == 1, "Only 1-byte types allowed")
virtual ~SecureArray()
{
std::vector<uint8_t> d = RandomBytes(Size); // generates Size random bytes
std::memcpy(this->data(), d.data(), Size);
}
}
Ma questo ovviamente manca del blocco della memoria e complica lo schema delle prestazioni std::array
che si può ottenere usando std::array
in primo luogo.
C'è qualche soluzione migliore?