IPB

Bienvenue invité ( Connexion | Inscription )

 
Reply to this topicStart new topic
> Que faire lors d'un malloc qui retourne NULL en langage C?, Stratégie de contournement d'erreur.
Options
macuserfr
posté 6 Nov 2006, 22:39
Message #1


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 4 687
Inscrit : 28 Nov 2001
Lieu : Pas loin du grand pic qu'on surnomme Tour Eiffel
Membre no 1 440



Bonsoir à tous,
J'suis en train d'étudier le langage C. J'ai pris conscience qu'il faut vérifier les sources d'erreur comme les malloc. Mais que faire si un malloc échoue? Simplement faire un printf("erreur"); et quitter ne me convient pas, je cherche quelque chose de plus élégant.
Est-ce que:
CODE
do toto = (char *) malloc( sizeof(char) * 32 );
while(toto==NULL);

serait trop bourrin pour garantir une allocation mémoire à tout prix?
Qu'elles sont vos stratégies? Comment contournez-vous ce problème pour continuer le programme normalement?

Désolé de la question existentielle de néophite mais ça me démange. À vos claviers, je vous écoute smile.gif

Ce message a été modifié par macuserfr - 6 Nov 2006, 23:22.


--------------------
Mordu de Mac depuis 1996, avec un Performa 6230CD sous Mac OS 7.5.1. Depuis l'extinction de Steve Jobs, le logiciel libre se fait de plus en plus présent dans ma vie numérique.
Go to the top of the page
 
+Quote Post
cuzub
posté 6 Nov 2006, 23:15
Message #2


Macbidouilleur de bronze !
**

Groupe : Membres
Messages : 393
Inscrit : 18 Dec 2001
Lieu : Rennes
Membre no 1 632



Tu ne sembles pas utiliser malloc de la bonne manière : malloc va allouer de la mémoire en fonction de ce que tu lui donnes en argument:

par ex :

char *c = (char *) malloc( sizeof(char) * 32 );

alloue une chaine de 32 caractères (en passant sizeof(char) ne sert pas à grand chose puisque cela retourne 1 mais bon, ca fait plus propre)

Il faut donc que tu indiques à malloc la taille de la mémoire à allouer.
malloc te retourne alors un pointeur sur cet espace mémoire alloué.

ne pas oublier de faire un free(pointeur) lorsque tu as terminé.



--------------------
iMac 27" 2.66 GHz Core 2 Duo - iPhone 4 iOS 4.1 JB
Go to the top of the page
 
+Quote Post
macuserfr
posté 6 Nov 2006, 23:21
Message #3


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 4 687
Inscrit : 28 Nov 2001
Lieu : Pas loin du grand pic qu'on surnomme Tour Eiffel
Membre no 1 440



Oui, ça je sais, j'avais mis un schéma simplifié, l'important n'était pas l'appel à malloc mais la boucle, je vais éditer mon post pour pas laisser d'ambiguité mais je n'ai pas de problème particulier à allouer de la mémoire. Ce que je me (vous) demande c'est quoi faire quand ça plante?
Merci quand même pour répondre promptement smile.gif


--------------------
Mordu de Mac depuis 1996, avec un Performa 6230CD sous Mac OS 7.5.1. Depuis l'extinction de Steve Jobs, le logiciel libre se fait de plus en plus présent dans ma vie numérique.
Go to the top of the page
 
+Quote Post
guerom00
posté 6 Nov 2006, 23:25
Message #4


Sans titre ni bouboules et terriblement négatif !


Groupe : Membres
Messages : -8 378 756
Inscrit : 5 Dec 2004
Membre no 28 230



Ne peux-tu pas tester si ta quantité est allouée ? unsure.gif


--------------------
la galette: un site qui ne tourne pas en rond !
Breton par assiduité et Pinklaireur occasionnel et n'aime pas Caps Lock…
“Theory: As long as strangers hold the power to affect your mood, you are deeply and fundamentally fucked.”
The Internet is made of cats.
Go to the top of the page
 
+Quote Post
Doom Hammer
posté 6 Nov 2006, 23:37
Message #5


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 2 844
Inscrit : 10 Jul 2002
Membre no 2 871



http://forum.macbidouille.com/index.php?showtopic=190158
En général si malloc échoue c'est mal barré. Ça indique la terminaison futur du programme de façon assez rapide.
En vérifiant les cas d'erreurs tu peux afficher un joli message d'erreur pour exposer le problème à l'utilisateur, éventuellement (tenter de) sauver le document en cours etc... puis quitter.

