OVH Cloud OVH Cloud

Allouer plus de mémoire que disponible

76 réponses
Avatar
Rémi Moyen
Salut,

J'ai une question sur la mani=E8re dont se comporte un programme sous
Linux, en C++, quand on essaye d'allouer plus de m=E9moire que
disponible sur le syst=E8me. =C0 la base, l'op=E9rateur new lance dans ce
cas-l=E0 une exception et c'est =E0 moi de la rattraper et de la traiter,
tr=E8s bien.

Mais mon probl=E8me est de savoir si, par derri=E8re, le noyau essaye
d'allouer toute la m=E9moire avant de se rendre compte qu'il n'en a pas
assez de disponible, ou est-ce qu'il fait d'abord une v=E9rification
avant de se lancer l=E0-dedans ?

Dans le cas o=F9 la m=E9moire est sur de la RAM, =E7a ne change probablement
pas grand chose (en perception par l'utilisateur), mais si il y a du
swap, est-ce que le noyau va faire swapper tout ce qu'il peut pendant
une heure avant de se rendre compte qu'il lui manque 42 octets ?

Si c'est le cas, alors j'imagine que j'ai int=E9r=EAt =E0 impl=E9menter
quelques checks rapides sur la m=E9moire disponible avant de commencer =E0
allouer des blocs de 1 Go (=E7a m'arrive...), sinon mes utilisateurs
risquent de ne pas trop aimer devoir attendre longtemps, et swapper
tout les autres programmes, avant de s'entendre dire qu'il n'y a pas
assez de m=E9moire pour faire ce qu'ils veulent ! Et dans ce cas-l=E0
encore, y'a-t-il une mani=E8re plus ou moins "standard" de v=E9rifier "=E0
la main" la m=E9moire disponible ?

Et accessoirement, j'imagine que diff=E9rents OS peuvent se comporter
diff=E9remment de ce point de vue, donc est-ce pareil pour SunOS ?
IRIX ? (les deux autres syst=E8mes que je suis susceptible d'utiliser)

Merci d'avance !
--
R=E9mi Moyen

10 réponses

4 5 6 7 8
Avatar
Sébastien Monbrun aka TiChou
Dans le message <news:45dc8476$0$14940$,
*Nicolas George* tapota sur f.c.o.unix :

Date: Wed, 21 Feb 2007 09:42:04 -0800
NNTP-Posting-Date: 21 Feb 2007 18:41:18 MET

C'est fait, enfin j'espere.


Non, raté.


C'est pour les 46 secondes d'avance que tu dis raté ? ;-)

--
Sébastien Monbrun aka TiChou


Avatar
JKB
Le 22-02-2007, à propos de
Re: Allouer plus de mémoire que disponible,
Jean-Louis Liagre écrivait dans fr.comp.os.unix :
JKB wrote:
Le 21-02-2007, à propos de
Re: Allouer plus de mémoire que disponible,
Jean-Louis Liagre écrivait dans fr.comp.os.unix :

JKB wrote:

Le 21-02-2007, à propos de
Re: Allouer plus de mémoire que disponible,
Jean-Louis Liagre écrivait dans fr.comp.os.unix :


Nicolas George wrote:


Jean-Louis Liagre wrote in message
<45db27ee$0$3885$:



Admettons que j'ai 8 Go de RAM et 1 Go de swap. Je positionne le
l'overcommit a 2 et je laisse la config par defaut (50%).
Mon hardware + noyau utilisent 128Mo, l'O/S va donc refuser les
allocations au dela de "1Go + (8Go-128Mo)*50%" soit 4.94 Go.

J'ai donc plus de 4 Gigas de memoire virtuelle, dont plus de 3 gigas de
RAM !!!, qui sont inutilisables ...





Par une allocation d'un processus, si j'ai bien compris.


Je comprend moi que ces 3 gigas de RAM seront inutilisables que que soit
le nombre de processus et d'allocations faites.



Personnellement, je comprends "par allocation". Et cela semble
confirmé par mes tests.


Peux-tu en dire plus sur ces tests ?


Simple. Sur sparc, le seul moyen que j'ai trouvé pour tester la
mémoire, c'est de faire des allocations par tranche de 1 Go et
d'écrire sauvagement à l'intérieur.

Soient 2Go de mémoire et 4Go de swap. On ne peut allouer d'après tes
calculs que 5 Go de mémoire au total. Sauf que j'ai un programme qui
passe son temps à allouer et à desallouer 2 * 1 Go (au delà, j'ai
des problèmes de pointeurs pour l'écriture et c'est un utilitaire
Quick and Dirty ;-) ). Si je fais tourner trois fois ce programme,
il me bouffe toute la mémoire (et OOM Killer pointe le bout de son
nez). J'arrive aussi sur une architecture 64 bits à allouer dans le
_même_ processus les 6 Go de mémoire (je ne l'ai pas fait récemment
parce que l'écriture dans le truc prend pas mal de temps et que OOM
killer me bousille toute mon allocation.).

Ma comprehension est qu'il s'agit d'une taille globale, sinon je ne vois
pas comment le noyau pourrait respecter le calcul indique dans la doc.


Le noyau travaille sur l'espace mémoire de chaque processus, ou
alors, je n'ai pas tout compris (ce qui est possible).

Si je te comprends bien, tu te plains que si tu mets des valeurs
fantaisistes pour la taille du swap et les sysctl, le système fonctionne de
manière sous-optimale ? Je dois dire que ça ne me surprend pas.


La taille du swap me regarde, elle n'a rien de fantaisiste si la taille
de la RAM est suffisante aux besoins des applications que je fait tourner.

Les sysctl ont leur valeurs par defaut et en effet, Linux fait preuve
ici de beaucoup de fantaisie.



Par défaut, le paramètre en question est à 0 :

0 - Heuristic overcommit handling. Obvious overcommits of
address space are refused. Used for a typical system. It
ensures a seriously wild allocation fails while allowing
overcommit to reduce swap usage. root is allowed to
allocate slighly more memory in this mode. This is the
default.

Maintenant, si on positionne le truc à 2 et qu'on a une machine
"normale", mettons mon U2 avec 2Go de mémoire et 4Go de swap, je
peux par défaut faire une allocation de 5Go, ce qui n'est pas
absurde (reste 1Go pour tout le reste, noyau, X et autres
applications).


Je ne suis pas d'accord avec le "et autres applications".



Pourquoi ?


Parce que ca violerait la regle que fait respecter le strict overcommit.


?

Le 1 Go restant n'est utilisable que par le noyau ou des modules/drivers
associes, pas par des applications.


Il est toujours possible de positionner
vm.overcommit_ratio, mais je ne suis pas franchement sûr que ce soit
une excellente idée.


C'est vrai, l'overcommit n'est pas a sa valeur par defaut.

Je ne sais pas ce que c'est qu'une machine "normale". Si une
configuration est autorisee et qu'elle se justifie, je ne vois pas
pourquoi on devrait la juger "anormale".

Ce que je reproche au parametre overcommit, c'est qu'il induit les
utilisateurs en erreur car son libelle est trompeur.

Il permet c'est vrai de reduire le risque d'OOM killer, mais exige un
parametrage tres fin pour etre sur que l'on ne tombe pas dans le
probleme inverse, ce que mon exemple demontre. En fait, on ne sait pas
trop si on a supprime le risque.



Dans la vraie vie, on est souvent bien content d'avoir un OOM
killer.


Dans la vraie vie, c'est a dire une machine de production. Il me parait
inacceptable de laisser a l'O/S le soin de choisir quelle application il
va tuer pour faire de la place en memoire. Je veux bien qu'un programme
se plante si un malloc qu'il fait echoue, c'est tout.


Nous sommes au moins d'accord sur ce point. Sauf que cet argument
est valable pour un système monotâche et très discutable pour un
multitâche/multiutilisateur.

Cela évite généralement de rebooter sauvagement un serveur.


Un malloc/new ou mmap qui plante, ca ne fait pas rebooter un serveur.


Non. Sauf qu'une machine à la ramasse parce qu'elle n'a plus de
mémoire n'offre plus qu'une issue (sans OOM Killer), le bouton
on/off.

Je ne l'ai vu à l'oeuvre que deus ou trois fois, mais le réseultat
est assez bon. Dernier exemple : un stagiaire écrit du C avec un
pied gauche et dans un algorithme de traitement alloue de la mémoire
façon malloc(), chaque bloc alloué faisant quelque kilo. Le
problème, c'est qu'il n'a jamais utilisé le free() correspondant.
Sur une machine de calcul, il est d'assez bon ton que le système se
démerde seul pour virer le gêneur, parce que dans le cas du reboot
sauvage, les calculs qui tournaient depuis quinze jour sont perdus.


Une fuite memoire sera je l'espere detectee avant de mettre le code en
production. A supposer que non, rien ne garantit que le process a
l'origine de la fuite soit precisement celui que va degager l'OOM Killer.


Ouaips. Pas sûr. D'autant que l' OOM Killer est assez bien foutu
pour généralement dégager l'intrus (enfin, c'est toujours ce que
j'ai observé).

Voici aussi ce que je vois dans le code source:

#define OVERCOMMIT_NEVER 2

Le "NEVER" est clairement incorrect. (le STRICT de la doc est plus exact).

En definitive, je ne comprend pas pourquoi Linux oblige a effectuer un
tuning quand on souhaite disposer de toute sa memoire virtuelle sans
jamais overcommiter une allocation, alors qu'il a toute les billes pour
effectuer ce controle tout seul.



Parce qu'il n'y a pas trente-six solutions. Soit on utilise un
overcommit et un OOM killer (ou récupération des signaux gaçon
segfault), soit on n'utilise pas d'overcommit et la gestion de la
mémoire est clairement sous-optimale. Tout ceci est une histoire de
compromis.


Tu ne repond pas au probleme que je decris.

Je souhaite que le systeme avec lequel je travaille respecte les
standards et la semantique Posix.


Posix interdit l'overcommit ? J'ai dû rater cela.

En particulier, si mon code fait un malloc, je m'attend a ce que l'appel
retourne null si le malloc n'est pas garanti. Solaris fait ca en
standard, Linux est incapable de me fournir une solution sans un tuning
qui de toute facon sera forcement imprecis.


On ne va pas parler de la gestion mémoire de SunOS. Je me suis tapé
toutes les version du bazar depuis la 4.1. Effectivement, il n'y a
pas (à ma connaissance) d'overcommit, mais la gestion mémoire est
souvent complètement désastreuse. Au prix ou Sun vend sa mémoire, il
vaut mieux que le système l'utilise. Exemple frappant : un serveur
en prod avec deux procs, Solaris 9 (à jour) et 2 Go de mémoire. Une
grosse application java tourne là dessus et la machine utilise aux
alentours de 1Go de mémoire. Le reste ne sert même pas à du cache
disque !... Je préfère pour ma part avoir un système d'overcommit
comme celui de Linux, ce qui permet au moins de gérer efficacement
un cache disque en RAM. Au pire, je peux le désactiver avec la
valeur 2 et jouer sur le pourcentage.

JKB

--
Le cerveau, c'est un véritable scandale écologique. Il représente 2% de notre
masse corporelle, mais disperse à lui seul 25% de l'énergie que nous
consommons tous les jours.







Avatar
Jean-Louis Liagre
JKB wrote:
Le 21-02-2007, à propos de
Re: Allouer plus de mémoire que disponible,
Jean-Louis Liagre écrivait dans fr.comp.os.unix :

Nicolas George wrote:

Jean-Louis Liagre wrote in message
<45db27ee$0$3885$:


Admettons que j'ai 8 Go de RAM et 1 Go de swap. Je positionne le
l'overcommit a 2 et je laisse la config par defaut (50%).
Mon hardware + noyau utilisent 128Mo, l'O/S va donc refuser les
allocations au dela de "1Go + (8Go-128Mo)*50%" soit 4.94 Go.

J'ai donc plus de 4 Gigas de memoire virtuelle, dont plus de 3 gigas de
RAM !!!, qui sont inutilisables ...





Par une allocation d'un processus, si j'ai bien compris.


Je comprend moi que ces 3 gigas de RAM seront inutilisables que que soit
le nombre de processus et d'allocations faites.


Si je te comprends bien, tu te plains que si tu mets des valeurs
fantaisistes pour la taille du swap et les sysctl, le système fonctionne de
manière sous-optimale ? Je dois dire que ça ne me surprend pas.


La taille du swap me regarde, elle n'a rien de fantaisiste si la taille
de la RAM est suffisante aux besoins des applications que je fait tourner.

Les sysctl ont leur valeurs par defaut et en effet, Linux fait preuve
ici de beaucoup de fantaisie.



Par défaut, le paramètre en question est à 0 :

0 - Heuristic overcommit handling. Obvious overcommits of
address space are refused. Used for a typical system. It
ensures a seriously wild allocation fails while allowing
overcommit to reduce swap usage. root is allowed to
allocate slighly more memory in this mode. This is the
default.

Maintenant, si on positionne le truc à 2 et qu'on a une machine
"normale", mettons mon U2 avec 2Go de mémoire et 4Go de swap, je
peux par défaut faire une allocation de 5Go, ce qui n'est pas
absurde (reste 1Go pour tout le reste, noyau, X et autres
applications).


Je ne suis pas d'accord avec le "et autres applications".

Le 1 Go restant n'est utilisable que par le noyau ou des modules/drivers
associes, pas par des applications.

Il est toujours possible de positionner
vm.overcommit_ratio, mais je ne suis pas franchement sûr que ce soit
une excellente idée.


C'est vrai, l'overcommit n'est pas a sa valeur par defaut.

Je ne sais pas ce que c'est qu'une machine "normale". Si une
configuration est autorisee et qu'elle se justifie, je ne vois pas
pourquoi on devrait la juger "anormale".

Ce que je reproche au parametre overcommit, c'est qu'il induit les
utilisateurs en erreur car son libelle est trompeur.

Il permet c'est vrai de reduire le risque d'OOM killer, mais exige un
parametrage tres fin pour etre sur que l'on ne tombe pas dans le
probleme inverse, ce que mon exemple demontre. En fait, on ne sait pas
trop si on a supprime le risque.

Voici aussi ce que je vois dans le code source:

#define OVERCOMMIT_NEVER 2

Le "NEVER" est clairement incorrect. (le STRICT de la doc est plus exact).

En definitive, je ne comprend pas pourquoi Linux oblige a effectuer un
tuning quand on souhaite disposer de toute sa memoire virtuelle sans
jamais overcommiter une allocation, alors qu'il a toute les billes pour
effectuer ce controle tout seul.




Avatar
Nicolas George
Sébastien Monbrun aka TiChou wrote in message
:
C'est pour les 46 secondes d'avance que tu dis raté ? ;-)


