Udostępnij za pośrednictwem


CA2014: Nie używaj `stackalloc` w pętlach

Właściwości Wartość
Identyfikator reguły CA2014
Tytuł Nie używaj stackalloc w pętlach
Kategoria Niezawodność
Poprawka łamiąca lub nienaruszająca Niezgodność
Domyślnie włączone na platformie .NET 10 Jako ostrzeżenie
Zastosowane języki C#

Przyczyna

Używanie wyrażenia stackalloc języka C# wewnątrz pętli.

Opis reguły

Wyrażenie języka C# stackalloc przydziela pamięć z bieżącej ramki stosu, a ta pamięć może nie zostać zwolniona, dopóki bieżące wywołanie metody nie zostanie zakończone. Jeśli stackalloc jest używany w pętli, może to prowadzić do przepełnienia stosu przez wyczerpanie pamięci stosu.

Jak naprawić naruszenia

Przenieś wyrażenie stackalloc poza wszystkie pętle w metodzie.

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;

        // ...
    }
}

Kiedy pomijać ostrzeżenia

Ostrzeżenie można bezpiecznie zignorować, gdy pętla lub pętle, które je zawierają, są wywoływane tylko skończoną liczbę razy, co sprawia, że ​​ogólna ilość pamięci alokowanej we wszystkich operacjach stackalloc jest stosunkowo mała.

Pomijanie ostrzeżenia

Jeśli chcesz po prostu pominąć pojedyncze naruszenie, dodaj dyrektywy preprocesora do pliku źródłowego, aby wyłączyć, a następnie ponownie włączyć regułę.

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

Aby wyłączyć regułę dla pliku, folderu lub projektu, ustaw jego ważność na none w pliku konfiguracji.

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

Aby wyłączyć tę całą kategorię reguł, ustaw ważność dla kategorii na none w pliku konfiguracji.

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

Aby uzyskać więcej informacji, zobacz Jak pominąć ostrzeżenia dotyczące analizy kodu.

Zobacz też