Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
| 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.