Non, pour le NNTP-Posting-Host qui, d'après whois, a de bonnes chances de se
trouver en Belgique.

Avatar
Jean-Louis Liagre
Sébastien Monbrun aka TiChou wrote in message
:
C'est pour les 46 secondes d'avance que tu dis raté ? ;-)


Non, pour le NNTP-Posting-Host qui, d'après whois, a de bonnes chances de se
trouver en Belgique.


C'est interdit ?


Avatar
Sébastien Monbrun aka TiChou
Dans le message <news:45dce9e8$0$16845$,
*Jean-Louis Liagre* tapota sur f.c.o.unix :

Non, pour le NNTP-Posting-Host qui, d'après whois, a de bonnes chances
de se trouver en Belgique.


C'est interdit ?


Non, mais Nicolas faisait juste remarquer que le fuseau n'était toujours pas
le bon. Maintenant c'est ok.

--
Sébastien Monbrun aka TiChou


Avatar
Nicolas George
Sébastien Monbrun aka TiChou wrote in message
:
Non, mais Nicolas faisait juste remarquer que le fuseau n'était toujours pas
le bon.


Oui, c'est ça.

Maintenant c'est ok.


Le fuseau horaire est maintenant le bon, mais l'heure ne l'est pas, puisque
l'heure locale se prend pour l'heure UTC. Pourquoi ne pas faire tourner un
bon petit ntpd ?

