Compartilhar via


C6014

C6014 de aviso: Memória de escape.

Esse aviso indica que os pontos especificados do ponteiro de memória alocada ou qualquer outro recurso alocado que não foi liberado.O analisador verifica essa condição somente quando a anotação SAL _Analysis_mode_(_Analysis_local_leak_checks_) é especificada.Por padrão, a anotação é especificada para o código de modo de kernel do Windows (driver).Para obter mais informações sobre anotações SAL, consulte Usando anotações de SAL para reduzir defeitos de código do C/C++.

Exemplo

O código a seguir gera este aviso:

// 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();
}
 

O código a seguir corrige o aviso liberando memória:

// 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();
}

Esse aviso é relatado de vazamento de memória e de recursos quando o recurso alias em geral para outro local.A memória alias quando um ponteiro para memória ignora a função por meio de uma anotação de parâmetro de _Out_ , variável global, ou um valor de retorno.Esse aviso pode ser relatado na saída da função se o argumento for anotado como sendo esperado que seja liberado.

Observe que a análise de código não reconhecerá a implementação real de um alocador de memória (que envolve a aritmética de endereço) e não reconhecerá que a memória é atribuída (embora muitos wrappers serão reconhecidos).Nesse caso, o analisador não reconhece que a memória alocada esteve e não executará esse aviso.Para suprimir falsos positivos, use uma política de #pragma na linha que precede a chave de abertura { do corpo da função.

Para evitar completamente esses tipos de possíveis vazamentos, use os mecanismos que são fornecidos pela biblioteca padrão (STL) do modelo C++.Incluem shared_ptr, unique_ptr e vector.Para obter mais informações, consulte Ponteiros inteligentes (C++ moderno) e Referência da Biblioteca Padrão 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();
}
 

Consulte também

Referência

C6211