Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
| Property | valor |
|---|---|
| ID da regra | CA2014 |
| Título | Não use stackalloc em loops |
| Categoria | Fiabilidade |
| A correção está quebrando ou não quebrando | Sem quebra |
| Habilitado por padrão no .NET 10 | Como aviso |
Motivo
Usando a expressão stackalloc C# dentro de um loop.
Descrição da regra
A expressão C# stackalloc aloca memória do quadro de pilha atual, e essa memória pode não ser liberada até que a chamada do método atual retorne. Se stackalloc for usado em um loop, pode levar a estouros de pilha devido ao esgotamento da memória da pilha.
Como corrigir violações
Mova a stackalloc expressão para fora de todos os loops no método.
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 suprimir avisos
Pode ser seguro suprimir o aviso quando o loop ou loops de contenção são invocados apenas um número finito de vezes, de modo que a quantidade total de memória alocada em todas as stackalloc operações é conhecida por ser relativamente pequena.
Suprimir um aviso
Se você quiser apenas suprimir uma única violação, adicione diretivas de pré-processador ao seu arquivo de origem para desativar e, em seguida, reativar a regra.
#pragma warning disable CA2014
// The code that's violating the rule is on this line.
#pragma warning restore CA2014
Para desabilitar a regra de um arquivo, pasta ou projeto, defina sua gravidade como none no arquivo de configuração.
[*.{cs,vb}]
dotnet_diagnostic.CA2014.severity = none
Para desativar toda essa categoria de regras, defina a severidade da categoria como none no arquivo de configuração.
[*.{cs,vb}]
dotnet_analyzer_diagnostic.category-Reliability.severity = none
Para obter mais informações, consulte Como suprimir avisos de análise de código.