Avertissement C6263
Utilisation de _alloca dans une boucle ; cela peut rapidement dépasser la pile
Notes
Cet avertissement indique que l’appel _alloca
à l’intérieur d’une boucle pour allouer de la mémoire peut entraîner un dépassement de capacité de pile. _alloca
alloue de la mémoire de la pile, mais cette mémoire est libérée uniquement lorsque la fonction appelante se ferme. La pile, même en mode utilisateur, est limitée et l’échec de validation d’une page de pile provoque une exception de dépassement de capacité de pile. La fonction _resetstkoflw
récupère d’une condition de dépassement de capacité de la pile, ce qui permet à un programme de poursuivre son exécution au lieu d’échouer avec une erreur d’exception fatale. Si la _resetstkoflw
fonction n’est pas appelée, il n’existe aucune page de garde après l’exception précédente. La prochaine fois qu’il y a un dépassement de capacité de pile, il n’y a aucune exception du tout et le processus se termine sans avertissement.
Vous devez éviter d’appeler _alloca
à l’intérieur d’une boucle si la taille d’allocation ou le nombre d’itérations est inconnu, car cela peut entraîner un dépassement de capacité de pile. Dans ces cas, envisagez d’autres options telles que la mémoire du tas ou les classes de bibliothèque standard C++.
Nom de l’analyse du code : USINGALLOCAINLOOP
Exemple
Le code suivant génère cet avertissement :
#include <windows.h>
#include <malloc.h>
#include <excpt.h>
#include <stdio.h>
#define MAX_SIZE 50
void f ( int size )
{
char* cArray;
__try
{
for(int i = 0; i < MAX_SIZE; i++)
{
cArray = (char *)_alloca(size);
// process cArray...
}
}
__except(GetExceptionCode() == STATUS_STACK_OVERFLOW ?
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH )
{
// code...
puts("Allocation Failed");
_resetstkoflw();
}
}
Le code suivant utilise malloc( ) pour corriger cet avertissement :
#include <windows.h>
#define MAX_SIZE 50
void f ( int size )
{
char* cArray;
for(int i = 0; i < MAX_SIZE; i++)
{
cArray = (char *) malloc(size);
if (cArray != NULL)
{
// process cArray...
free(cArray);
}
}
}
Voir aussi
Commentaires
https://aka.ms/ContentUserFeedback.
Bientôt disponible : Tout au long de 2024, nous allons supprimer progressivement GitHub Issues comme mécanisme de commentaires pour le contenu et le remplacer par un nouveau système de commentaires. Pour plus d’informations, consultezEnvoyer et afficher des commentaires pour