HOWTO · C

Correction gratuite de l'erreur de pointeur invalide en C

Cet article présente la manière de corriger gratuitement une erreur de pointeur non valide dans 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);
}