C6262
предупреждение C6262: Функция использует <constant> байт стека, что превышает /analyze:stacksize<constant 2>.Попробуйте переместить какие-либо данные в кучу.
Это предупреждение означает, что внутри функции обнаружено использование размера стека, превышающее заранее установленный предел (constant 2) .По умолчанию размер кадра стека для данного предупреждения: 16 КБ в режиме пользователя, 1 КБ в режиме ядра.Размер стека ограничен даже в пользовательском режиме; при невозможности зафиксировать страницу стека возникает ошибка переполнения стека.Предел размера стека в режиме ядра — 12 КБ и его невозможно увеличить, поэтому код в режиме ядра должен ограничивать использование стека.
Для устранения проблемы, о которой сообщает данное предупреждение, можно либо переместить какие-либо данные в кучу, либо в другую динамическую память.В пользовательском режиме один большой кадр стека может не представлять собой проблему, и это предупреждение можно подавить, но большой кадр стека увеличивает риск переполнения стека.(Большой кадр стека может возникнуть в том случае, если функция часто использует стек, или она рекурсивна). Если происходит переполнение стека, то в пользовательском режиме можно увеличить его общий размер, но только до ограничения системы.Можно использовать параметр командной строки /analyze для изменения значения <constant 2>, однако это увеличивает риск того, что не будет сообщено об ошибке.
В коде режима ядра — например, в проектах драйверов — значение <constant 2> устанавливается равным 1 КБ.Хорошо написанные драйверы должны содержать очень мало функций, которые изменяют это значение, так как изменение ограничения в меньшую сторону может быть нежелательно.Одни и те же общие методы, которые используются для кода пользовательского режима для уменьшения размера стека, могут быть адаптированы к коду в режиме ядра.
Пример
Это предупреждение возникает в приведенном коде в силу того, что char buffer выделяет 16382 байта, а локальная целочисленная переменная i выделяет еще 4 байта, что приводит к превышению разрешенного размера стека в 16 КБ.
#include <windows.h>
#define MAX_SIZE 16382
void f( )
{
int i;
char buffer[MAX_SIZE];
i = 0;
buffer[0]='\0';
// code...
}
В следующем фрагменте кода это предупреждение устраняется путем переноса некоторых данных в кучу.
#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);
}
}
Для исправления этого предупреждения с помощью настройки размера стека
В меню Проект выберите Свойства.
Откроется диалоговое окно Страницы свойств.
Разверните Свойства конфигурации.
Разверните C/C++.
Выберите пункт свойства Командная строка.
В разделе Дополнительные параметры добавьте /analyze:stacksize16388.
См. также
Задачи
Практическое руководство. Настройка проверок во время выполнения машинного кода