Avatar
Jean-Louis Liagre
JKB wrote:
Le 21-02-2007, à propos de
Re: Allouer plus de mémoire que disponible,
Jean-Louis Liagre écrivait dans fr.comp.os.unix :

JKB wrote:

Le 21-02-2007, à propos de
Re: Allouer plus de mémoire que disponible,
Jean-Louis Liagre écrivait dans fr.comp.os.unix :


Nicolas George wrote:


Jean-Louis Liagre wrote in message
<45db27ee$0$3885$:



Admettons que j'ai 8 Go de RAM et 1 Go de swap. Je positionne le
l'overcommit a 2 et je laisse la config par defaut (50%).
Mon hardware + noyau utilisent 128Mo, l'O/S va donc refuser les
allocations au dela de "1Go + (8Go-128Mo)*50%" soit 4.94 Go.

J'ai donc plus de 4 Gigas de memoire virtuelle, dont plus de 3 gigas de
RAM !!!, qui sont inutilisables ...





Par une allocation d'un processus, si j'ai bien compris.


Je comprend moi que ces 3 gigas de RAM seront inutilisables que que soit
le nombre de processus et d'allocations faites.



Personnellement, je comprends "par allocation". Et cela semble
confirmé par mes tests.


Peux-tu en dire plus sur ces tests ?

