Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Функция использует constant_1 байты стека: превышает /analyze:stacksize constant_2. Рассмотрите возможность перемещения некоторых данных в кучу
Замечания
Это предупреждение указывает, что использование стека, превышающее предустановленное пороговое значение (constant_2), было обнаружено в функции. Размер кадра стека по умолчанию для этого предупреждения составляет 16 КБ для пользовательского режима, 1 КБ для режима ядра. Стек (даже в пользовательском режиме) ограничен, и ошибка фиксации страницы стека приводит к исключению переполнения стека. Режим ядра имеет ограничение размера стека 12 КБ, которое нельзя увеличить. Попробуйте агрессивно ограничить использование стека в коде в режиме ядра.
Чтобы устранить проблему, связанную с этим предупреждением, можно переместить некоторые данные в кучу или в другую динамическую память. В пользовательском режиме один большой кадр стека может не быть проблемой , и это предупреждение может быть отложено, но большой кадр стека увеличивает риск переполнения стека. (Большой кадр стека может произойти, если функция использует стек сильно или рекурсивно.) Общий размер стека в пользовательском режиме можно увеличить, если на самом деле происходит переполнение стека, но только до ограничения системы.
Для кода в режиме ядра (например, в проектах драйверов) значение constant_2 имеет значение 1 КБ. Хорошо написанные драйверы должны иметь несколько функций, которые подходят к этому значению, и изменение предела вниз может быть желательно. Те же общие методы, которые используются для кода пользовательского режима для уменьшения размера стека, можно адаптировать к коду в режиме ядра.
Имя анализа кода: EXCESSIVESTACKUSAGE
Настройка размера стека для подавления предупреждения
Вы можете использовать /analyze:stacksize параметр командной строки для изменения значения constant_2, но увеличение его представляет риск того, что ошибка может не сообщаться.
Отключение предупреждения в командной строке
- Добавьте параметр в
/analyze:stacksize <new-size>командную строку компилятора. Используйте значение для<new-size>этого значения, превышающего constant_1. Например, если constant_1 равно 27180, можно ввести/analyze:stacksize 32768.
Подавление предупреждения в интегрированной среде разработки
В интегрированной среде разработки Visual Studio выберите проект в окне Обозреватель решений.
В строке меню выберите Проект>Свойства.
В диалоговом окне "Страницы свойств" выберите страницу свойств>конфигурации C/C++>Command Line.
В дополнительных параметрах добавьте
/analyze:stacksize <new-size>, где<new-size>больше constant_1. Например, если constant_1 равно 27180, можно ввести/analyze:stacksize 32768. Нажмите ОК, чтобы сохранить внесенные изменения.
Пример
Следующий код создает это предупреждение, так как char buffer требуется 16 382 байта в стеке, а для локальной целочисленной переменной i требуется еще 4 байта, которые вместе превышают ограничение размера стека по умолчанию в 16 КБ.
// cl.exe /c /analyze /EHsc /W4
#include <windows.h>
#define MAX_SIZE 16382
void f( )
{
int i;
char buffer[MAX_SIZE];
i = 0;
buffer[0]='\0';
// code...
}
Следующий код исправляет это предупреждение путем перемещения некоторых данных в кучу.
// cl.exe /c /analyze /EHsc /W4
#include <stdlib.h>
#include <malloc.h>
#define MAX_SIZE 16382
void f( )
{
int i;
char *buffer;
i = 0;
buffer = (char *) malloc( MAX_SIZE );
if (buffer != NULL)
{
buffer[0] = '\0';
// code...
free(buffer);
}
}
Использование malloc и free имеет множество ошибок, таких как утечки памяти и исключения. Чтобы избежать таких проблем с утечками и исключениями, используйте механизмы, предоставляемые стандартной библиотекой C++ (STL). Это операторы shared_ptr, unique_ptr, а также vector. Дополнительные сведения см. в разделе "Смарт-указатели " и стандартной библиотеки C++.
См. также
/STACK (Выделение стека)
_resetstkoflw
Практическое руководство. Настройка проверок во время выполнения машинного кода