C6263
警告 C6263: ループ内で _alloca を使用しています: この動作は、すぐにスタックのオーバーフローを発生させます
この警告は、ループ内の _alloca 呼び出しでメモリを割り当てるとスタック オーバーフローが発生する可能性があることを示します。_alloca はスタックからメモリを割り当てますが、そのメモリは呼び出し関数が終了した場合のみ解放されます。スタックのサイズはユーザー モードでも限定されています。スタックのページのコミットに失敗した場合、スタック オーバーフロー例外が発生します。_resetstkoflw 関数は、スタック オーバーフローが発生した状態からプログラムを回復させ、実行中の操作を致命的な例外エラーが発生したとして失敗させるのではなく、続行できるようにします。_resetstkoflw 関数を呼び出さなければ、前回の例外の後にガード ページは作成されません。次にスタック オーバーフローが発生したときに例外は発生しないので、プロセスは警告なしで終了します。
割り当てサイズまたは反復回数が未知である場合は、スタック オーバーフローの可能性があるので、_alloca をループ内で呼び出さないでください。このような場合は、ヒープ メモリや C++ 標準ライブラリ リファレンス クラスなど、他の方法を検討してください。
使用例
この警告が発生するコード例を次に示します。
#include <windows.h>
#include <malloc.h>
#include <excpt.h>
#include <stdio.h>
#define MAX_SIZE 50
void f ( int size )
{
char* cArray;
__try
{
for(int i = 0; i < MAX_SIZE; i++)
{
cArray = (char *)_alloca(size);
// process cArray...
}
}
__except(GetExceptionCode() == STATUS_STACK_OVERFLOW ?
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH )
{
// code...
puts("Allocation Failed");
_resetstkoflw();
}
}
次に示す例では、この警告を解決するために malloc() を使用しています。
#include <windows.h>
#define MAX_SIZE 50
void f ( int size )
{
char* cArray;
for(int i = 0; i < MAX_SIZE; i++)
{
cArray = (char *) malloc(size);
if (cArray != NULL)
{
// process cArray...
free(cArray);
}
}
}