Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
| Eigenschaft | Wert |
|---|---|
| Regel-ID | CA2014 |
| Titel | Verwenden Sie stackalloc nicht in Schleifen. |
| Kategorie | Zuverlässigkeit |
| Fix führt zu Unterbrechungen oder bleibt funktionsfähig | Untrennbar |
| Standardmäßig in .NET 10 aktiviert | Als Warnung |
| Anwendbare Sprachen | C# |
Ursache
Verwenden des C# stackalloc-Ausdrucks in einer Schleife.
Regelbeschreibung
Der C# stackalloc-Ausdruck ordnet Speicher aus dem aktuellen Stack-Frame zu, und dieser Speicher kann erst freigegeben werden, wenn der aktuelle Methodenaufruf beendet ist. Wenn stackalloc in einer Schleife verwendet wird, kann dies zu Stapelüberläufen führen, weil der Stapelspeicher erschöpft ist.
So beheben Sie Verstöße
Verschieben Sie den stackalloc-Ausdruck außerhalb aller Schleifen in der Methode.
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;
// ...
}
}
Wann sollten Warnungen unterdrückt werden?
Es ist möglicherweise sicher, die Warnung zu unterdrücken, wenn die enthaltene(n) Schleife(n) nur eine begrenzte Anzahl von Malen aufgerufen wird/werden, sodass die Gesamtmenge des Arbeitsspeichers, der aller stackalloc-Operationen zugeordnet ist, relativ klein ist.
Unterdrücken einer Warnung
Um nur eine einzelne Verletzung zu unterdrücken, fügen Sie der Quelldatei Präprozessoranweisungen hinzu, um die Regel zu deaktivieren und dann wieder zu aktivieren.
#pragma warning disable CA2014
// The code that's violating the rule is on this line.
#pragma warning restore CA2014
Um die Regel für eine Datei, einen Ordner oder ein Projekt zu deaktivieren, legen Sie den Schweregrad auf none in der Konfigurationsdatei fest.
[*.{cs,vb}]
dotnet_diagnostic.CA2014.severity = none
Um diese gesamte Kategorie von Regeln zu deaktivieren, legen Sie den Schweregrad für die Kategorie auf none in der Konfigurationsdatei fest.
[*.{cs,vb}]
dotnet_analyzer_diagnostic.category-Reliability.severity = none
Weitere Informationen finden Sie unter Vorgehensweise: Unterdrücken von Codeanalyse-Warnungen.