Freigeben über


Warnung C6262

Funktion verwendet constant_1 Bytes von Stapel: überschreitet /analyze:stacksize constant_2. Verschieben Sie einige Daten auf den Heap.

Hinweise

Diese Warnung gibt an, dass die Stapelnutzung, die einen voreingestellten Schwellenwert (constant_2) überschreitet, in einer Funktion erkannt wurde. Die Standardstapelrahmengröße für diese Warnung ist 16 KB für Benutzermodus, 1 KB für Kernelmodus. Für den Stapel gilt sogar im Benutzermodus eine Beschränkung, ein Fehler beim Übertragen einer Stapelseite führt zu einer Stapelüberlaufausnahme. Der Kernelmodus hat eine Größenbeschränkung von 12 KB, die nicht erhöht werden kann. Versuchen Sie, die Stapelverwendung im Kernelmoduscode aggressiv einzuschränken.

Um das Problem zu korrigieren, können Sie einige Daten auf den Heap oder auf anderen dynamischen Arbeitsspeicher verschieben. Im Benutzermodus ist ein großer Stapelrahmen wahrscheinlich kein Problem (die Warnung kann sogar unterdrückt werden), aber ein großer Stapelrahmen birgt das Risiko eines Stapelüberlaufs. (Ein großer Stapelrahmen kann auftreten, wenn die Funktion den Stapel stark verwendet oder rekursiv ist.) Die Gesamtstapelgröße im Benutzermodus kann erhöht werden, wenn der Stapelüberlauf tatsächlich erfolgt, aber nur bis zum Systemlimit.

Für Kernelmoduscode , z. B. in Treiberprojekten, wird der Wert von constant_2 auf 1 KB festgelegt. Gut geschriebene Treiber sollten nur wenige Funktionen haben, die sich diesem Wert nähern, und das Ändern des Grenzwerts nach unten kann wünschenswert sein. Die gleichen allgemeinen Techniken, die in Benutzermoduscode zum Reduzieren der Stapelgröße verwendet werden, können für den Kernelmoduscode angepasst werden.

Codeanalysename: EXCESSIVESTACKUSAGE

Passen Sie die Stapelgröße an, um die Warnung zu unterdrücken.

Sie können die /analyze:stacksize Befehlszeilenoption verwenden, um den Wert für constant_2 zu ändern, aber die Erhöhung führt zu einem Risiko, dass ein Fehler möglicherweise nicht gemeldet wird.

So unterdrücken Sie die Warnung in der Befehlszeile

  • Fügen Sie der Compiler-Befehlszeile die /analyze:stacksize <new-size> Option hinzu. Verwenden Sie einen Wert, der <new-size> größer als constant_1 ist. Wenn constant_1 beispielsweise 27180 ist, können Sie eingeben /analyze:stacksize 32768.

So unterdrücken Sie die Warnung in der IDE

  1. Wählen Sie in der Visual Studio-IDE das Projekt im fenster Projektmappen-Explorer aus.

  2. Klicken Sie in der Menüleiste auf Projekt>Eigenschaften.

  3. Wählen Sie im Dialogfeld Eigenschaftenseiten die Eigenschaftenseite "Konfigurationseigenschaften>C/C++>" aus.

  4. Fügen Sie in zusätzlichen Optionen hinzu /analyze:stacksize <new-size>, wobei <new-size> größer als constant_1 ist. Wenn constant_1 beispielsweise 27180 ist, können Sie eingeben /analyze:stacksize 32768. Klicken Sie auf OK, um die Änderungen zu speichern.

Beispiel

Der folgende Code generiert diese Warnung, da char buffer 16.382 Bytes auf dem Stapel erforderlich sind, und die lokale Ganzzahlvariable i erfordert weitere 4 Byte, die zusammen die Standardgröße der Stapelgröße von 16 KB überschreiten.

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

Im folgenden Code wird diese Warnung korrigiert, indem einige Daten auf den Heap verschoben werden.

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

Die Verwendung von malloc und free hat viele Fallstricke, z. B. Speicherverluste und Ausnahmen. Um diese Arten von Lecks und Ausnahmeproblemen vollständig zu vermeiden, verwenden Sie die Mechanismen, die von der C++-Standardbibliothek (STL) bereitgestellt werden. Dazu zählen shared_ptr , unique_ptr und vector . Weitere Informationen finden Sie unter Smart Pointers and C++ Standard Library.

Siehe auch

/STACK (Stapelzuordnungen)
_resetstkoflw
How to: Use native run-time checks (Vorgehensweise: Verwenden von nativen Laufzeitüberprüfungen)