Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
| Property | Värde | 
|---|---|
| Regel-ID | CA2014 | 
| Title | Använd inte stackalloc i loopar | 
| Kategori | Tillförlitlighet | 
| Korrigeringen är icke-bakåtkompatibel | Icke-icke-bryta | 
| Aktiverad som standard i .NET 9 | Som varning | 
Orsak
Använda C# -stackalloc-uttrycket i en loop.
Regelbeskrivning
C#- stackalloc uttrycket allokerar minne från den aktuella stackramen och det minnet kanske inte frigörs förrän det aktuella metodanropet returnerar. Om stackalloc används i en loop kan det leda till stackspill på grund av uttömning av stackminnet.
Så här åtgärdar du överträdelser
Flytta uttrycket stackalloc utanför alla loopar i metoden.
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;
        // ...
    }
}
När du ska ignorera varningar
Det kan vara säkert att ignorera varningen när den innehållande loopen eller looparna endast anropas ett begränsat antal gånger, så att den totala mängden minne som allokeras över alla stackalloc åtgärder är känd för att vara relativt liten.
Ignorera en varning
Om du bara vill förhindra en enda överträdelse lägger du till förprocessordirektiv i källfilen för att inaktivera och aktiverar sedan regeln igen.
#pragma warning disable CA2014
// The code that's violating the rule is on this line.
#pragma warning restore CA2014
Om du vill inaktivera regeln för en fil, mapp eller ett projekt anger du dess allvarlighetsgrad till none i konfigurationsfilen.
[*.{cs,vb}]
dotnet_diagnostic.CA2014.severity = none
Om du vill inaktivera hela den här regelkategorin anger du allvarlighetsgraden för kategorin till none i konfigurationsfilen.
[*.{cs,vb}]
dotnet_analyzer_diagnostic.category-Reliability.severity = none
Mer information finns i Så här utelämnar du kodanalysvarningar.