Bonjour,

voilà j'ai fait un gestionnaire pour sécuriser les allocations dynamiques (les fonctione commencent pas le préfixe sma_) :
  • Vérification du retour de malloc
  • Test si le pointeur passé à sma_free à bien été alloué par sma_malloc ou enregistré
  • Test des débordement
  • Vérification des fuites


Voici un p'tit exemple :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <stdio.h>
#include <stdlib.h>
#include "include/sma.h"
 
int main(void)
{
  char *p[3] = { NULL };
 
/* Initialisation */
  sma_init (NULL);
/* Allocation */
  p[1] = sma_malloc (10 * sizeof (*p[1]));
/* Ecriture en dehors de la zone allouee */
  p[1][10] = 1;
  p[1][-1] = 1;
/* Reallocation */
  p[1] = sma_realloc (p[1], 20);
/* Enregistrement d'une allocation externe */
  p[2] = malloc (3);
  sma_register (p[2]);
/* Affiche l'etat du gestionnaire */
  sma_profil ();
  p[1]++;
/* Liberation */
  sma_free (p[1]);
  sma_free (p[2]);
/* Verification des fuites memoires */
  sma_end ();
  return 0;
}
Résultat :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
===== malloc (10) dans src\main.c:11 =====
        + 10 octects a 003D2434
 
===== realloc (p[1], 20) dans src\main.c:15 =====
        Warning : Underflow a 003D2434[-1]
        Warning : Overflow  a 003D2434[10]
        - 10 octects a 003D2434 dans src\main.c:11
        + 20 octects dans 003D249C
 
===== Allocation externe "p[2]" dans src\main.c:18 =====
        003D3B38
 
|----------------------------------------------------------------|
|                        Profile memoire                         |
|                                              src\main.c     19 |
|----------------------------------------------------------------|
| | Taille |   Addr    |  Ligne |  Fichier                       |
|----------------------------------------------------------------|
| |     20 | 003D249C |     15 |                     src\main.c |
|*|      0 | 003D3B38 |     18 |                     src\main.c |
|----------------------------------------------------------------|
 
===== free (p[1]) dans src\main.c:21 =====
        Warning : Pointeur non enregistre 003D249D
 
===== free (p[2]) dans src\main.c:22 =====
        - 0 octects a 003D3B38 alloue dans src\main.c:18
 
===== Fuites memoire =====
|----------------------------------------------------------------|
|                        Profile memoire                         |
|                                              src\main.c     23 |
|----------------------------------------------------------------|
| | Taille |   Addr    |  Ligne |  Fichier                       |
|----------------------------------------------------------------|
| |     20 | 003D249C |     15 |                     src\main.c |
|----------------------------------------------------------------|
 
Free 003D2498
Fuites reparees
J'espère que cela vous sera utile et si vous avez des remarques (amélioration, bug...), postez le tout à la suite

Disponible via subversion : http://subversion.developpez.com/pro...1/C/sma/trunk/