CERT.MEM.PLACEMENTNEW.MISALIGNED
アライメントが適切なストレージを placement new に提供します。
脆弱性とリスク
不適切に整列されたポインターまたは不十分なストレージへのポインターを placement new 式に渡すと、バッファオーバーフローや異常終了を含む未定義の動作が発生する可能性があります。
軽減と防止
構築中のオブジェクトのアライメントが不適切なポインターを、placement new に渡さないでください。そうするとオブジェクトが不正確な位置に構築され、未定義の動作が発生します。配列に必要なオーバーヘッドを含め、構築中のオブジェクト向けのストレージ容量が不十分なポインターを渡さないでください。これにより、構築中のオブジェクトの境界外でメモリが初期化され、未定義の動作が発生する可能性があります。
最後に、placement new[]
を、必要なオーバーヘッドの制限を指定していないプラットフォームで使用しないでください。
非準拠コード例
コピー
#include <new>
void f() {
char c; // Used elsewhere in the function
unsigned char buffer[sizeof(long)];
long *lp = ::new (buffer) long;
// ...
}
この非準拠コード例では、十分なサイズのバッファーへの long の構築が保証されます。ただし、配置子 new に渡されるポインターのアライメント要件が満たされていることは保証されません。この例をより明確にするために、追加のローカル変数 c も宣言されています。
準拠ソリューション
コピー
#include <new>
void f() {
char c; // Used elsewhere in the function
std::aligned_storage<sizeof(long), alignof(long)>::type buffer;
long *lp = ::new (&buffer) long;
// ...
}
この準拠ソリューションにより、十分なサイズのバッファーへと long が適切なアライメントで構築されることが保証されます。