Partilhar via


CA2014: Não use stackalloc em loops

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.

Consulte também