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 :
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 #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; }
J'espère que cela vous sera utile et si vous avez des remarques (amélioration, bug...), postez le tout à la suite
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
Disponible via subversion : http://subversion.developpez.com/pro...1/C/sma/trunk/
Partager