Ma comprehension est qu'il s'agit d'une taille globale, sinon je ne vois
pas comment le noyau pourrait respecter le calcul indique dans la doc.

Si je te comprends bien, tu te plains que si tu mets des valeurs
fantaisistes pour la taille du swap et les sysctl, le système fonctionne de
manière sous-optimale ? Je dois dire que ça ne me surprend pas.


La taille du swap me regarde, elle n'a rien de fantaisiste si la taille
de la RAM est suffisante aux besoins des applications que je fait tourner.

Les sysctl ont leur valeurs par defaut et en effet, Linux fait preuve
ici de beaucoup de fantaisie.



Par défaut, le paramètre en question est à 0 :

0 - Heuristic overcommit handling. Obvious overcommits of
address space are refused. Used for a typical system. It
ensures a seriously wild allocation fails while allowing
overcommit to reduce swap usage. root is allowed to
allocate slighly more memory in this mode. This is the
default.

Maintenant, si on positionne le truc à 2 et qu'on a une machine
"normale", mettons mon U2 avec 2Go de mémoire et 4Go de swap, je
peux par défaut faire une allocation de 5Go, ce qui n'est pas
absurde (reste 1Go pour tout le reste, noyau, X et autres
applications).


Je ne suis pas d'accord avec le "et autres applications".



