Avertissement C28197

Éventuellement fuite de mémoire

Cet avertissement est signalé pour les fuites de mémoire et de ressources lorsque la ressource est potentiellement alias vers un autre emplacement.

Le pointeur pointe vers la mémoire allouée ou vers une autre ressource allouée qui n’a pas été libérée explicitement. Cet avertissement est généralement dû à des annotations insuffisantes sur la fonction appelée, bien que les annotations insuffisantes sur la fonction appelante puissent également rendre cet avertissement plus probable.

Cet avertissement peut être signalé lors de la sortie de la fonction si un argument d’entrée a une annotation ou __drv_aliasesMem une __drv_freesMem annotation. Cet avertissement indique généralement une fuite valide ou qu’une fonction appelée par la fonction actuelle a besoin d’une annotation supplémentaire.

En particulier, l’absence des annotations et _Out_ de base _In_ rendent cet avertissement assez probable, bien que les annotations et __drv_freesMem les __drv_aliasesMem annotations puissent également être nécessaires. Un faux positif est probablement le résultat d’une annotation manquante _In_ .

Les fonctions qui prennent un pointeur et l’alias (évitant ainsi une fuite) doivent être annotées avec __drv_aliasesMem. Si vous créez une fonction qui insère un objet dans une structure globale ou que vous la transmettez à une fonction système qui le fait, vous devez ajouter l’annotation __drv_aliasesMem .

Fonctions qui libèrent de la mémoire doivent être annotées avec __drv_freesMem. Les principales fonctions qui libèrent de la mémoire ont déjà cette annotation.

Exemple

L'exemple de code suivant génère cet avertissement :

char *p = (char *)malloc(10);
test(p);   // does not save a copy of p

L'exemple de code suivant évite cet avertissement :

char *p = (char *)malloc(10);
test(p);   // does not save a copy of p
free(p);