Udostępnij za pośrednictwem


C6262

Ostrzeżenie C6262: funkcja używa <constant> bajtów stosu: przekracza /analyze:stacksize<constant 2>.Rozważ przeniesienie niektórych danych na stos

To ostrzeżenie wskazuje, czy wykorzystanie stosu, które przekracza ustawienie wstępne progu (constant 2) zostało wykryte w funkcji.Domyślny rozmiar ramki stosu dla tego ostrzeżenie to 16 KB dla trybu użytkownika, 1 KB dla trybu jądra.Stos—nawet w trybie użytkownika—jest ograniczony i błąd zatwierdzenia strony stosu spowoduje wyjątek przepełnienia stosu.Tryb jądra ma ograniczenie rozmiaru stosu do 12 KB, które nie może zostać zwiększone; dlatego też kod trybu jądra powinien agresywnie ograniczać wykorzystanie stosu.

Aby naprawić problem związany z tym ostrzeżeniem, można przenieść niektóre dane do sterty lub innej pamięci dynamicznej.W trybie użytkownika jedna, duża ramka stosu może nie być problemem — i można pominąć to ostrzeżenie — jednak duża ramka stosu zwiększa ryzyko przepełnienia stosu.(Duża ramka stosu może się pojawić, jeśli funkcja intensywnie używa stosu lub jest cykliczna). Jeśli rzeczywiście występuje przepełnienie stosu, można zwiększyć całkowity rozmiar stosu w trybie użytkownika, ale tylko do ograniczenia systemu.Można użyć opcji wiersza poleceń /analyze aby zmienić wartość dla <constant 2>, ale jego zwiększanie wprowadza ryzyko, że błąd nie zostanie raportowany.

Dla kodu trybu jądra — na przykład w projektach sterownika — wartość <constant 2> jest ustawiona na 1 KB.Dobrze napisane sterowniki powinny mieć bardzo niewiele funkcji, które zbliżają się do tej wartości i może być pożądana zmiana tego limitu na mniejszy.Te same techniki ogólne używane dla kodu w trybie użytkownika do zmniejszenia rozmiaru stosu można dostosować do kodu w trybie jądra.

Przykład

Poniższy kod generuje to ostrzeżenie, ponieważ char buffer przydziela 16,382 bajtów i lokalna zmienna typu całkowitego i przydziela kolejne 4 bajty, które łącznie przekraczają domyślny limit rozmiaru stosu 16 KB.

#include <windows.h>
#define MAX_SIZE 16382

void f( )
{
  int i;
  char buffer[MAX_SIZE];
  
  i = 0;
  buffer[0]='\0';

  // code...
}

Poniższy kod naprawia to ostrzeżenie, przenosząc pewne dane na stertę.

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

Naprawa ostrzeżenia poprzez dopasowanie rozmiaru stosu

  1. Na pasku menu, kliknij Projekt, Właściwości.

    Zostanie wyświetlone okno dialogowe Strony właściwości.

  2. Rozwiń Właściwości konfiguracji.

  3. Rozwiń C/C++.

  4. Wybierz właściwości Wiersza poleceń.

  5. W Dodatkowe opcje, dodaj /analyze:stacksize16388.

Zobacz też

Zadania

Jak: Użyj macierzystym kontroli Run-Time

Informacje

/ STACK (stos alokacje)

_resetstkoflw