Ce message a été modifié par Doom Hammer - 6 Nov 2006, 23:39.
Go to the top of the page
 
+Quote Post
macuserfr
posté 6 Nov 2006, 23:39
Message #6


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 4 687
Inscrit : 28 Nov 2001
Lieu : Pas loin du grand pic qu'on surnomme Tour Eiffel
Membre no 1 440



Quand il retourne NULL c'est que la quantité n'est pas allouée. Le test est déjà fait. Ce que je démande c'est quoi faire lorsque ce teste donne négatif. Hurler? Casser l'ordinateur? Se jeter par la fenêtre?

Merci Doom pour la réponse, bien que j'avoue être frustré de pas pouvoir faire grand chose pour mon programme. Je m'y attendai à un bout de code magique qui rattraperai la donne... Mais apparement le mieux qu'on puisse faire c'est dire au revoir et quitter.

Ce message a été modifié par macuserfr - 6 Nov 2006, 23:46.


--------------------
Mordu de Mac depuis 1996, avec un Performa 6230CD sous Mac OS 7.5.1. Depuis l'extinction de Steve Jobs, le logiciel libre se fait de plus en plus présent dans ma vie numérique.
Go to the top of the page
 
+Quote Post
schlum
posté 7 Nov 2006, 07:46
Message #7


Terminaltor
Moderating Machine
*****

Groupe : Admin
Messages : 24 451
Inscrit : 25 Oct 2002
Lieu : Jeumont (59)
Membre no 4 319



Tu peux en général écrire des données déjà allouées sur le disque (attention, en bas niveau : fwrite, sinon il risque d'avoir besoin d'allouer autre chose... !).
Après, c'est "les femmes et les enfants d'abord" laugh.gif


--------------------
          I think therefore I Mac          
Go to the top of the page
 
+Quote Post
noop
posté 7 Nov 2006, 09:58
Message #8


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 2 964
Inscrit : 3 Nov 2005
Membre no 49 239



Un NULL retourné par un malloc() est une situation desespérée (a moins que tu demande des méga et des mégas de mémoire).

Il y a de forte chance pour que ta machine plante assez vite entrainant ton programme dans les bas fond des kernel panic.

Ma solution: ne pas tester les malloc pour des petites quantités de mémoire. Ne s'y interesser que quand tu demande des plages mémoire supérieures a 4096 octets (par exemple). A toi de définir ta limite.
Avantage:
ton code sera plus concis, plus lisible plus maintenable.

Ne cherche pas à être un ayatolah des règles de développement. Un peu de souplesse et de pragmatisme sont nécessaire en développement.
Go to the top of the page
 
+Quote Post
chombier
posté 7 Nov 2006, 10:01
Message #9


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 6 580
Inscrit : 20 Mar 2003
Membre no 6 765



CITATION(noop @ 7 Nov 2006, 09:58) [snapback]1967978[/snapback]

Un NULL retourné par un malloc() est une situation desespérée (a moins que tu demande des méga et des mégas de mémoire).

Il y a de forte chance pour que ta machine plante assez vite entrainant ton programme dans les bas fond des kernel panic.

Ma solution: ne pas tester les malloc pour des petites quantités de mémoire. Ne s'y interesser que quand tu demande des plages mémoire supérieures a 4096 octets (par exemple). A toi de définir ta limite.
Avantage:
ton code sera plus concis, plus lisible plus maintenable.

Ne cherche pas à être un ayatolah des règles de développement. Un peu de souplesse et de pragmatisme sont nécessaire en développement.

laugh.gif laugh.gif laugh.gif c'te bonne blague...
signé: un ayatollah... dry.gif


--------------------
késtananafout' (:
Go to the top of the page
 
+Quote Post
schlum
posté 7 Nov 2006, 10:46
Message #10


Terminaltor
Moderating Machine
*****

Groupe : Admin
Messages : 24 451
Inscrit : 25 Oct 2002
Lieu : Jeumont (59)
Membre no 4 319



Et ça recommence...


--------------------
          I think therefore I Mac          
Go to the top of the page
 
+Quote Post
Cochonou
posté 7 Nov 2006, 11:02
Message #11


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 3 129
Inscrit : 21 Aug 2005
Membre no 44 239



Il faudrait ajouter un point dans la charte indiquant que les sujets traitant de malloc sont trop polémiques, et donc interdits. tongue.gif


--------------------
Powerbook G4 1.33 Ghz - Mac OS X 10.5
Go to the top of the page
 
