Compartilhar via


CA2014: Não usar stackalloc em loops

Propriedade Valor
ID da regra CA2014
Título Não usar stackalloc em loops
Categoria Confiabilidade
Correção interruptiva ou sem interrupção Inquebrável
Habilitado por padrão no .NET 10 Como aviso
Idiomas aplicáveis C#

Causa

Usando a expressão stackalloc de C# dentro de um loop.

Descrição da regra

A expressão stackalloc de C# 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, ele poderá levar a estouros de pilha devido ao consumo da memória de pilha.

Como corrigir violações

Mova a expressão stackalloc 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 que contêm são invocados apenas um número finito de vezes, de modo que a quantidade geral de memória alocada em todas as operações stackalloc sabe-se que é relativamente pequena.

Suprimir um aviso

Para suprimir apenas uma violação, adicione diretivas de pré-processador ao arquivo de origem a fim de desabilitar e, em seguida, reabilitar 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 em um arquivo, uma pasta ou um projeto, defina a severidade como none no arquivo de configuração.

[*.{cs,vb}]
dotnet_diagnostic.CA2014.severity = none

Para desabilitar toda essa categoria de regras, defina a gravidade da categoria como none no arquivo de configuração.

[*.{cs,vb}]
dotnet_analyzer_diagnostic.category-Reliability.severity = none

Para obter mais informações, confira Como suprimir avisos de análise de código.

Confira também