Question sur malloc - OpenBSD

Le
ja
Je suis en train de lire par curiosité cette page de man OpenBSD sur mall=
oc et je tombe sur cette phrase :

http://www.openbsd.org/cgi-bin/man.cgi?query=malloc&sektion=3

When using malloc() be careful to avoid the following idiom:

if ((p = malloc(num * size)) == NULL)
err(1, "malloc");

Pourquoi ne pas utiliser ce test == NULL ?

Cordialement
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 2
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Erwan David
Le #25551392
ja
Je suis en train de lire par curiosité cette page de man OpenBSD sur malloc et je tombe sur cette phrase :

http://www.openbsd.org/cgi-bin/man.cgi?query=malloc&sektion=3

When using malloc() be careful to avoid the following idiom:

if ((p = malloc(num * size)) == NULL)
err(1, "malloc");

Pourquoi ne pas utiliser ce test == NULL ?

Cordialement



C'est juste expliqué après. le problème n'est pas le == NULL, mais la
multiplication qui peut provoquer un overflow.

--
Les simplifications c'est trop compliqué
espie
Le #25551422
In article ja
Je suis en train de lire par curiosité cette page de man OpenBSD sur
malloc et je tombe sur cette phrase :

http://www.openbsd.org/cgi-bin/man.cgi?query=malloc&sektion=3

When using malloc() be careful to avoid the following idiom:

if ((p = malloc(num * size)) == NULL)
err(1, "malloc");

Pourquoi ne pas utiliser ce test == NULL ?



Ah, ces jeunes. Une phrase d'attention, et apres hop on passe a autre
chose.

(l'explication d'Erwann complete. Evidemment, il *faut* lire la suite)
ja
Le #25551412
Ok merci :)

Le jeudi 18 juillet 2013 21:06:12 UTC+2, Marc Espie a écrit :
In article
ja
>Je suis en train de lire par curiosité cette page de man OpenBSD sur

>malloc et je tombe sur cette phrase :

>

>http://www.openbsd.org/cgi-bin/man.cgi?query=malloc&sektion=3

>

>When using malloc() be careful to avoid the following idiom:

>

> if ((p = malloc(num * size)) == NULL)

> err(1, "malloc");

>

>Pourquoi ne pas utiliser ce test == NULL ?



Ah, ces jeunes. Une phrase d'attention, et apres hop on passe a autre

chose.



(l'explication d'Erwann complete. Evidemment, il *faut* lire la suite)
ja
Le #25551482
J'ai quand même une autre question suite à la première. Après la le cture du man, tjrs par curiosité je regarde un peu les sources et je cons tate qu'a chaque malloc, il n'y a pas d'init des pointeurs à NULL ni de t est sur NULL.

Pourquoi ? :)

Le jeudi 18 juillet 2013 21:13:44 UTC+2, ja a écrit :
Ok merci :)



Le jeudi 18 juillet 2013 21:06:12 UTC+2, Marc Espie a écrit :

> In article
>

> ja
>

> >Je suis en train de lire par curiosité cette page de man OpenBSD sur

>

> >malloc et je tombe sur cette phrase :

>

> >

>

> >http://www.openbsd.org/cgi-bin/man.cgi?query=malloc&sektion=3

>

> >

>

> >When using malloc() be careful to avoid the following idiom:

>

> >

>

> > if ((p = malloc(num * size)) == NULL)

>

> > err(1, "malloc");

>

> >

>

> >Pourquoi ne pas utiliser ce test == NULL ?

>

>

>

> Ah, ces jeunes. Une phrase d'attention, et apres hop on passe a autre

>

> chose.

>

>

>

> (l'explication d'Erwann complete. Evidemment, il *faut* lire la suite)
espie
Le #25551682
In article ja
J'ai quand même une autre question suite à la première. Après la lecture
du man, tjrs par curiosité je regarde un peu les sources et je constate
qu'a chaque malloc, il n'y a pas d'init des pointeurs à NULL ni de test
sur NULL.

Pourquoi ? :)



Non, mais t'es lourd. Non seulement tu lis les pages a moitie, mais
maintenant tu poses des questions incompletes.

Les sources de quoi exactement ?

et pourquoi tu voudrais initialiser des pointeurs a NULL ?
ja
Le #25552062
Un exemple : sys/kern/kern_sysctl.c ligne 1631. Encore une fois, c'est pour comprendre.

Pourquoi buf n'est pas init à NULL et pourquoi ya pas ce fameux test sur null lors du malloc.

cdt

Le jeudi 18 juillet 2013 23:49:38 UTC+2, Marc Espie a écrit :
In article

>J'ai quand même une autre question suite à la première. Après la lecture

>du man, tjrs par curiosité je regarde un peu les sources et je constat e

>qu'a chaque malloc, il n'y a pas d'init des pointeurs à NULL ni de tes t

>sur NULL.

>

>Pourquoi ? :)



Non, mais t'es lourd. Non seulement tu lis les pages a moitie, mais

maintenant tu poses des questions incompletes.



Les sources de quoi exactement ?



et pourquoi tu voudrais initialiser des pointeurs a NULL ?
espie
Le #25552112
In article ja
Un exemple : sys/kern/kern_sysctl.c ligne 1631. Encore une fois, c'est
pour comprendre.

