警告 C26831
割り当てサイズは、数値オーバーフローの結果である可能性があります
解説
この警告は、割り当てに指定されたサイズが数値オーバーフローの結果である可能性があることを報告します。 次に例を示します。
void *SmallAlloc(int);
void foo(int i, int j)
{
int* p = (int*)SmallAlloc(i + j); // Warning: C26831
p[i] = 5;
}
オーバーフローした場合 i+j
は、 SmallAlloc
予想よりも小さいバッファーを返します。 その結果、後でバッファーへのアクセスが範囲外に試行される可能性があります。 このコード パターンにより、リモートでコードが実行される脆弱性が発生する可能性があります。
チェックは、、malloc
、などのnew
一般的な割り当て関数にVirtualAlloc
適用されます。 チェックは、関数名に (大文字と小文字をalloc
区別しない) カスタム アロケーター関数にも適用されます。
このチェックは、チェックが保守的であるため、特定のチェックがオーバーフローを防ぐことがあることを認識できない場合があります。
この警告は、Visual Studio 2022 バージョン 17.7 以降のバージョンで使用できます。
例
オーバーフローする可能性がある前のコード例i+j
を修正するには、チェックを導入して、オーバーフローしないようにします。 次に例を示します。
void *SmallAlloc(int);
void foo(int i, int j)
{
if (i < 0 || j < 0 )
{
return;
}
if (i > 100 || j > 100)
{
return;
}
int* p = (int*)SmallAlloc(i + j);
p[i] = 5;
}