次の方法で共有


警告 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);
     }
  }
}

関連項目