Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
| Propiedad | Value |
|---|---|
| Identificador de la regla | CA2014 |
| Título | No usar stackalloc en los bucles |
| Categoría | Confiabilidad |
| La corrección es problemática o no problemática | Poco problemático |
| Habilitado de forma predeterminada en .NET 10 | Como advertencia |
Causa
Se ha usado la expresión stackalloc de C# dentro de un bucle.
Descripción de la regla
La expresión de C# stackalloc asigna memoria del marco de pila actual y puede que no se libere hasta que vuelva la llamada de método actual. Si se usa stackalloc en un bucle, puede provocar desbordamientos de pila debido al agotamiento de la memoria de la pila.
Cómo corregir infracciones
Mueva la expresión stackalloc fuera de todos los bucles del 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;
// ...
}
}
Cuándo suprimir las advertencias
Puede ser seguro suprimir la advertencia cuando el bucle o bucles contenedores se invocan solo un número finito de veces, de modo que se sabe que la cantidad total de memoria asignada en todas las operaciones stackalloc es relativamente pequeña.
Supresión de una advertencia
Si solo quiere suprimir una única infracción, agregue directivas de preprocesador al archivo de origen para deshabilitar y volver a habilitar la regla.
#pragma warning disable CA2014
// The code that's violating the rule is on this line.
#pragma warning restore CA2014
Para deshabilitar la regla de un archivo, una carpeta o un proyecto, establezca su gravedad en none del archivo de configuración.
[*.{cs,vb}]
dotnet_diagnostic.CA2014.severity = none
Para deshabilitar toda esta categoría de reglas, establezca la gravedad de la categoría en none del archivo de configuración.
[*.{cs,vb}]
dotnet_analyzer_diagnostic.category-Reliability.severity = none
Para obtener más información, consulte Procedimiento para suprimir advertencias de análisis de código.