Pourquoi ?


Parce que ca violerait la regle que fait respecter le strict overcommit.

Le 1 Go restant n'est utilisable que par le noyau ou des modules/drivers
associes, pas par des applications.


Il est toujours possible de positionner
vm.overcommit_ratio, mais je ne suis pas franchement sûr que ce soit
une excellente idée.


C'est vrai, l'overcommit n'est pas a sa valeur par defaut.

Je ne sais pas ce que c'est qu'une machine "normale". Si une
configuration est autorisee et qu'elle se justifie, je ne vois pas
pourquoi on devrait la juger "anormale".

Ce que je reproche au parametre overcommit, c'est qu'il induit les
utilisateurs en erreur car son libelle est trompeur.

Il permet c'est vrai de reduire le risque d'OOM killer, mais exige un
parametrage tres fin pour etre sur que l'on ne tombe pas dans le
probleme inverse, ce que mon exemple demontre. En fait, on ne sait pas
trop si on a supprime le risque.



Dans la vraie vie, on est souvent bien content d'avoir un OOM
killer.


Dans la vraie vie, c'est a dire une machine de production. Il me parait
inacceptable de laisser a l'O/S le soin de choisir quelle application il
va tuer pour faire de la place en memoire. Je veux bien qu'un programme
se plante si un malloc qu'il fait echoue, c'est tout.

Cela évite généralement de rebooter sauvagement un serveur.


Un malloc/new ou mmap qui plante, ca ne fait pas rebooter un serveur.

Je ne l'ai vu à l'oeuvre que deus ou trois fois, mais le réseultat
est assez bon. Dernier exemple : un stagiaire écrit du C avec un
pied gauche et dans un algorithme de traitement alloue de la mémoire
façon malloc(), chaque bloc alloué faisant quelque kilo. Le
problème, c'est qu'il n'a jamais utilisé le free() correspondant.
Sur une machine de calcul, il est d'assez bon ton que le système se
démerde seul pour virer le gêneur, parce que dans le cas du reboot
sauvage, les calculs qui tournaient depuis quinze jour sont perdus.


Une fuite memoire sera je l'espere detectee avant de mettre le code en
production. A supposer que non, rien ne garantit que le process a
l'origine de la fuite soit precisement celui que va degager l'OOM Killer.

Voici aussi ce que je vois dans le code source:

#define OVERCOMMIT_NEVER 2

Le "NEVER" est clairement incorrect. (le STRICT de la doc est plus exact).

En definitive, je ne comprend pas pourquoi Linux oblige a effectuer un
tuning quand on souhaite disposer de toute sa memoire virtuelle sans
jamais overcommiter une allocation, alors qu'il a toute les billes pour
effectuer ce controle tout seul.



