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.
| Propriedade | valor |
|---|---|
| ID da regra | CA2014 |
| Título | Não use stackalloc em ciclos |
| Categoria | Fiabilidade |
| A correção causa interrupção ou não | Ininterrupto |
| Habilitado por padrão no .NET 10 | Como aviso |
| Línguas aplicáveis | C# |
Motivo
Usando a expressão stackalloc do C# dentro de um ciclo.
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 num loop, pode levar a sobrecargas de pilha devido à saturação 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 alerta quando o ciclo ou ciclos 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 operações stackalloc seja 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.