Предупреждение 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.

Подавление предупреждения в интегрированной среде разработки

  1. В интегрированной среде разработки Visual Studio выберите проект в окне Обозреватель решений.

  2. В строке меню выберите Проект>Свойства.

  3. В диалоговом окне "Страницы свойств" выберите страницу свойств>конфигурации C/C++>Command Line.

  4. В дополнительных параметрах добавьте /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
Практическое руководство. Настройка проверок во время выполнения машинного кода