Рассмотрим сценарий, где std::string
используется для хранения секретности. Как только он будет потреблен и больше не нужен, было бы хорошо его очистить, то есть перезаписать память, содержащую его, тем самым скрыв секрет.
std::string
предоставляет функцию const char* data()
, возвращающую указатель на непрерывную память (начиная с С++ 11).
Теперь, поскольку память непрерывна и, переменная будет уничтожена сразу после очистки из-за окончания области действия, было бы безопасно:
char* modifiable = const_cast<char*>(secretString.data());
OpenSSL_cleanse(modifiable, secretString.size());
Согласно стандарту, указанному здесь:
$5.2.11/7 - Примечание: в зависимости от типа объекта операция записи через указатель, lvalue или указатель на элемент данных, полученный в результате
const_cast
, который отбрасываетconst-qualifier
68 может вызывать поведение undefined (7.1.5.1).
Что бы посоветовать иначе, но выполняйте ли указанные выше условия (непрерывный, чтобы просто удалить)?