Eu sei que std::array
está completamente alocado na pilha, mas essa pergunta é motivada por preocupações de segurança que exigem duas coisas:
- Os dados
std::array
serão zerod ou randomizados na destruição - Os dados
std::array
serão bloqueados , de forma que nunca entrem no disco nem na falha ou na memória de troca
Geralmente, com std::vector
, a solução é criar um alocador personalizado que faça essas coisas . No entanto, para std::array
, eu não vejo como fazer isso e, portanto, esta pergunta.
O melhor que pude fazer é o seguinte:
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);
}
}
Mas isso obviamente não possui bloqueio de memória e complica o esquema de desempenho std::array
a ser obtido usando-o std::array
em primeiro lugar.
Existe alguma solução melhor?
Respostas:
std::array
não pode usar um alocador; no entanto, parece que sua classe SecureArray pode alcançar o que você deseja através de um construtor / desconstrutor personalizado.Algo assim:
fonte
Isso não é bem verdade.
std::array
não aloca nenhuma memória, portanto depende de onde você a aloca.Em primeiro lugar, não é um problema bloquear a memória na pilha. Veja o exemplo POSIX:
Então, você pode simplesmente chamar
mlock
ou qualquer analógico portátil noSecureArray
construtor.Em segundo lugar, que ganho de desempenho você espera obter? A velocidade de leitura / gravação na memória não depende de onde você aloca sua matriz, na pilha ou na pilha. Portanto, é tudo sobre a rapidez com que você pode alocar e bloquear a memória. Se o desempenho for crítico, o bloqueio da memória pode ser muito lento (ou não, quem sabe?) Para chamá-lo sempre no
SecureArray
construtor, mesmo que a memória esteja alocada na pilha.Portanto, é mais útil usar
std::vector
com alocador personalizado. Ele pode pré-alocar e pré-bloquear grandes blocos de memória; portanto, a velocidade de alocação será quase tão rápida quanto na pilha.fonte
std::array
vez destd::vector
em primeiro lugar. Eu pensei que era sobre velocidade de alocação.