Freigeben über


CA2014: Verwenden Sie stackalloc nicht in Schleifen.

Eigenschaft Wert
Regel-ID CA2014
Titel Verwenden Sie stackalloc nicht in Schleifen.
Kategorie Zuverlässigkeit
Fix führt zu Unterbrechungen oder bleibt funktionsfähig Untrennbar
Standardmäßig in .NET 10 aktiviert Als Warnung
Anwendbare Sprachen C#

Ursache

Verwenden des C# stackalloc-Ausdrucks in einer Schleife.

Regelbeschreibung

Der C# stackalloc-Ausdruck ordnet Speicher aus dem aktuellen Stack-Frame zu, und dieser Speicher kann erst freigegeben werden, wenn der aktuelle Methodenaufruf beendet ist. Wenn stackalloc in einer Schleife verwendet wird, kann dies zu Stapelüberläufen führen, weil der Stapelspeicher erschöpft ist.

So beheben Sie Verstöße

Verschieben Sie den stackalloc-Ausdruck außerhalb aller Schleifen in der Methode.

Example

// This method violates the rule.
public void ProcessDataBad()
{
    for (int i = 0; i < 100; i++)
    {
        // CA2014: Potential stack overflow.
        // Move the stackalloc out of the loop.
        Span<int> buffer = stackalloc int[100];
        buffer[0] = i;

        // ...
    }
}

// This method satisfies the rule.
public void ProcessDataGood()
{
    Span<int> buffer = stackalloc int[100];

    for (int i = 0; i < 100; i++)
    {
        buffer[0] = i;

        // ...
    }
}

Wann sollten Warnungen unterdrückt werden?

Es ist möglicherweise sicher, die Warnung zu unterdrücken, wenn die enthaltene(n) Schleife(n) nur eine begrenzte Anzahl von Malen aufgerufen wird/werden, sodass die Gesamtmenge des Arbeitsspeichers, der aller stackalloc-Operationen zugeordnet ist, relativ klein ist.

Unterdrücken einer Warnung

Um nur eine einzelne Verletzung zu unterdrücken, fügen Sie der Quelldatei Präprozessoranweisungen hinzu, um die Regel zu deaktivieren und dann wieder zu aktivieren.

#pragma warning disable CA2014
// The code that's violating the rule is on this line.
#pragma warning restore CA2014

Um die Regel für eine Datei, einen Ordner oder ein Projekt zu deaktivieren, legen Sie den Schweregrad auf none in der Konfigurationsdatei fest.

[*.{cs,vb}]
dotnet_diagnostic.CA2014.severity = none

Um diese gesamte Kategorie von Regeln zu deaktivieren, legen Sie den Schweregrad für die Kategorie auf none in der Konfigurationsdatei fest.

[*.{cs,vb}]
dotnet_analyzer_diagnostic.category-Reliability.severity = none

Weitere Informationen finden Sie unter Vorgehensweise: Unterdrücken von Codeanalyse-Warnungen.

Siehe auch