OVH Cloud OVH Cloud

Beuuurk !

87 réponses
Avatar
Cyrille Szymanski
En me balladant tranquillement dans les sources de la libc de
FreeBSD, j'ai rencontré un petit bout de code effrayant au
détour de malloc.c :

/* If it's empty, make a page more of that size chunks */
if (!page_dir[j] && !malloc_make_chunks(j))
return 0;

C'est pas très beau ça quand même, mais on dirait que ça
fonctionne... pour combien de temps ?

--
cns

10 réponses

1 2 3 4 5
Avatar
Miod Vallat
En me balladant tranquillement dans les sources de la libc de
FreeBSD, j'ai rencontré un petit bout de code effrayant au
détour de malloc.c :

/* If it's empty, make a page more of that size chunks */
if (!page_dir[j] && !malloc_make_chunks(j))
return 0;


En quoi est-il effrayant ?

Le seul reproche esthétique qu'on puisse lui faire c'est de comparer
page_dir[] à zéro plutôt que NULL (et pareil pour la valeur renvoyée).

Si malloc_make_chunks() renvoie zéro, il n'y a plus de mémoire, de
toutes façons...

Avatar
Cyrille Szymanski
On 2004-04-21, Miod Vallat wrote:
En me balladant tranquillement dans les sources de la libc de
FreeBSD, j'ai rencontré un petit bout de code effrayant au
détour de malloc.c :

/* If it's empty, make a page more of that size chunks */
if (!page_dir[j] && !malloc_make_chunks(j))
return 0;


En quoi est-il effrayant ?


En écrivant "!page_dir[j] && !malloc_make_chunks(j)", le gars
veut dire, appelle malloc_make_chunks() que si page_dir[] est
égal à 0 (ou NULL si tu veux).

Je vois bien que ça fonctionne, et c'est peut-être même écrit
dans la norme du C que ça doit être interprété comme ça. Mais
pour la clarté du code c'est pas top.

Ou alors c'est que je suis pas habitué.

--
cns


Avatar
Vincent
Cyrille Szymanski dixit :

En écrivant "!page_dir[j] && !malloc_make_chunks(j)", le gars
veut dire, appelle malloc_make_chunks() que si page_dir[] est
égal à 0 (ou NULL si tu veux).
Je vois bien que ça fonctionne, et c'est peut-être même écrit
dans la norme du C que ça doit être interprété comme ça. Mais
pour la clarté du code c'est pas top.


Ben c'est même dans l'édition originale du K&R ce genre de choses. Comme
quoi, ça date pas d'hier...

Vincent

Avatar
Marwan Burelle
On 21 Apr 2004 12:59:47 GMT
Vincent wrote:

En écrivant "!page_dir[j] && !malloc_make_chunks(j)", le gars
veut dire, appelle malloc_make_chunks() que si page_dir[] est
égal à 0 (ou NULL si tu veux).
Je vois bien que ça fonctionne, et c'est peut-être même écrit
dans la norme du C que ça doit être interprété comme ça. Mais
pour la clarté du code c'est pas top.


Ben c'est même dans l'édition originale du K&R ce genre de choses.
Comme quoi, ça date pas d'hier...


Effectivement, && est un "et" feignant, c'est sa sémantique, donc il n'y
a pas de problème à l'utiliser pour ce genre de chose.

Maintenant question lisibilité ... éventuellement, on peut critiquer,
mais bien des fois, si lisibilité impose un code moins compact et donc
probablement moins "efficace", mieux vaut laisser tomber le C ;)

Mais vous, comment l'écrireriez vous ?

--
Burelle Marwan,
Equipe Bases de Donnees - LRI
http://www.cduce.org
( | )


Avatar
Cyrille Szymanski
On 2004-04-21, Marwan Burelle wrote:
On 21 Apr 2004 12:59:47 GMT
Vincent wrote:

Ben c'est même dans l'édition originale du K&R ce genre de choses.
Comme quoi, ça date pas d'hier...


