次の方法で共有


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

参照

関連項目

malloc

_alloca

_malloca

その他の技術情報

C++ 標準ライブラリ リファレンス