次の方法で共有


警告 C26832

割り当てサイズは、オーバーフローが発生する可能性がある縮小変換の結果です

解説

この警告は、割り当てに指定されたサイズが、数値オーバーフローになる縮小変換の結果である可能性があることを報告します。 次に例を示します。

void* SmallAlloc(int);

void foo(unsigned short i, unsigned short j)
{
    unsigned short size = i + j;
    
    int* p = (int*)SmallAlloc(size); // Warning: C26832
    p[i] = 5;
}

i + jでは、両方 ij 整数に昇格され、加算の結果が一時整数に格納されます。 次に、値が格納される前に、一時整数が暗黙的に an unsigned shortsizeキャストされます。 キャスト先がオーバーフローする unsigned short 可能性があります。その場合 SmallAlloc 、予想よりも小さいバッファーが返される場合があります。 その結果、後でバッファーへのアクセスが範囲外に試行される可能性があります。 このコード パターンにより、リモートでコードが実行される脆弱性が発生する可能性があります

このチェックは、、malloc、、などのnew一般的な割り当て関数にVirtualAlloc適用されます。 チェックは、関数名に (大文字と小文字をalloc区別しない) カスタム アロケーター関数にも適用されます。

このチェックは、チェックが保守的であるため、特定のチェックがオーバーフローを防ぐことがあることを認識できない場合があります。

この警告は、Visual Studio 2022 バージョン 17.7 以降のバージョンで使用できます。

オーバーフローする可能性がある前のコード例i+jを修正するには、チェックを導入して、オーバーフローしないようにします。 次に例を示します。

void *SmallAlloc(int);

void foo(unsigned short i, unsigned short j)
{
    if (i > 100 || j > 100)
        return;

    unsigned short size = i + j;
    
    int* p = (int*)SmallAlloc(size);
    p[i] = 5;
}

関連項目

C26831
C26833