star-style

Writing conventions for co-authors
Log | Files | Refs | README | LICENSE

commit 2ef023abc1e2ed9263751f255f3dae97089d8b03
parent c0af245d3385cb882d07ee8cdade7b319d9db74b
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Fri, 17 Jul 2026 17:28:31 +0200

Ajoute la section sur les allocations dynamiques

Diffstat:
Mdoc/fr/star-c.7 | 148+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 148 insertions(+), 0 deletions(-)

diff --git a/doc/fr/star-c.7 b/doc/fr/star-c.7 @@ -1462,6 +1462,154 @@ error: .Ed .\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .Sh LES ALLOCATIONS DYNAMIQUES +Préférer l'interface d'allocation proposée par la +bibliothèque +.Ql RSys +via son fichier d'en-tête +.In rsys/mem_allocator.h . +Elle enrichit la gestion de la mémoire dynamique proposée par la +bibliothèque C standard, notamment en enregistrant la quantité de +mémoire allouée. +.Pp +Utiliser dès lors les fonctions +.Fn mem_alloc , +.Fn mem_calloc +et +.Fn mem_realloc +pour allouer dynamiquement de la mémoire. +Leur profil est celui des fonctions équivalentes proposées par la +bibliothèque C, à savoir ces mêmes fonctions mais sans le prefixe +.Ql mem_ . +.Pp +Privilégier la fonction +.Fn mem_calloc +.Fn mem_alloc +de sorte à initialiser la mémoire allouée à zéro, et d'éviter ainsi +d'utiliser des données non initialisées. +.Pp +Ne pas convertir le pointeur retourné par les fonctions d'allocation. +La conversion d'un pointeur vide vers n'importe quel autre type de +pointeur est déjà assuré par le langage C. +.Pp +Définir la taille du bloc mémoire à allouer via le type pointé par la +variable destination : +.Bd -literal -offset Ds +p = mem_calloc(42, sizeof(*p)); +.Ed +.Pp +L'alternative qui consiste à épeller le type pointé en argument de +.Ql sizeof +non seulement nuit à la lisibilité des sources, mais laisse en plus +l'opportunité d'introduire un bogue dès lors que le type de pointeur +est mis à jour mais pas le nom du type renseigné à +.Ql sizeof . +.Pp +Utiliser la fonction +.Fn mem_alloc_aligned +pour allouer un bloc mémoire dont l'adresse doit être alignée sur un +nombre d'octets spécifique. +Utiliser la fonction +.Xr memset 3 , +de la bibliothèque C standard, pour forcer la mise à zéro du bloc ainsi +alloué sinon rempli d'octets +aléatoires : +.Bd -literal -offset Ds +foo = mem_alloc_aligned(sizeof(*foo), 128/* Alignement */); +memset(foo, 0, sizeof(*foo)); +.Ed +.Pp +Vérifier chaque allocation en testant que l'adresse retournée n'est pas +.Ql NULL . +Traiter ce cas comme une erreur et non un bogue +.Pq section Sx LA GESTION DES ERREURS Ns + : +.Bd -literal -offset Ds + foo = mem_calloc(1, sizeof(*foo); + if (!foo) { + res = RES_MEM_ERR; + goto error; + } +.Ed +.Pp +Libérer la mémoire allouée via +.Ql RSys +avec la fonction +.Fn mem_rm +dont le profil est le même que celui de la fonction +.Xr free 3 Ns + : +.Bd -literal -offset Ds +mem_rm(foo); +.Ed +.Pp +Détecter la présence de fuites mémoires via la fonction +.Fn mem_allocated_size +qui retourne la quantité de mémoire qui reste allouée par la +bibliothèque : +.Bd -literal -offset Ds +int +main(void) +{ + size_t sz = 0; + int err = 0; + + ... + + if ((sz = mem_alloc_aligned()) != 0) { + fprintf(stderr, "Fuites mémoires : %lu octets\en", sz); + if (err == 0) err = 1; + } + return err; +} +.Ed +.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" +.Ss Les allocateurs mémoire +Dans son fichier d'en-tête +.In rsys/mem_allocator.h , +la bibliothèque +.Ql RSys +définit en plus une interface d'allocateur mémoire. +Au contraire de son interface d'allocation qui enregistre la mémoire +alloué globalement par la bibliothèque, +chaque allocateur enregistre ses seules allocations. +.Pp +Plusieurs types d'allocateurs sont proposés par la bibliothèque +.Ql RSys , +chacun mettant en oeuvre une politique d'allocation qui lui est propre. +Si bien qu'en fonction du contexte, un type d'allocateur particulier +peut s'avérer plus approprié, par exemple pour réduire les coûts +d'allocations/désallocations. +Décrire les différents types d'allocateurs définis dans la bibliothèque +.Ql RSys +sort du cadre de cette documentation. +Le lecteur est invité à se référer à son fichier d'en-tête +.In rsys/mem_allocator.h +pour plus d'informations. +.Pp +Les convention listées précédemment quant aux allocation dynamiques +s'appliquent à l'identique à l'utilisation des allocateurs. +.Pp +Utiliser un allocateur consiste à appeler des macros, dont le nom est +une version en majuscule des fonctions de l'interface d'allocation. +Avec en plus en premier argument l'addresse de l'allocateur concerné : +.Bd -literal -offset Ds +foo = MEM_CALLOC(&mem_default_allocator, 1, sizeof(*foo)); + +\&... + +MEM_RM(&mem_default_allocator, foo); + +if (MEM_ALLOCATED_SIZE(&mem_default_allocator)) { + fprintf(stderr, "Fuites mémoires\en"); +} +.Ed +.Pp +avec +.Va mem_default_allocator +l'allocateur par défaut définit par la bibliothèque +.Ql RSys . +.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .Sh LA GESTION DES ERREURS .Sh LES PROGRAMME EN LIGNE DE COMMANDE .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""