警告 C26833
割り当てサイズは、バインドされたチェックの前に数値オーバーフローが発生した結果である可能性があります
解説
この警告は、割り当てに指定されたサイズが数値オーバーフローの結果である可能性があることを報告します。 次に例を示します。
void* SmallAlloc(int);
void foo(unsigned i, unsigned j)
{
unsigned size = i + j;
if (size > 50)
{
return;
}
int* p = (int*)SmallAlloc(size + 5); // Warning: C26833
p[j] = 5;
}
チェックがsize > 50
遅すぎます。 i + j
オーバーフローすると、チェックを渡す小さな値が生成されます。 次に、 SmallAlloc
予想よりも小さいバッファーを割り当てます。 その結果、後でバッファーへのアクセスが範囲外に試行される可能性があります。 このコード パターンにより、リモートでコードが実行される脆弱性が発生する可能性があります。
このチェックは、、malloc
、、などのnew
一般的な割り当て関数にVirtualAlloc
適用されます。 チェックは、関数名に (大文字と小文字をalloc
区別しない) カスタム アロケーター関数にも適用されます。
このチェックは、チェックが保守的であるため、特定のチェックがオーバーフローを防ぐことがあることを認識できない場合があります。
この警告は、Visual Studio 2022 バージョン 17.7 以降のバージョンで使用できます。
例
前のコード例を修正するには、オーバーフローできないことを確認します i+j
。 次に例を示します。
void* SmallAlloc(int);
void foo(unsigned i, unsigned j)
{
if (i > 100 || j > 100)
{
return;
}
unsigned size = i + j;
if (size > 50)
{
return;
}
int* p = (int*)SmallAlloc(size + 5);
p[j] = 5;
}
関連項目
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示