Export (0) Print
Expand All
Expand Minimize
This topic has not yet been rated - Rate this topic

C6263

warning C6263: using _alloca in a loop; this can quickly overflow stack

This warning indicates that calling _alloca inside a loop to allocate memory can cause stack overflow. _alloca allocates memory from the stack, but that memory is only freed when the calling function exits. Stack, even in user-mode, is limited, and failure to commit a page of stack causes a stack overflow exception. The _resetstkoflw function recovers from a stack overflow condition, allowing a program to continue instead of failing with a fatal exception error. If the _resetstkoflw function is not called, there is no guard page after the previous exception. The next time that there is a stack overflow, there are no exceptions at all and the process terminates without warning.

You should avoid calling _alloca inside a loop if either the allocation size or the iteration count is unknown because it might cause stack overflow. In these cases, consider other options such as, heap memory, or Standard C++ Library Reference classes.

The following code generates this warning:

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

The following code uses malloc( ) to correct this warning:

#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);
     }
  }
}
Did you find this helpful?
(1500 characters remaining)
Thank you for your feedback
Show:
© 2014 Microsoft. All rights reserved.