Udostępnij za pośrednictwem


C6262

ostrzeżenie C6262: funkcja używa <stałą> liczbę bajtów stosu: exceeds/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żenia 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 jej 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.

// 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...
}

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

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

Użycie funkcji malloc i free niesie za sobą wiele pułapek pod względem przecieków pamięci i wyjątków.Aby całkowicie uniknąć tego rodzaju problemów z przeciekami i wyjątkami, użyj mechanizmów, które są dostarczane przez C++ standardowy szablon biblioteki (STL).Należą do nich shared_ptr, unique_ptr, i wektor.Aby uzyskać więcej informacji, zobacz Wskaźniki inteligentne (Modern C++) i Odwołanie do standardowej biblioteki C++.

Aby poprawić to ostrzeżenie 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

Porady: Korzystanie z macierzystego sprawdzania w trakcie wykonywania

Informacje

/STACK (Twórz stos z alokacji)

_resetstkoflw