Sdílet prostřednictvím


C6262

upozornění C6262: funkce využívá <constant> bajtů zásobníku: překračuje /analyze:stacksize<constant2>.Zvažte přesunutí některých dat do haldy

Toto upozornění znamená, že bylo ve funkci zjištěno využití zásobníku, které překračuje přednastavený práh (constant 2).Výchozí velikost rámce zásobníku pro toto upozornění je 16 KB pro uživatelský režim, 1 KB pro režim jádra.Zásobník je i v uživatelském režimu omezen a nezdaří-li se zapsat stránku zásobníku, dojde k výjimce přetečení zásobníku.Režim jádra má maximální velikost zásobníku 12 KB, kterou nelze zvýšit; proto by kód režimu jádra měl zásadně omezovat použití zásobníku.

Chcete-li opravit problém způsobující toto upozornění, přesuňte některá data na haldu nebo do jiné dynamické paměti. V uživatelském režimu nemusí jeden rámec zásobníku představovat velký problém, tudíž lze toto upozornění potlačit, avšak velké rámce zásobníku zvyšují riziko přetečení zásobníku. (Velký rámec zásobníku se může vyskytnout, pokud funkce značně využívá zásobník nebo je rekurzivní.) Celková velikost zásobníku v uživatelském režimu může být navýšena, dojde-li k přetečení zásobníku, avšak pouze do omezení daného systémem. Hodnotu parametru <constant 2> lze změnit použitím možnosti příkazového řádku /analyze, avšak zvýšení této hodnoty představuje riziko, že nebudou hlášeny některé chyby.

Pro kód v režimu jádra, například v projektech ovladačů, je hodnota parametru <constant 2> nastavena na 1 KB.Kvalitní ovladače by měly obsahovat velmi málo funkcí, které se této hodnotě přibližují - může být naopak žádoucí tento limit ještě snížit. Stejné obecné postupy používané pro snížení velikosti zásobníku pro kód v uživatelském režimu mohou být přizpůsobeny pro kód režimu jádra.

Příklad

Následující kód vygeneruje toto upozornění, protože příkaz char buffer přiděluje 16 382 bajtů a místní celočíselná proměnná i přiděluje další 4 bajty, což dohromady překračuje výchozí limit velikosti zásobníku 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...
}

Následující kód opravuje toto upozornění přesunutím některých dat do haldy.

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

Použití malloc a free má mnoho nástrah v podobě nevracení paměti a výjimek.Chcete-li zabránit těmto druhům problémů úniky a výjimkami zcela, použijte mechanismy, které jsou k dispozici v knihovně C++ STL.Patří mezi ně shared_ptr, unique_ptr a vector.Další informace naleznete v tématu Chytré ukazatele (moderní verze jazyka C++) a Standardní knihovna C++ – referenční dokumentace.

Oprava tohoto upozornění úpravou velikosti zásobníku

  1. Na panelu nabídky vyberte možnosti Projekt a Vlastnosti.

    Je zobrazeno dialogové okno Stránky vlastností.

  2. Rozbalte Vlastnosti konfigurace.

  3. Rozbalte C/C++.

  4. Zvolte vlastnosti příkazového řádku.

  5. Do Dalších možností přidejte /analyze:stacksize16388.

Viz také

Úkoly

Postupy: Použití nativních kontrol za běhu

Referenční dokumentace

/STACK (přidělení zásobníku)

_resetstkoflw