Sdílet prostřednictvím


C6262

upozornění C6262: funkce využívá <konstanta> bajtů zásobníku: překračuje /analyze:stacksize<konstanta 2>.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 odeslat 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.Parametr <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.

#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.

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

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 možnost /analyze:stacksize16388.

Viz také

Úkoly

Jak: použití nativního spuštění kontroly

Referenční dokumentace

/ ZÁSOBNÍKU (zásobník rozdělení)

_resetstkoflw