Lista SLL - warning w działającym kodzie
: sobota 05 kwie 2025, 16:12
Cześć, od kilku dni siedzę nad listą jednokierunkową i mam pewien problem dotyczący ostrzeżenia, które generowane jest przez środowisko Visual Studio. Najpierw przedstawię, o co mi chodzi:
Kod się kompiluje bez błędów i ostrzeżeń, a program działa poprawnie, czyli dynamicznie alokuje pamięć dla kolejnych węzłów, wyświetla ich listę, na koniec niszczy wszystkie węzły i uwalnia pamięć. W Visual Studio mam możliwość skorzystania z usługi Copilot, więc z niej skorzystałem i otrzymałem, co następuje:
Jak widać wywalony jest if sprawdzający, czy wskaźnik n nie jest pusty, ale to sprawdzenie i tak następuje podczas wejścia do pętli while. Tak czy siak nadal wyświetlane jest ostrzeżenie o tej samej treści i dotyczące tej samej zmiennej. Kod proponowany przez Copilot również działa poprawnie i kompiluje się bez ostrzeżeń. Ktoś ma jakieś pomysły, co z tym zrobić? Visual studio jest nadgorliwe?
Kod: Zaznacz cały
static void List_destroy(node_t** n)
{
node_t *temp = NULL;
#ifdef DEBUG
int cnt = 0;
#endif /* DEBUG */
if ((*n) != NULL)
{
do
{
temp = (*n)->next;// <--- C6001 Używanie niezainicjowanej pamięci „*temp”.
free((*n));
#ifdef DEBUG
printf("memory freed %d times\n", ++cnt);
#endif /* DEBUG */
*n = temp;
}while (*n != NULL);
}
}
Kod się kompiluje bez błędów i ostrzeżeń, a program działa poprawnie, czyli dynamicznie alokuje pamięć dla kolejnych węzłów, wyświetla ich listę, na koniec niszczy wszystkie węzły i uwalnia pamięć. W Visual Studio mam możliwość skorzystania z usługi Copilot, więc z niej skorzystałem i otrzymałem, co następuje:
Aby naprawić błąd C6001, musisz upewnić się, że zmienna temp jest zainicjowana przed jej użyciem. W tym przypadku, problem polega na tym, że temp jest używana przed przypisaniem do niej wartości. Możesz to naprawić, inicjując temp przed zwolnieniem pamięci. Oto poprawiona wersja funkcji List_destroy:Kod: Zaznacz cały
static void List_destroy(node_t** n)
{
node_t *temp = NULL;
#ifdef DEBUG
int cnt = 0;
#endif /* DEBUG */
while (*n != NULL)
{
temp = (*n)->next; // Zainicjuj temp przed zwolnieniem pamięci <--- tutaj nadal mam to samo ostrzeżenie
free(*n);
#ifdef DEBUG
printf("memory freed %d times\n", ++cnt);
#endif /* DEBUG */
*n = temp;
}
}
Jak widać wywalony jest if sprawdzający, czy wskaźnik n nie jest pusty, ale to sprawdzenie i tak następuje podczas wejścia do pętli while. Tak czy siak nadal wyświetlane jest ostrzeżenie o tej samej treści i dotyczące tej samej zmiennej. Kod proponowany przez Copilot również działa poprawnie i kompiluje się bez ostrzeżeń. Ktoś ma jakieś pomysły, co z tym zrobić? Visual studio jest nadgorliwe?