+Quote Post
noop
posté 7 Nov 2006, 11:22
Message #12


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 2 964
Inscrit : 3 Nov 2005
Membre no 49 239



CITATION(Cochonou @ 7 Nov 2006, 11:02) [snapback]1968062[/snapback]

Il faudrait ajouter un point dans la charte indiquant que les sujets traitant de malloc sont trop polémiques, et donc interdits. tongue.gif


...ajoute aussi calloc(), realloc().. laugh.gif
Go to the top of the page
 
+Quote Post
roseau
posté 7 Nov 2006, 11:54
Message #13


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 5 678
Inscrit : 11 Feb 2003
Lieu : Bagneux
Membre no 6 110



en fait la seul chose que tu ais à faire c'est intercepter l'erreur et la traiter, ça peut être par un vidage de la mémoire et donc crash de l'application en cours sans conséquence sur le reste du système, soit tu rectifies en essayant d'autres méthodes d'allocation de mémoire car de toute manière attendre que la mémoire soit libérée pour la prendre relève de l'utopie

par exemple en utilisant un fichier temporaire pour stocker des infos, ça se fait beaucoup en BD où tu as quelques fois besoin de tellement de mémoire pour lire les données que tu n'arrives jamais à l'obtenir et donc la seul solution c'est le fichier sur un disque


--------------------
Imac 2017 core I7 , 2*MBP2015 core I7, Macmini late 2014 core I5 16 go 10.11/maverick MBp , Mbp 15" late 2014 core i7 16 go 10.11; Macmini 2011 core i5 ( 10.9), , , Xserve/2008/ 1 2,8ghz quad-core xeon/osx server 10.9.4/mem 18 go/carte raid 3*1to raid 5,Antiquité fonctionelle :Imac debut 2010 10.5.8MBPRO 13" fin 2010 10.9, macbookpro 17" juin 2007 10.5.8, Macmini core 2 duo 1,8 /1024mo/10.5.8, Macmini 1,42/1024mo/10.4.11,G4 mono 1.25 (MDD 2003) /1500mo/10.4.11 server , 4400 200 upgrade g3/400,4400 240 , , 7100 80/,
antiquite 6320 lc 630, powerbook 180c,powerbook duo 210, Mac classic (panne vidéo) Mac SE...,os 10.4* , 10.3.9, os9.1/os8.1, os7.6,
NAS CS407 Synology 4*500go (raid 5),
Go to the top of the page
 
+Quote Post
macuserfr
posté 7 Nov 2006, 14:53
Message #14


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 4 687
Inscrit : 28 Nov 2001
Lieu : Pas loin du grand pic qu'on surnomme Tour Eiffel
Membre no 1 440



Merci Roseau.
Donc apparement malloc rend rarement un pointeur NULL, heureusement. Faut en demander beaucoup pour qu'il échoue. Mais refaire une allocation est si utopiste que ça? le do while de mon premier post rentrerai en boucle infinie?

Sinon sur mon projet actuel je doit avouer que j'ai incriminé malloc trop vite, j'avait un pointeur declaré mais pas affecté (aie, pas tapper!) qui trainait. J'avai de la chance que la mémoire allouée par malloc était souvent à zéro, donc ce pointeur avait pour adresse NULL (0x00). Mais dès que le malloc rendait autre chose que de la mémoire "vierge" ce pointeur allait tapper dans une adresse interdite... Et ça, forcément, ça fait une belle erreur de segmentation.

Je me suis aperçu du problème sous linux où dès la première affectation le pointeur avait une adresse quelconque et plantait. Vive gdb!


--------------------
Mordu de Mac depuis 1996, avec un Performa 6230CD sous Mac OS 7.5.1. Depuis l'extinction de Steve Jobs, le logiciel libre se fait de plus en plus présent dans ma vie numérique.
Go to the top of the page
 
+Quote Post
roseau
posté 7 Nov 2006, 14:59
Message #15


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 5 678
Inscrit : 11 Feb 2003
Lieu : Bagneux
Membre no 6 110



CITATION(macuserfr @ 7 Nov 2006, 14:53) [snapback]1968414[/snapback]

Merci Roseau.
Donc apparement malloc rend rarement un pointeur NULL, heureusement. Faut en demander beaucoup pour qu'il échoue. Mais refaire une allocation est si utopiste que ça? le do while de mon premier post rentrerai en boucle infinie?

