メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

sizeof において使用された誤った型

sizeof の引数が指している型と一致しない

説明

この欠陥は、以下の条件が両方当てはまる場合に発生します。

  1. メモリ ブロックのアドレスをポインターに代入するか、2 つのメモリ ブロック間でデータを転送します。この代入またはコピーで、sizeof 演算子を使用します。

    たとえば、malloc(sizeof(type)) を使用してポインターを初期化するか、memcpy(destination_ptr, source_ptr, sizeof(type)) を使用して 2 つのアドレス間でデータをコピーします。

  2. 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) に置き換えます。

すべて展開する

#include <stdlib.h>

void test_case_1(void) {
    char* str;

    str = (char*)malloc(sizeof(char*) * 5);
    free(str);

}

この例では、5 つの文字ポインターの malloc を使用して文字ポインター str にメモリを割り当てています。しかし、str は文字を指すポインターであり、文字ポインターを指すポインターではありません。したがって、sizeof の引数 char* は正しくありません。

修正 — ポインターの型を sizeof の引数と一致させる

1 つの修正方法として、引数をポインターの型に一致させることができます。この例では、str は文字ポインターなので引数も文字でなければなりません。

#include <stdlib.h>

void test_case_1(void) {
    char* str;

    str = (char*)malloc(sizeof(char) * 5);
    free(str);

}

結果情報

グループ: プログラミング
言語: C | C++
既定値: 手書きコードはオン、生成コードはオフ
コマンド ライン構文: PTR_SIZEOF_MISMATCH
影響度: High

バージョン履歴

R2013b で導入

すべて展開する