CA2014: Nepoužívejte stackalloc v cyklech

Vlastnost Hodnota
ID pravidla CA2014
Název Nepoužívejte stackalloc ve smyčkách
Kategorie Spolehlivost
Oprava, která může být destruktivní nebo nedestruktivní Nezlomitelný
Povoleno ve výchozím nastavení v .NET 10 Jako upozornění
Příslušné jazyky jazyk C#

Příčina

Použití výrazu stackalloc v jazyce C# uvnitř smyčky

Popis pravidla

Výraz jazyka C# stackalloc přiděluje paměť z aktuálního rámce zásobníku a tato paměť se nemusí uvolnit, dokud se volání aktuální metody nevrátí. Pokud se stackalloc používá ve smyčce, může to vést k přetečení zásobníku kvůli vyčerpání paměti zásobníku.

Jak opravit porušení

Přesuňte výraz stackalloc mimo všechny smyčky v metodě.

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;

        // ...
    }
}

Kdy potlačit upozornění

Upozornění může být bezpečné potlačit, pokud jsou smyčka nebo smyčky vyvolány pouze konečný počet krát, takže je známo, že celkové množství paměti přidělené ve všech operacích stackalloc je poměrně malé.

Potlačení upozornění

Pokud chcete pouze potlačit jedno porušení, přidejte do zdrojového souboru direktivy preprocesoru, abyste pravidlo zakázali a znovu povolili.

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

Pokud chcete pravidlo pro soubor, složku nebo projekt zakázat, nastavte jeho závažnost v none konfiguračním souboru.

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

Chcete-li tuto celou kategorii pravidel zakázat, nastavte závažnost kategorie na none hodnotu v konfiguračním souboru.

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

Další informace naleznete v tématu Jak potlačit upozornění analýzy kódu.

Viz také