Note
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
| Propriété | Value |
|---|---|
| Identificateur de la règle | CA2014 |
| Titre | Ne pas utiliser stackalloc dans les boucles |
| Catégorie | Fiabilité |
| Le correctif est cassant ou non cassant | Sans rupture |
| Activé par défaut dans .NET 10 | Comme avertissement |
Cause
Utilisation de l’expression stackalloc C# à l’intérieur d’une boucle.
Description de la règle
L’expression stackalloc C# alloue de la mémoire à partir de l’image de pile actuelle, et cette mémoire peut ne pas être libérée tant que l’appel de méthode actuel n’est pas retourné. Si stackalloc est utilisé dans une boucle, il peut entraîner des dépassements de pile en raison de l’épuisement de la mémoire de la pile.
Comment corriger les violations
Déplacez l’expression stackalloc en dehors de toutes les boucles de la méthode.
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;
// ...
}
}
Quand supprimer les avertissements
Vous pouvez sans risque supprimer l’avertissement lorsque la ou les boucles contenantes ne sont appelées qu’un nombre limité de fois, de sorte que la quantité globale de mémoire allouée entre toutes les opérations stackalloc est connue pour être relativement petite.
Supprimer un avertissement
Si vous voulez supprimer une seule violation, ajoutez des directives de préprocesseur à votre fichier source pour désactiver et réactiver la règle.
#pragma warning disable CA2014
// The code that's violating the rule is on this line.
#pragma warning restore CA2014
Pour désactiver la règle sur un fichier, un dossier ou un projet, définissez sa gravité sur none dans le fichier de configuration.
[*.{cs,vb}]
dotnet_diagnostic.CA2014.severity = none
Pour désactiver la catégorie entière des règles, définissez la gravité de la catégorie sur none dans le fichier de configuration.
[*.{cs,vb}]
dotnet_analyzer_diagnostic.category-Reliability.severity = none
Pour plus d’informations, consultez Comment supprimer les avertissements de l’analyse de code.