Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
| Proprietà | valore |
|---|---|
| ID regola | CA2014 |
| Title | Non usare stackalloc nei cicli |
| Categoria | Affidabilità |
| La correzione causa un'interruzione o meno | Non causa un'interruzione |
| Abilitato per impostazione predefinita in .NET 10 | Come avviso |
Causa
Uso dell'espressione stackalloc C# all'interno di un ciclo.
Descrizione regola
L'espressione C# stackalloc alloca la memoria dal frame dello stack corrente e tale memoria potrebbe non essere rilasciata fino a quando non viene restituita la chiamata al metodo corrente. Se stackalloc viene usato in un ciclo, può causare overflow dello stack a causa dell'esaurimento della memoria dello stack.
Come correggere le violazioni
Spostare l'espressione all'esterno stackalloc di tutti i cicli nel metodo .
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;
// ...
}
}
Quando eliminare gli avvisi
Può essere sicuro eliminare l'avviso quando il ciclo o i cicli contenitore vengono richiamati solo un numero finito di volte, in modo che la quantità complessiva di memoria allocata in tutte le stackalloc operazioni sia relativamente piccola.
Eliminare un avviso
Se si vuole eliminare una singola violazione, aggiungere direttive del preprocessore al file di origine per disabilitare e quindi riabilitare la regola.
#pragma warning disable CA2014
// The code that's violating the rule is on this line.
#pragma warning restore CA2014
Per disabilitare la regola per un file, una cartella o un progetto, impostarne la gravità none su nel file di configurazione.
[*.{cs,vb}]
dotnet_diagnostic.CA2014.severity = none
Per disabilitare questa intera categoria di regole, impostare la gravità per la categoria su none nel file di configurazione.
[*.{cs,vb}]
dotnet_analyzer_diagnostic.category-Reliability.severity = none
Per altre informazioni, vedere Come eliminare gli avvisi di analisi del codice.