警告 C6263
ループ内で_allocaを使用する。これにより、スタックが迅速にオーバーフローする可能性があります
解説
この警告は、メモリを割り当てるためにループ内で呼び出すと _alloca
スタック オーバーフローが発生する可能性があることを示します。 _alloca
はスタックからメモリを割り当てますが、そのメモリは呼び出し元の関数が終了したときにのみ解放されます。 スタックのサイズはユーザー モードでも限定されています。スタックのページのコミットに失敗した場合、スタック オーバーフロー例外が発生します。 _resetstkoflw
関数は、スタック オーバーフローが発生した状態からプログラムを回復させ、実行中の操作を致命的な例外エラーが発生したとして失敗させるのではなく、続行できるようにします。 関数が _resetstkoflw
呼び出されない場合、前の例外の後にガード ページはありません。 次にスタック オーバーフローが発生したときに例外は発生しないので、プロセスは警告なしで終了します。
割り当てサイズまたは反復回数が未知である場合は、スタック オーバーフローの可能性があるので、_alloca
をループ内で呼び出さないでください。 このような場合は、ヒープ メモリや C++ 標準ライブラリ クラスなどの他のオプションを検討してください。
コード分析名: USINGALLOCAINLOOP
例
この警告が発生するコード例を次に示します。
#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);
}
}
}
関連項目
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示