CXX.FUNC.MEMSET.BUILTIN

memset の呼び出しでは、非組み込み型を含む構造体に参照を渡してはなりません。

memset の呼び出しでは、オブジェクトまたはオブジェクトアドレスに参照を渡してはなりません。指定できるのは、オブジェクトまたは配列を指すポインターのみです。

脆弱性とリスク

クラス型、構造体型、または列挙型に sizeof 演算子を適用すると、その型のオブジェクトと、メンバーを単語境界に整列させるために追加されたパディングのバイト数という結果になります。この結果は、個々のメンバーのストレージ要件を加算して計算されたサイズと必ずしも一致しません。

軽減と防止

memset の代わりに標準の構造体初期化を使用するか、アドレスまたは参照の代わりにオブジェクトへのポインターをオブジェクトに渡します。

コピー
struct TestStruct
{
    int a;
    std::string b;
};

TestStruct t = {};              // This initialization is OK

void foo ()
{
    TestStruct t1;
    memset(&t1, 0, sizeof t1);  // This 'ruins' member 'b' of our struct
}                               // Application crashes here

memset 関数は、t1 のアドレスをパラメーターとして受け取ります。オブジェクト t1 は TestStruct 型で、Test Struct は非組み込み型の型メンバーである b (std::string 型) を持つため、これはアプリケーションのクラッシュを引き起こします。代わりに、上記の構造体初期化の使用を検討してください。