Предупреждение C6262
Функция использует 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
Практическое руководство. Настройка проверок во время выполнения машинного кода