Поделиться через


C6262

Предупреждение C6262: Функция использует <constant> байт в стеке: это превышает значение /analyze:stacksize<constant 2>.Попробуйте переместить какие-либо данные в кучу.

Это предупреждение означает, что внутри функции обнаружено использование размера стека, превышающее заранее установленный предел (constant 2) .По умолчанию размер кадра стека для данного предупреждения: 16 КБ в режиме пользователя, 1 КБ в режиме ядра.Размер стека ограничен даже в пользовательском режиме; при невозможности зафиксировать страницу стека возникает ошибка переполнения стека.Предел размера стека в режиме ядра — 12 КБ и его невозможно увеличить, поэтому код в режиме ядра должен ограничивать использование стека.

Для устранения проблемы, о которой сообщает данное предупреждение, можно либо переместить какие-либо данные в кучу, либо в другую динамическую память. В пользовательском режиме один большой кадр стека может не представлять собой проблему, и это предупреждение можно подавить, но большой кадр стека увеличивает риск переполнения стека. (Большой кадр стека может возникнуть в том случае, если функция часто использует стек, или она рекурсивна). Если происходит переполнение стека, то в пользовательском режиме можно увеличить его общий размер, но только до ограничения системы. Можно использовать параметр командной строки /analyze для изменения значения <constant 2>, однако это увеличивает риск того, что не будет сообщено об ошибке.

В коде режима ядра — например, в проектах драйверов — значение <constant 2> устанавливается равным 1 КБ.Хорошо написанные драйверы должны содержать очень мало функций, которые изменяют это значение, так как изменение ограничения в меньшую сторону может быть нежелательно. Одни и те же общие методы, которые используются для кода пользовательского режима для уменьшения размера стека, могут быть адаптированы к коду в режиме ядра.

Пример

Это предупреждение возникает в приведенном коде в силу того, что char buffer выделяет 16382 байта, а локальная целочисленная переменная 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 имеет много опасностей в терминах утечки памяти и исключений.Чтобы избежать все такие проблемы утечек и исключений, используйте механизмы, предоставляемые библиотекой стандартных шаблонов (STL) C++.Они включают shared_ptr, unique_ptr и vector.Дополнительные сведения см. в разделах Интеллектуальные указатели (современный C++) и Справочник по стандартной библиотеке C++.

Для исправления этого предупреждения с помощью настройки размера стека

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

    Откроется диалоговое окно Страницы свойств.

  2. Разверните Свойства конфигурации.

  3. Разверните C/C++.

  4. Выберите пункт свойства Командная строка.

  5. В разделе Дополнительные параметры добавьте /analyze:stacksize16388.

См. также

Задачи

Практическое руководство. Настройка проверок во время выполнения машинного кода

Ссылки

Параметр /STACK (выделение памяти в стеке)

_resetstkoflw