je connais std::array
c'est complètement alloué dans la pile, mais cette question est motivée par des problèmes de sécurité qui nécessitent deux choses:
- Les données
std::array
seront zéros ou randomisées lors de la destruction - Les données
std::array
seront verrouillées , de sorte qu'elles ne jamais stockées sur le disque ni en cas de panne ou de mémoire d'échange
Habituellement, avec std::vector
, la solution consiste à créer un allocateur personnalisé qui fait ces choses . Cependant, pour std::array
, je ne vois pas comment faire cela, et donc cette question.
Le mieux que j'ai pu faire est le suivant:
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);
}
}
Mais cela manque évidemment de verrouillage de la mémoire et complique le schéma de performances std::array
qui doit être obtenu en utilisant std::array
en premier lieu.
Y a-t-il une meilleure solution?
Réponses:
std::array
ne peut pas utiliser d'allocateur; cependant, il semble que votre classe SecureArray puisse réaliser ce que vous voulez grâce à un constructeur / déconstructeur personnalisé.Quelque chose comme ça:
la source
Ce n'est pas tout à fait vrai.
std::array
n'alloue pas de mémoire, cela dépend donc de l'endroit où vous l'allouez.Tout d'abord, ce n'est pas un problème pour verrouiller la mémoire sur la pile. Voir l'exemple POSIX:
Donc, vous pouvez simplement appeler
mlock
ou n'importe quel analogique portable dansSecureArray
constructeur.Deuxièmement, quel gain de performances espérez-vous obtenir? La vitesse de lecture / écriture de la mémoire ne dépend pas de l'endroit où vous allouez votre baie, sur le tas ou sur la pile. Ainsi, tout dépend de la vitesse à laquelle vous pouvez allouer et verrouiller la mémoire. Si les performances sont critiques, le verrouillage de la mémoire peut être trop lent (ou pas, qui sait?) Pour l'appeler à chaque fois dans le
SecureArray
constructeur même si la mémoire est allouée sur la pile.Il est donc plus pratique à utiliser
std::vector
avec l'allocateur personnalisé. Il peut pré-allouer et pré-verrouiller de gros morceaux de mémoire, donc la vitesse d'allocation sera presque aussi rapide que sur la pile.la source
std::array
au lieu de lastd::vector
première place. Je pensais que c'était une question de vitesse d'allocation.