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