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


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);
  }
}

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

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

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

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

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

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

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

См. также

Задачи

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

Ссылки

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

_resetstkoflw