Correction gratuite de l'erreur de pointeur invalide en C

Jinku Hu 12 octobre 2023
  1. Ne pas free les pointeurs qui pointent vers des emplacements mémoire non dynamiques
  2. Ne libérez pas les pointeurs qui ont déjà été libérés
Correction gratuite de l'erreur de pointeur invalide en C

Cet article présente plusieurs méthodes pour corriger l’erreur de pointeur invalide free en C.

Ne pas free les pointeurs qui pointent vers des emplacements mémoire non dynamiques

L’appel de fonction free ne doit être utilisé que pour désallouer la mémoire des pointeurs qui ont été renvoyés par les fonctions malloc, calloc ou realloc. Le code suivant montre le scénario dans lequel le pointeur char * se voit attribuer une valeur retournée par l’appel malloc, mais plus tard dans le bloc else, le même pointeur est réaffecté avec une chaîne de caractères littérale. Cela signifie que la variable c_str pointe vers l’emplacement qui n’est pas une région de mémoire dynamique ; ainsi, elle n’est pas autorisée à être passée à la fonction free. En conséquence, lorsque l’exemple suivant est exécuté, et que le programme atteint l’appel de la fonction free, il est interrompu, et free() : invalid pointer error est affiché.

Notez qu’il ne faut pas réassigner les pointeurs à des emplacements mémoire dynamiques avec des adresses différentes, à moins qu’il n’y ait d’autres variables de pointeur qui pointent encore à l’emplacement d’origine. Enfin, vous ne devez appeler la fonction free que sur les pointeurs qui pointent vers la mémoire de tas.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, const char *argv[]) {
  char *c_str = NULL;
  size_t len;

  if (argc != 2) {
    printf("Usage: ./program string\n");
    exit(EXIT_FAILURE);
  }

  if ((len = strlen(argv[1])) >= 4) {
    c_str = (char *)malloc(len);

    if (!c_str) {
      perror("malloc");
    }

    strcpy(c_str, argv[1]);
    printf("%s\n", c_str);
  } else {
    c_str = "Some Literal String";
    printf("%s\n", c_str);
  }
  free(c_str);

  exit(EXIT_SUCCESS);
}

Ne libérez pas les pointeurs qui ont déjà été libérés

Une autre erreur courante lors de l’utilisation de la mémoire dynamique est d’appeler la fonction free sur les pointeurs qui ont déjà été libérés. Ce scénario est le plus probable lorsqu’il y a plusieurs variables de pointeurs pointant vers la même région de mémoire dynamique. L’exemple de code suivant illustre un de ces cas possibles, où le même emplacement est libéré dans différentes portées.

Notez que cet exemple est un programme court à fichier unique, et il sera facile de diagnostiquer un problème comme celui-ci, mais dans les bases de code plus importantes, il pourrait être difficile de suivre la source sans programmes d’inspection externes qui font une analyse statique.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, const char *argv[]) {
  char *c_str = NULL;
  size_t len;

  if (argc != 2) {
    printf("Usage: ./program string\n");
    exit(EXIT_FAILURE);
  }
  char *s = NULL;

  if ((len = strlen(argv[1])) >= 4) {
    c_str = (char *)malloc(len);
    s = c_str;

    if (!c_str) {
      perror("malloc");
    }

    strcpy(c_str, argv[1]);
    printf("%s\n", c_str);
    free(c_str);
  } else {
    c_str = "Some Literal String";
    printf("%s\n", c_str);
  }
  free(s);

  exit(EXIT_SUCCESS);
}
Auteur: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Article connexe - C Pointer