Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Question sur malloc - OpenBSD

16 réponses
Avatar
ja
Je suis en train de lire par curiosit=E9 cette page de man OpenBSD sur mall=
oc et je tombe sur cette phrase :=20

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

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

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

Pourquoi ne pas utiliser ce test =3D=3D NULL ?

Cordialement

10 réponses

1 2
Avatar
Erwan David
ja écrivait :

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é
Avatar
espie
In article ,
ja wrote:
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)
Avatar
ja
Ok merci :)

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

ja wrote:

>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)
Avatar
ja
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 wrote:

>

> >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)
Avatar
espie
In article ,
ja wrote:
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 ?
Avatar
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.

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 ?
Avatar
espie
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 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.
Avatar
Manuel Giraud
ja writes:

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
Avatar
ja
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.
Avatar
Olivier Miakinen
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]





<http://www.usenet-fr.net/fur/usenet/repondre-sur-usenet.html>, merci.
1 2