Avertissement C6014

Fuite de mémoire « nom du pointeur ».

Cet avertissement indique que le pointeur spécifié pointe vers la mémoire allouée ou une autre ressource allouée qui n’a pas été libérée.

Notes

L’analyseur case activée pour cette condition uniquement lorsque l’annotation _Analysis_mode_(_Analysis_local_leak_checks_) SAL est spécifiée. Par défaut, cette annotation est spécifiée pour le code du mode noyau Windows (pilote). Pour plus d’informations sur les annotations SAL, consultez Utilisation des annotations SAL pour réduire les défauts de code C/C++.

Cet avertissement est signalé pour les fuites de mémoire et de ressources lorsque la ressource est généralement aliasée vers un autre emplacement. La mémoire est alias lorsqu’un pointeur vers la mémoire échappe à la fonction à l’aide d’une annotation de paramètre, d’une variable globale ou d’une _Out_ valeur de retour. Cet avertissement peut être signalé lors de la sortie de la fonction si l’argument est annoté que sa version est attendue.

L’analyse du code ne reconnaît pas l’implémentation réelle d’un allocateur de mémoire (impliquant l’arithmétique d’adresse) et ne reconnaît pas que la mémoire est allouée (bien que de nombreux wrappers soient reconnus). Dans ce cas, l’analyseur ne reconnaît pas que la mémoire a été allouée et émet cet avertissement. Pour supprimer le faux positif, utilisez une #pragma warning(disable: 6014) directive sur la ligne qui précède l’accolade ouvrante { du corps de la fonction.

Nom de l’analyse du code : MEMORY_LEAK

Exemples

Le code suivant génère l’avertissement C6014 :

// cl.exe /analyze /EHsc /nologo /W4
#include <sal.h>
#include <stdlib.h>
#include <string.h>

_Analysis_mode_(_Analysis_local_leak_checks_)

#define ARRAYSIZE 10
const int TEST_DATA [ARRAYSIZE] = {10,20,30,40,50,60,70,80,90,100};

void f( )
{
    int *p = (int *)malloc(sizeof(int)*ARRAYSIZE);
    if (p) {
        memcpy(p, TEST_DATA, sizeof(int)*ARRAYSIZE);
        // code ...
    }
}

int main( )
{
    f();
}

Le code suivant corrige l’avertissement en libérant la mémoire :

// cl.exe /analyze /EHsc /nologo /W4
#include <sal.h>
#include <stdlib.h>
#include <string.h>

_Analysis_mode_(_Analysis_local_leak_checks_)

#define ARRAYSIZE 10
const int TEST_DATA [ARRAYSIZE] = {10,20,30,40,50,60,70,80,90,100};

void f( )
{
    int *p = (int *)malloc(sizeof(int)*ARRAYSIZE);
    if (p) {
        memcpy(p, TEST_DATA, sizeof(int)*ARRAYSIZE);
        // code ...
        free(p);
    }
}

int main( )
{
    f();
}

Pour éviter ces types de fuites potentielles, utilisez les mécanismes fournis par la bibliothèque C++ Standard (STL). Ceux-ci incluent shared_ptr, unique_ptret des conteneurs tels que vector. Pour plus d’informations, consultez Les pointeurs intelligents et la bibliothèque standard C++.

// cl.exe /analyze /EHsc /nologo /W4
#include <sal.h>
#include <memory>

using namespace std;

_Analysis_mode_(_Analysis_local_leak_checks_)

const int ARRAYSIZE = 10;
const int TEST_DATA [ARRAYSIZE] = {10,20,30,40,50,60,70,80,90,100};

void f( )
{
    unique_ptr<int[]> p(new int[ARRAYSIZE]);
    std::copy(begin(TEST_DATA), end(TEST_DATA), p.get());

    // code ...

    // No need for free/delete; unique_ptr
    // cleans up when out of scope.
}

int main( )
{
    f();
}

Voir aussi

Avertissement C6211