std::string
保存に使用されているシナリオを考えてみましょう秘密消費されて不要になったら、それを浄化する、つまりそれを保存していたメモリを上書きして、秘密。
std::string
const char* data()
(C++11 以降) 連続メモリへのポインターを返す関数を提供します。
さて、記憶は連続しているのでそしてスコープの終了により、変数はクレンジング直後に破棄されますが、次の操作は安全でしょうか:
char* modifiable = const_cast<char*>(secretString.data());
OpenSSL_cleanse(modifiable, secretString.size());
ここで引用した標準によれば:
$5.2.11/7 - 注意: オブジェクトの型によっては、68
const_cast
をキャストした結果のポインター、左辺値、またはデータ メンバーへのポインターを介した書き込み操作によって、未定義の動作が発生する可能性があります (7.1.5.1)。const-qualifier
それは別のアドバイスになりますが、上記の条件 (継続的、削除される予定) は安全になりますか?
ベストアンサー1
標準では、const char*
によって返されたに書き込んではならないと明示的に規定されているdata()
ため、そうしないでください。
代わりに、変更可能なポインタを取得する完全に安全な方法があります。
if (secretString.size())
OpenSSL_cleanse(&secretString.front(), secretString.size());
または、文字列がすでに縮小されている可能性があり、その全容量が消去されていることを確認したい場合:
if (secretString.capacity()) {
secretString.resize(secretString.capacity());
OpenSSL_cleanse(&secretString.front(), secretString.size());
}