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 が適切なアライメントで構築されることが保証されます。