Emballage malloc – C

Je suis un débutant en C. En lisant le code source de git, j’ai trouvé cette fonction d’emballage autour de malloc .

 void *xmalloc(size_t size) { void *ret = malloc(size); if (!ret && !size) ret = malloc(1); if (!ret) { release_pack_memory(size, -1); ret = malloc(size); if (!ret && !size) ret = malloc(1); if (!ret) die("Out of memory, malloc failed"); } #ifdef XMALLOC_POISON memset(ret, 0xA5, size); #endif return ret; } 

Des questions

  1. Je ne comprenais pas pourquoi ils utilisaient malloc(1) ?
  2. Que fait release_pack_memory et que je ne trouve pas cette implémentation de fonctions dans tout le code source.
  3. Que fait le #ifdef XMALLOC_POISON memset(ret, 0xA5, size); Est-ce que?

Je prévois de réutiliser cette fonction sur mon projet. Est-ce un bon emballage autour du malloc ?

Toute aide est la bienvenue.

  1. malloc (0) ne fonctionne pas sur toutes les plates-formes, auquel cas une allocation d’un octet est effectuée. Autoriser l’allocation de blocs de mémoire de longueur nulle simplifie la logique de niveau supérieur du programme.

  2. Je ne sais pas

  3. En remplissant la mémoire allouée avec une valeur non nulle, il est plus facile de trouver des bogues dans le programme où la mémoire est utilisée sans une initialisation appropriée: le programme plantera presque immédiatement dans de tels cas. Comme le remplissage de la mémoire prend du temps, il est encapsulé dans une définition de préprocesseur, de sorte qu’il ne soit compilé que lorsque vous le souhaitez.

Pour la question 2: release_pack_memory se trouve dans sha1_file.c: 570 .

Pour la question 1:

La norme ne définit pas le comportement de malloc(0) . Cela peut renvoyer un pointeur valide ou NULL. Différentes implémentations gèrent cela différemment, de sorte que le code revient à malloc(1) pour obtenir un comportement cohérent.

Pour la question 3:

Il définit le contenu du tampon sur “étrange”. De cette façon, il est à espérer que votre code ne repose pas sur des contenus spécifiques (ce que malloc ne garantit pas).

Je ne connais pas cette enveloppe mais voici ce que ça fait

1 – si size = 0 a été spécifié, il atsortingbue 1 octet à la place si le malloc sous-jacent ne l’a pas fait

ceci est vraisemblablement fait pour qu’un appelant puisse toujours le libérer (comme realloc)

2 Je suppose que c’est pour essayer de forcer le sous-système de mémoire sous-jacent à chercher plus de mémoire

3 oblige XMALLOC_POISON à mettre en tampon dans un état connu cette pratique est courante pour prévenir et détecter les bugs impairs causés par des données non initialisées.

Deuxièmement, pourquoi voulez-vous envelopper Malloc? Commencez par l’idée de ce que vous voulez faire, puis implémentez-le ou copiez-le. Raisons pour l’emballage malloc

  1. Detection des fuites
  2. parsing d’usage
  3. mise en commun de la mémoire
  4. débogage (comme le XMALLOC_POISON)
  5. vérification forcée

Presque tout cela peut être fait avec valgrind – ce qui fait beaucoup plus.

Le livre ‘écriture de code solide’ a un bon jeu de wrappers de mémoire pour 1,4 et 5