Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Функция использует 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
Практическое руководство. Настройка проверок во время выполнения машинного кода