Parce qu'il n'y a pas trente-six solutions. Soit on utilise un
overcommit et un OOM killer (ou récupération des signaux gaçon
segfault), soit on n'utilise pas d'overcommit et la gestion de la
mémoire est clairement sous-optimale. Tout ceci est une histoire de
compromis.


Tu ne repond pas au probleme que je decris.

Je souhaite que le systeme avec lequel je travaille respecte les
standards et la semantique Posix.
En particulier, si mon code fait un malloc, je m'attend a ce que l'appel
retourne null si le malloc n'est pas garanti. Solaris fait ca en
standard, Linux est incapable de me fournir une solution sans un tuning
qui de toute facon sera forcement imprecis.






Avatar
Jean-Louis Liagre

En particulier, si mon code fait un malloc, je m'attend a ce que l'appel
retourne null si le malloc n'est pas garanti. Solaris fait ca en
standard, Linux est incapable de me fournir une solution sans un tuning
qui de toute facon sera forcement imprecis.


On ne va pas parler de la gestion mémoire de SunOS. Je me suis tapé
toutes les version du bazar depuis la 4.1. Effectivement, il n'y a
pas (à ma connaissance) d'overcommit


Exact.

, mais la gestion mémoire est
souvent complètement désastreuse. Au prix ou Sun vend sa mémoire, il
vaut mieux que le système l'utilise.


Solaris peut tourner sur les mêmes machines x86 ou amd64 que Linux, en
utilisant donc de la mémoire au même prix.


Exemple frappant : un serveur
en prod avec deux procs, Solaris 9 (à jour) et 2 Go de mémoire. Une
grosse application java tourne là dessus et la machine utilise aux
alentours de 1Go de mémoire. Le reste ne sert même pas à du cache
disque !...


Solaris utilise un cache disque. S'il n'est pas plein, soit c'est que tu
mesures mal sa taille, soit qu'il n'a pas de raison de l'être, la
totalité des fichiers utilisés tient dans le cache et il reste de la RAM
libre.

Je préfère pour ma part avoir un système d'overcommit
comme celui de Linux, ce qui permet au moins de gérer efficacement
un cache disque en RAM.


J'ai du mal a comprendre le rapport que tu fais entre le cache disque en
RAM et l'overcommit. La mémoire "overcommitée" n'est jamais en
compétition avec la RAM, puisqu'elle n'existe pas.


Avatar
Jean-Louis Liagre
Jean-Louis Liagre wrote in message
<45dc7da6$0$7501$:
Un malloc/new ou mmap qui plante, ca ne fait pas rebooter un serveur.


Si le sshd sur le serveur ne peut plus forker parce qu'un processus à la
con, non critique, a alloué toute la mémoire, tu n'as pas trop d'autre choix
que de rebooter de l'extérieur.


Je peux encore essayer d'identifier puis tuer le process à partir de la
console, si ps (ou ls) et kill passent encore.


A supposer que non, rien ne garantit que le process a
l'origine de la fuite soit precisement celui que va degager l'OOM Killer.


Rien ne le garantit, mais il y a de bonnes chances, ce qui est mieux que pas
de chances du tout.


En cherchant un peu, j'ai trouvé un truc qui s'appelle "oom_pardon". Il
semble permettre d'éviter le principal reproche que je fait à l'OOM
killer. Dommage qu'il n'en soit pas fait référence dans la documentation
de l'overcommit.

Je souhaite que le systeme avec lequel je travaille respecte les
standards et la semantique Posix.
En particulier, si mon code fait un malloc, je m'attend a ce que l'appel
retourne null si le malloc n'est pas garanti.


POSIX ne garantit pas l'absence d'overcommit.


C'est vrai, mais ISO-C précise que malloc doit retourner un pointeur
vers une zone de mémoire de la taille souhaitée, ou NULL si l'opération
a échoué, c'est à dire si l'espace demandé ne peut être alloué.

Retourner un pointeur vers une zone partiellement, voire presque
totalement inutilisable me parait un grande liberté avec le standard.

Appeler memset() en utilisant un pointeur non nul retourné par malloc()
ne peut pas provoquer d'erreur d'après ce que je comprend d'ISO-C. Linux
viole donc ici le standard.


4 5 6 7 8