C6202
警告 C6202: <変数> のバッファー オーバーランです。<関数> への呼び出しでスタックが割り当てられた可能性があります: 長さ <サイズ> はバッファー サイズ <max> を超えています。
この警告は、サイズがわかっているスタック バッファーを指すパラメーターが、そのサイズを超えるバイト数をコピーする関数に渡されることを示します。 これにより、バッファー オーバーランが発生する可能性があります。 この問題によって、攻撃に利用される可能性のあるセキュリティ ホールやプログラム クラッシュが発生する場合があります。
使用例
次に示すコードでは、警告 C6202 および C6386 が生成されます。 いずれの警告も、不適切なパラメーター (sizeof intArray) が関数に渡されたことによるバッファー オーバーランの問題を示します。
#include <memory.h>
void f( )
{
int intArray[5];
char charArray[5];
memset ((void *)charArray, 0, sizeof intArray);
// code ...
}
両方の警告を解決するには、次のコードに示すように、sizeof charArray を使用して適切なサイズを渡します。
#include <memory.h>
void f( )
{
char charArray[5];
memset ((void *)charArray, 0, sizeof charArray);
}
次のコードでは、WritableElementsLength プロパティによって関数パラメーター char *pC に注釈が付けられています。 pC の書き込み可能な要素の実際の数は、バッファー char *pCLen の要素の数です。 この場合、pCLen の要素が書き込み可能なパラメーター pC よりも多いので、呼び出しサイトで警告 C6202 が生成されます。
#include <codeanalysis\sourceannotations.h>
using namespace vc_attributes;
void f([Pre(WritableElementsLength="pCLen") ] char *pC, char *pCLen);
void test_f()
{
char pc[12];
char buff[17];
f(pc, buff); // warning 6202
// code...
}
警告 C6203 は、非スタック バッファーに対して生成されます。