このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
sizeof において使用された誤った型
sizeof
の引数が指している型と一致しない
説明
この欠陥は、以下の条件が両方当てはまる場合に発生します。
メモリ ブロックのアドレスをポインターに代入するか、2 つのメモリ ブロック間でデータを転送します。この代入またはコピーで、
sizeof
演算子を使用します。たとえば、
malloc(sizeof(
を使用してポインターを初期化するか、type
))memcpy(
を使用して 2 つのアドレス間でデータをコピーします。destination_ptr
,source_ptr
, sizeof(type
))sizeof
演算子の引数に間違った型を使用します。次に例を示します。ポインターが指す型ではなく、ポインター型を使用している可能性がある。たとえば、
ポインターを初期化する際に、type
*malloc(sizeof(
ではなく、type
))malloc(sizeof(
を使用している可能性があります。type
*))sizeof
引数としてまったく無関係な型を使用している可能性がある。たとえば、
ポインターを初期化する際に、type
*malloc(sizeof(
を使用している可能性があります。anotherType
))
リスク
type
が何型でも、式 sizeof(
では常に固定サイズが返されます。返されるサイズは、お使いのプラットフォームでのポインターのサイズ (バイト単位) です。type
*)sizeof(
の出現は、多くの場合、意図とは異なる使い方を示しています。このエラーにより、必要とするよりもかなり小さなメモリ ブロックの割り当てになり、バッファー オーバーフローなどの脆弱性などにつながる可能性があります。type*
)
たとえば、structType
が 10 個の int
変数を含む構造体だとします。32 ビット プラットフォームで malloc(sizeof(structType*))
を使用して structType*
ポインターを初期化すると、ポインターには 4 バイトのメモリ ブロックが割り当てられます。しかし、1 つの structType
変数全体を割り当てるには、structType*
ポインターは sizeof(structType) = 10 * sizeof(int)
バイトのメモリ ブロックを指さなければなりません。必要なサイズは、実際に割り当てられた 4 バイトのサイズよりもはるかに大きなサイズです。
修正方法
ポインターを初期化するには、ポインターの初期化式の type
*sizeof(
を type
*)sizeof(
に置き換えます。type
)
例
結果情報
グループ: プログラミング |
言語: C | C++ |
既定値: 手書きコードはオン、生成コードはオフ |
コマンド ライン構文: PTR_SIZEOF_MISMATCH |
影響度: High |