Pourquoi buf n'est pas init à NULL et pourquoi ya pas ce fameux test sur
null lors du malloc.



Parce que ca n'est pas malloc(3) mais malloc(9)

T'es en train de confondre userland et noyau. C'est pas du tout du
tout la meme fonction. Deja, le nombre de parametres n'est pas le meme.

Gros indice: M_WAITOK.

(ah et puis moi je n'ai pas de malloc a la ligne 1631 de
sys/kern/kern_sysctl.c, tu as encore oublie un detail, qui est de
preciser de quelle version tu parles... sans doute un noyau 5.2 ou 5.3).

Je repose ma question: pourquoi diable voudrais-tu mettre buf a 0
avant le malloc ? c'est des guidelines que tu as vu ailleurs ? elles sont
sans interet ! Elles vont juste rajouter du bruit.
Manuel Giraud
Le #25552142
ja
Un exemple : sys/kern/kern_sysctl.c ligne 1631. Encore une fois, c'est
pour comprendre.



Ben c'est même pas le même malloc (c.f. le nombre d'argument). Il faut,
du coup, comprendre sys/kern/kern_malloc.c. Et j'imagine que si un
malloc de PAGE_SIZE dans le noyau foire à cet endroit c'est la panic
assurée.
--
Manuel Giraud
ja
Le #25552252
En fait en lisant qques livres (peut être trop scolaire) j'ai souvent vu que les auteurs conseillaient de déclarer un pointeur puis de l'initialis er à NULL afin de ne pas oublier de l’allouer plus tard dans le code.

Voici deux exemples :

Figure 2.4 http://books.google.fr/books?id=jfn1IAN3dvwC&pg=PT67&lpg=P P1&dq=secure+programming+c&hl=fr du livre "Secure Coding in C and C++"

p337 du livre "Programmation système en C sous Linux" : http://books.goog le.fr/books?idçtyMAntgaAC&pg=PA337&dq=malloc+null&hl=fr&sa=X&ei =tQLpUfr8NsnMOM_TgPAK&ved DcQuwUwAA#v=onepage&q=malloc%20null&f úlse

Après, peut être que c'est inutile ? peut être que le compilateur ini t à 0 par défaut ?

Désolé, kern_sysctl.c était effectivement pas un très bon exemple.

Le vendredi 19 juillet 2013 10:02:13 UTC+2, Marc Espie a écrit :
In article
ja wrote:

>Un exemple : sys/kern/kern_sysctl.c ligne 1631. Encore une fois, c'est

>pour comprendre.

>

>Pourquoi buf n'est pas init à NULL et pourquoi ya pas ce fameux test s ur

>null lors du malloc.



Parce que ca n'est pas malloc(3) mais malloc(9)



T'es en train de confondre userland et noyau. C'est pas du tout du

tout la meme fonction. Deja, le nombre de parametres n'est pas le meme.



Gros indice: M_WAITOK.



(ah et puis moi je n'ai pas de malloc a la ligne 1631 de

sys/kern/kern_sysctl.c, tu as encore oublie un detail, qui est de

preciser de quelle version tu parles... sans doute un noyau 5.2 ou 5.3).



Je repose ma question: pourquoi diable voudrais-tu mettre buf a 0

avant le malloc ? c'est des guidelines que tu as vu ailleurs ? elles sont

sans interet ! Elles vont juste rajouter du bruit.
Olivier Miakinen
Le #25552282
Bonjour,

Le 19/07/2013 11:41, ja a écrit :
En fait en lisant qques livres (peut être trop scolaire) j'ai souvent
vu que les auteurs conseillaient de déclarer un pointeur puis de
l'initialiser à NULL afin de ne pas oublier de l’allouer plus tard
dans le code.

Voici deux exemples :

Figure 2.4 http://books.google.fr/books?id=jfn1IAN3dvwC&pg=PT67&lpg=PP1&dq=secure+programming+c&hl=fr du livre "Secure Coding in C and C++"



Je vois la figure 2-3 où le pointeur est initialisé directement avec
le retour de malloc() (et donc pas à NULL), mais je ne vois pas la
figure 2-4.

p337 du livre "Programmation système en C sous Linux" : http://books.google.fr/books?idçtyMAntgaAC&pg=PA337&dq=malloc+null&hl=fr&sa=X&ei=tQLpUfr8NsnMOM_TgPAK&ved DcQuwUwAA#v=onepage&q=malloc%20null&fúlse



Ici, le pointeur est initialisé à NULL pour le cas où on ne ferait pas
de malloc (si « ancienne » vaut NULL).

Après, peut être que c'est inutile ? peut être que le compilateur init à 0 par défaut ?



Non, il n'y a pas d'initialisation à 0 par défaut dans ce cas, et
c'est donc utile de la faire dans le cas ci-dessus. En revanche,
on avait l'impression que tu parlais d'un cas tel que ci-dessous,
et là ce serait *vraiment* inutile :

{
char *buf = NULL;

buf = malloc(...):
...
}

Le vendredi 19 juillet 2013 10:02:13 UTC+2, Marc Espie a écrit :
In article
[citation intégrale]





Publicité
Poster une réponse
Anonyme