Sdílet prostřednictvím


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)

  1. V integrovaném vývojovém prostředí sady Visual Studio vyberte projekt v okně Průzkumník řešení.

  2. Na řádku nabídek zvolte Vlastnosti projektu>.

  3. V dialogovém okně Stránky vlastností vyberte stránku vlastností>vlastnosti C/C++>Příkazového řádku konfigurace.

  4. 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_ptra 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