Upozornění C6262
Funkce používá constant_1 bajty zásobníku: překračuje /analyze:stacksize constant_2. Zvažte přesun některých dat do haldy.
Poznámky
Toto upozornění označuje, že ve funkci bylo zjištěno použití zásobníku, které překračuje přednastavenou prahovou hodnotu (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. Stack (i v uživatelském režimu) je omezený a při potvrzení stránky zásobníku dojde k výjimce přetečení zásobníku. Režim jádra má limit velikosti zásobníku 12 kB, který nejde zvýšit. Pokuste se agresivně omezit použití zásobníku v kódu v režimu jádra.
Chcete-li vyřešit problém za tímto upozorněním, můžete přesunout některá data do haldy nebo do jiné dynamické paměti. V uživatelském režimu nemusí být problém s jedním velkým rámečkem zásobníku a toto upozornění může být potlačeno, ale velký rámec zásobníku zvyšuje riziko přetečení zásobníku. (Velký rámec zásobníku může nastat, pokud funkce používá zásobník silně nebo je rekurzivní.) Celková velikost zásobníku v uživatelském režimu se dá zvýšit, pokud skutečně dojde k přetečení zásobníku, ale pouze až do limitu systému.
U kódu v režimu jádra (například v projektech ovladačů) je hodnota constant_2 nastavená na 1 kB. Dobře napsané ovladače by měly mít několik funkcí, které tuto hodnotu přistupují, a změna limitu směrem dolů může být žádoucí. Stejné obecné techniky, které se používají pro kód v uživatelském režimu ke snížení velikosti zásobníku, lze přizpůsobit kódu v režimu jádra.
Název analýzy kódu: EXCESSIVESTACKUSAGE
Úprava velikosti zásobníku pro potlačení upozornění
Možnost příkazového /analyze:stacksize
řádku můžete použít ke změně hodnoty pro constant_2, ale zvýšením je riziko, že chyba nemusí být hlášena.
Potlačení upozornění na příkazovém řádku
/analyze:stacksize <new-size>
Přidejte možnost do příkazového řádku kompilátoru. Použijte hodnotu,<new-size>
která je větší než constant_1. Pokud je například constant_1 27180, můžete zadat/analyze:stacksize 32768
.
Potlačení upozornění v integrovaném vývojovém prostředí (IDE)
V integrovaném vývojovém prostředí sady Visual Studio vyberte projekt v okně Průzkumník řešení.
Na řádku nabídek zvolte Vlastnosti projektu>.
V dialogovém okně Stránky vlastností vyberte stránku vlastností>vlastnosti C/C++>Příkazového řádku konfigurace.
V dalších možnostech přidejte
/analyze:stacksize <new-size>
, kde<new-size>
je větší než constant_1. Pokud je například constant_1 27180, můžete zadat/analyze:stacksize 32768
. Kliknutím na OK uložte provedené změny.
Příklad
Následující kód vygeneruje toto upozornění, protože char buffer
vyžaduje 16 382 bajtů v zásobníku a místní celočíselná proměnná i
vyžaduje další 4 bajty, které společně překračují 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 toto upozornění opraví 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, jako jsou nevracení paměti a výjimky. Pokud se chcete těmto druhům problémů s úniky a výjimkám vyhnout úplně, použijte mechanismy, které poskytuje standardní knihovna C++ (STL). Patří mezi ně shared_ptr
, unique_ptr
a vector
. Další informace naleznete v tématu Inteligentní ukazatele a standardní knihovna jazyka C++.
Viz také
/STACK
(Přidělení zásobníku)
_resetstkoflw
Postupy: Použití nativních kontrol za běhu