Sinon sur mon projet actuel je doit avouer que j'ai incriminé malloc trop vite, j'avait un pointeur declaré mais pas affecté (aie, pas tapper!) qui trainait. J'avai de la chance que la mémoire allouée par malloc était souvent à zéro, donc ce pointeur avait pour adresse NULL (0x00). Mais dès que le malloc rendait autre chose que de la mémoire "vierge" ce pointeur allait tapper dans une adresse interdite... Et ça, forcément, ça fait une belle erreur de segmentation.

Je me suis aperçu du problème sous linux où dès la première affectation le pointeur avait une adresse quelconque et plantait. Vive gdb!



rolleyes.gif tu me donnes l'impression de développer un peu au hasard non?


--------------------
Imac 2017 core I7 , 2*MBP2015 core I7, Macmini late 2014 core I5 16 go 10.11/maverick MBp , Mbp 15" late 2014 core i7 16 go 10.11; Macmini 2011 core i5 ( 10.9), , , Xserve/2008/ 1 2,8ghz quad-core xeon/osx server 10.9.4/mem 18 go/carte raid 3*1to raid 5,Antiquité fonctionelle :Imac debut 2010 10.5.8MBPRO 13" fin 2010 10.9, macbookpro 17" juin 2007 10.5.8, Macmini core 2 duo 1,8 /1024mo/10.5.8, Macmini 1,42/1024mo/10.4.11,G4 mono 1.25 (MDD 2003) /1500mo/10.4.11 server , 4400 200 upgrade g3/400,4400 240 , , 7100 80/,
antiquite 6320 lc 630, powerbook 180c,powerbook duo 210, Mac classic (panne vidéo) Mac SE...,os 10.4* , 10.3.9, os9.1/os8.1, os7.6,
NAS CS407 Synology 4*500go (raid 5),
Go to the top of the page
 
+Quote Post
macuserfr
posté 7 Nov 2006, 15:08
Message #16


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 4 687
Inscrit : 28 Nov 2001
Lieu : Pas loin du grand pic qu'on surnomme Tour Eiffel
Membre no 1 440



CITATION(roseau @ 7 Nov 2006, 14:59) [snapback]1968421[/snapback]

rolleyes.gif tu me donnes l'impression de développer un peu au hasard non?


Le hasard fait bien les choses, non? biggrin.gif
Non, en fait ce qui s'est passé c'est que ça faisait un an que je touchais pas au C et que j'ai pondu 900 lignes de code en une semaine... Forcément la vitesse et la précision vont pas trop ensemble.


--------------------
Mordu de Mac depuis 1996, avec un Performa 6230CD sous Mac OS 7.5.1. Depuis l'extinction de Steve Jobs, le logiciel libre se fait de plus en plus présent dans ma vie numérique.
Go to the top of the page
 
+Quote Post
noop
posté 7 Nov 2006, 15:08
Message #17


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 2 964
Inscrit : 3 Nov 2005
Membre no 49 239



CITATION(macuserfr @ 7 Nov 2006, 14:53) [snapback]1968414[/snapback]

J'avai de la chance que la mémoire allouée par malloc était souvent à zéro, donc ce pointeur avait pour adresse NULL (0x00). Mais dès que le malloc rendait autre chose que de la mémoire "vierge" ce pointeur allait tapper dans une adresse interdite... Et ça, forcément, ça fait une belle erreur de segmentation.


La chance c'était que tu sois en mode débug. Dans ce cas la mémoire est allouée est mise a zéro. Quand tu enlève les options de debug a la compil, la mémoire allouée contient n'importe quoi. Et on se trouve devant le cas du programme marche en debug et pas en mode "release"

Ce message a été modifié par noop - 7 Nov 2006, 15:24.
Go to the top of the page
 
+Quote Post
macuserfr
posté 7 Nov 2006, 15:28
Message #18


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 4 687
Inscrit : 28 Nov 2001
Lieu : Pas loin du grand pic qu'on surnomme Tour Eiffel
Membre no 1 440



Non, sous Mac OS X, même compilé en mode "release" (gcc -o Program main.c -Wall -ansi dans le terminal) ça passait "à peu près". C'est sous linux x86 à la fac que ça crash direct.


--------------------
Mordu de Mac depuis 1996, avec un Performa 6230CD sous Mac OS 7.5.1. Depuis l'extinction de Steve Jobs, le logiciel libre se fait de plus en plus présent dans ma vie numérique.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
2 utilisateur(s) sur ce sujet (2 invité(s) et 0 utilisateur(s) anonyme(s))
0 membre(s) :

 



Nous sommes le : 10th May 2024 - 18:54