Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
| Vlastnost | Hodnota |
|---|---|
| ID pravidla | CA2014 |
| Název | Nepoužívat stackalloc ve smyčkách |
| Kategorie | Spolehlivost |
| Oprava způsobující chybu nebo chybu způsobující chybu | Nenarušující |
| Povoleno ve výchozím nastavení v .NET 10 | Jako upozornění |
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 stackalloc se 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í
stackalloc Přesuňte výraz 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 při vyvolání smyčky nebo smyček obsahující pouze konečný počet, aby bylo známo, že celkové množství paměti přidělené napříč všemi stackalloc operacemi 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.