Effectivement, && est un "et" feignant, c'est sa sémantique, donc il n'y
a pas de problème à l'utiliser pour ce genre de chose.


Ok, c'est sûrement une question d'habitude.

Maintenant question lisibilité ... éventuellement, on peut critiquer,
mais bien des fois, si lisibilité impose un code moins compact et donc
probablement moins "efficace", mieux vaut laisser tomber le C ;)

Mais vous, comment l'écrireriez vous ?


Bonne question.

/* If it's empty, make a page more of that size chunks */
if( page_dir[j]==NULL ) {
if( malloc_free_chunks(j)==NULL )
return 0;
}

Je pense qu'au niveau du code généré c'est équivalent.
Mais comme on dit, les goûts et les couleurs ne se discutent pas,
tant que ça fonctionne...

--
cns


Avatar
manu
Cyrille Szymanski wrote:

Je vois bien que ça fonctionne, et c'est peut-être même écrit
dans la norme du C que ça doit être interprété comme ça. Mais
pour la clarté du code c'est pas top.

Ou alors c'est que je suis pas habitué.


T'es pas habitué :)

--
Emmanuel Dreyfus
Un bouquin en français sur BSD:
http://www.eyrolles.com/php.informatique/Ouvrages/9782212112443.php3


Avatar
Vincent
Marwan Burelle dixit :

Maintenant question lisibilité ... éventuellement, on peut critiquer,
mais bien des fois, si lisibilité impose un code moins compact et donc
probablement moins "efficace", mieux vaut laisser tomber le C ;)
Mais vous, comment l'écrireriez vous ?


Avec des trigraphes ? :)

Vincent

Avatar
Miod Vallat
/* If it's empty, make a page more of that size chunks */
if( page_dir[j]==NULL ) {
if( malloc_free_chunks(j)==NULL )
return 0;
}


Ce qui est beaucoup plus lisible et qui est moins sujet a erreur lors
d'une evolution de code.


Non, car c'est un couple d'opération qui a une sémantique symbolique.

La logique ici, c'est «j'ai besoin d'un bloc». Et l'existence d'un bloc
s'exprime sous la forme «j'en ai déjà un, ou je parviens à en créer un»,
qui correspond au code initial.

Le fait que le test && soit une évaluation booléenne paresseuse est une
«feature», mais justement parce que c'est la façon humaine naturelle de
procéder.

En fait, il y a un bug mineur dans ce code : tous les chemins de code
conduisant à renvoyer NULL ne fixent pas errno à ENOMEM.

Il y en a toujours pour penser que coder de facon illisible (donc
comme un goret) ca fait "31337" ("elite" en langage elite de goret).
Mais bon si ca leur fait plaisir on va pas gacher leur bonheur :)


Ah, c'est sûr que, en Ruby, on ne laisse pas au programmeur la
responsabilité de gérer la mémoire, ce serait trop dangereux.


Avatar
mips
On 21 Apr 2004 13:32:24 GMT
Cyrille Szymanski wrote:

Mais vous, comment l'écrireriez vous ?


Bonne question.

/* If it's empty, make a page more of that size chunks */
if( page_dir[j]==NULL ) {
if( malloc_free_chunks(j)==NULL )
return 0;
}


Ce qui est beaucoup plus lisible et qui est moins sujet a erreur lors
d'une evolution de code.

Je pense qu'au niveau du code généré c'est équivalent.


Je pense de meme.

Mais comme on dit, les goûts et les couleurs ne se discutent pas,
tant que ça fonctionne...


Il y en a toujours pour penser que coder de facon illisible (donc
comme un goret) ca fait "31337" ("elite" en langage elite de goret).
Mais bon si ca leur fait plaisir on va pas gacher leur bonheur :)

mips


Avatar
Miod Vallat
Ah, moi je voyais plutot ca du cote feignant : pourquoi faire quelque
chose soi-meme quand le language peut le faire de facon transparente.
Et en plus ca simplifie le code, que demande le peuple ? (a part le


Mais ça ne simplifie pas le code, puisqu'il devient plus gros,
verticalement...

1 2 3 4 5