Udostępnij za pośrednictwem


C6308

Ostrzeżenie C6308: "realloc" może zwrócić wskaźnik o wartości null: przypisywanie wskaźnika o wartości null do <variable>, który jest przekazywany jako argument do "realloc", spowoduje wyciek oryginalnego bloku pamięci

To ostrzeżenie wskazuje przeciek pamięci, który jest wynikiem niepoprawnego użycia funkcji ponownej alokacji.Funkcje ponownej alokacji sterty nie zwalniają przekazannego buforu, jeśli ponowny przydział nie powiedzie się.Aby poprawić wadę, należy przypisać tymczasowy wynik funkcji ponownego przydziału, a następnie zastąpić pierwotny wskaźnik po pomyślnym ponownym przydzieleniu.

Przykład

Poniższy przykładowy kod generuje to ostrzeżenie:

#include <malloc.h>
#include <windows.h>

void f( )
{
  char *x;
  x = (char *) malloc(10);
  if (x != NULL)
  {
    x = (char *) realloc(x, 512);
    // code...
    free(x);
  }   
}

Aby poprawić to ostrzeżenie, należy użyć następującego kodu:

#include <malloc.h>
#include <windows.h>

void f()
{
  char *x, *tmp;

  x = (char *) malloc(10);

  if (x != NULL)
  {
    tmp = (char *) realloc(x,512);
    if (tmp != NULL) 
    {
      x = tmp;
    }
    free(x);
  }
}

Ostrzeżenie to może wytworzyć wiele hałasu, jeśli istnieje aktywny alias bufora do ponownego zaalokowania w momencie przypisania wyniku funkcji ponownej alokacji.