Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
предупреждение C28615: необходимо вызывать _resetstkoflw в блоке __except() при вызове _alloca в блоке __try. Не вызывайте _resetstkoflw из блока catch()
Средство анализа кода сообщает это предупреждение при вызове _resetstkoflw функции _resetstkoflw в блоке catch или при вызове приложений alloca в блоке try без вызова _resetstkoflw в блоке за исключением.
Поток может перехватывать только одно исключение переполнения стека (вызываемое из вызова _alloca), если только стек не исправлен (например, _resetstkoflw) после каждого исключения. Если стек не исправлен после того, как первое исключение возникает из _alloca, второе исключение приведет к немедленному и автоматическому завершению процесса.
Необходимо вызвать _resetstkoflw, если текущие указатели стека указывают на адрес выше третьей страницы в стеке. Это связано с тем, что это не имеет смысла сделать охранную страницу из текущей страницы, на которую указывает указатель стека (или указывает на момент).
Функция _resetstkoflw не должна вызываться из структурированного выражения фильтра обработчика исключений или из функции, вызываемой из структурированного выражения фильтра обработчика исключений.
Примеры
Средство анализа кода сообщает об этом предупреждении для следующего примера, так как выражение фильтра вызывается перед стеком очистки. При переполнении стека выражение фильтра вызывается, когда текущий указатель стека указывает на третью страницу из нижней части стека.
__try
{
/* The following could cause stack overflow */
char *x = _alloca (i);
}
__except ((GetExceptionCode () == EXCEPTION_STACK_OVERFLOW)
? (_resetstkoflw (), EXCEPTION_EXECUTE_HANDLER)
: EXCEPTION_CONTINUE_SEARCH)
{
}
Следующий пример также завершается ошибкой по аналогичным причинам.
__try
{
char *x = _alloca (i);
}
__except (SEHFilter (GetExceptionCode ()))
{
}
int SEHFilter (DWORD dwExceptionCode)
{
if (dwExceptionCode == EXCEPTION_STACK_OVERFLOW)
{
_resetstkoflw ();
return EXCEPTION_EXECUTE_HANDLER;
}
else
{
return EXCEPTION_CONTINUE_SEARCH;
}
}
Следующий пример успешно избегает ошибки.
__try
{
char *x = _alloca (i);
}
__except ((GetExceptionCode () == EXCEPTION_STACK_OVERFLOW) ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH)
{
// In this block the stack has already been unwound,
// so this call will succeed.
_resetstkoflw ();
}