Warning: Cannot modify header information - headers already sent by (output started at /home/gillesbld/www/weblog/inc/config.php:41) in /home/gillesbld/www/weblog/inc/clearbricks/common/lib.http.php on line 222
Warning: Cannot modify header information - headers already sent by (output started at /home/gillesbld/www/weblog/inc/config.php:41) in /home/gillesbld/www/weblog/inc/clearbricks/common/lib.http.php on line 224
Warning: Cannot modify header information - headers already sent by (output started at /home/gillesbld/www/weblog/inc/config.php:41) in /home/gillesbld/www/weblog/inc/public/lib.urlhandlers.php on line 65
Warning: Cannot modify header information - headers already sent by (output started at /home/gillesbld/www/weblog/inc/config.php:41) in /home/gillesbld/www/weblog/inc/clearbricks/common/lib.http.php on line 247 Embedded weblog - Tag - bsd - Commentaires2014-05-14T10:00:05+02:00Gilles Blancurn:md5:b402c09b50e67198753bdd4269dc5b19Dotcleardecreasing the size of the distribution [OpenBSD] - Gilles Blancurn:md5:d97acd8aa264ac7ff1f47a8e71cf246c2009-10-27T10:16:58+01:00Gilles Blanc<p>PF/OSPF/CARP</p>
<p>Et vraiment, que ça. N'empêche, parfois, il n'y a pas le choix.</p>
<p>Et puis, c'est sous licence permissive BSD, aussi... (mais à ce niveau, si c'est juste pour cette raison, aller voir du côté de Net ou Free est meilleur, à mon sens -- l'histoire de la sécurité et du strlcat et compagnie, ça reste tout de même de la blague)</p>decreasing the size of the distribution [OpenBSD] - Xuelynomurn:md5:44d28111c50b2db2ab68f029120f085c2009-10-26T21:05:50+01:00Xuelynom<p>Haha excellent :D</p>
<p>A se demander pourquoi des gens restent encore sur ce système.... (à part les barbus en charge)</p>au détour d'une macro crasseuse - Gilles Blancurn:md5:bb82d071c136d8af17290dd55c442f542009-08-28T18:59:46+02:00Gilles Blanc<p>Eh bien, tu t'es lâché dis-moi ! ^^ Tiens, <a hreflang="en" href="http://www.openbsd.org/cgi-bin/cvsweb/src/bin/date/date.c?rev=1.31;content-type=text%2Fx-cvsweb-markup" rel="nofollow">v'la le code</a>, la fonction setthetime qui utilise cette horreur vaut aussi le coup d'oeil...</p>au détour d'une macro crasseuse - Patrick Foubeturn:md5:8ed4db9e4007ff40dd7f51f03cbeb9fd2009-08-28T17:25:01+02:00Patrick Foubet<p>En fait, comme toujours sur un blog, on va à l'essentiel et on néglige les détails, c'est pourquoi souvent les commentaires qu'on y trouve sont mals perçus.<br />
Donc là, comme c'est le tien (de blog), j'ai un remords et je vais essayer de réparer mon manque d'explication (si j'y arrive) ;-)</p>
<p>Voici un petit programme, que j'appelle e.c, dans lequel j'ai défini :<br />
- la macro ATOI2 vue ci-dessus<br />
- la macro ATOI2a que j'ai proposée en échange<br />
- la macro ATOI2b qui est encore une autre version<br />
Dans un premier temps je n'utilise pas ces macros mais "atoi" de la librairie standard.</p>
<p>#define ATOI2(ar) ((ar) += 2, ((ar)[-2] - '0') * 10 + ((ar)[-1] - '0'))<br />
#define ATOI2a(ar) ((ar)[0] - '0') * 10 + ((ar)[1] - '0')<br />
#define ATOI2b(ar) (((ar++)[0] - '0') * 10 + ((ar++)[0] - '0') )</p>
<p>#include <stdio.h></p>
<p>int main(int N, char*P[])<br />
{<br />
char t[10], *b;<br />
int i,j,k;<br />
strcpy(t,"256789");<br />
b=t;<br />
i = atoi(t); /* ligne 13 */<br />
j = atoi(b);<br />
k = atoi("791234"); /* ligne 15 */<br />
printf(" i=%d j=%d k=%d t=<%s> b=<%s>
",i, j, k, t, b);<br />
}</p>
<p>Je compile :<br />
$ cc -o e e.c<br />
Pas de problème particulier.<br />
J'exécute :<br />
$ ./e<br />
i=256789 j=256789 k=791234 t=<256789> b=<256789><br />
Rien que du classique.</p>
<p>Maintenant je remplace dans les lignes 13 à 15, atoi par ATOI2, macro qui ne travaille que sur les deux premiers caractères et qui en plus fait progresser le pointeur de 2 crans.</p>
<p>Je compile :<br />
$ cc -o e e.c<br />
e.c: Dans la fonction « main »:<br />
e.c:13: error: incompatible types in affectation<br />
e.c:15: error: affectation of read-only location<br />
e.c:15: error: incompatible types in affectation</p>
<p>Hé oui ! car une des raisons est que l'on essaie d'accéder aux éléments d'une chaîne de caractère définie comme une constante (ligne 15).<br />
Ceci avec gcc peut se résoudre (bien que ce soit fortement déconseillé) par :<br />
$ cc -o e -fwritable-strings e.c<br />
e.c: Dans la fonction « main »:<br />
e.c:13: error: incompatible types in affectation<br />
e.c:15: error: incompatible types in affectation</p>
<p>Il reste quand même que, selon l'implémentation faite par le compilateur, un tableau de caractères et une chaîne constante ne sont pas toujours assimilables à un pointeur !! (cf K&R pour les détails). On peut les utiliser pour initialiser un pointeur mais pas pour faire des opérations dessus.<br />
Certains compilateurs le permettent (comme par exemple le cc d'un Aix que j'ai utilisé dans les années 90) mais il ne faut pas compter dessus !!</p>
<p>Par contre, si on remplace, entre les lignes 13 et 15, atoi par ATOI2a on a bien le résultat sur les 2 premiers caractères mais le pointeur n'est pas décallé de 2 !! Il faut le faire à la main.</p>
<p>Pour bien enfoncer le clou, je propose une seconde alternance, qui fait la même chose que ATOI2 mais sans l'instruction ','. Si on remplace atoi par ATOI2b, on a, à la compilation :<br />
$ cc -o e e.c<br />
e.c: Dans la fonction « main »:<br />
e.c:13: error: wrong type argument to increment<br />
e.c:13: error: wrong type argument to increment<br />
e.c:15: error: wrong type argument to increment<br />
e.c:15: error: wrong type argument to increment</p>
<p>Ce qui confirme bien la raison décrite ci-dessus.<br />
On remarque au passage que l'utilisation des index négatifs ne perturbe pas le compilateur, et c'est normal.</p>
<p>Et voilà tout ce qui se cachait derrière mon laconique "avec un gcc 3.3.5 le code que tu signales ne passe pas" !</p>
<p>Comme quoi, on veut dire deux mots en passant et on y passe la soirée ...</p>
<p>Bien à toi</p>au détour d'une macro crasseuse - Gilles Blancurn:md5:b65fed26bf720f7b905f868b9e0d1afc2009-08-27T11:40:28+02:00Gilles Blanc<p>Pourtant, c'est un gcc3.3.5 qu'il y a sur BSD 4.2 ; mais il faut dire qu'ils l'ont tellement bidouillé, aussi...</p>au détour d'une macro crasseuse - Patrick Foubeturn:md5:36eda3d9259d65482608334d76efb4072009-08-27T11:15:26+02:00Patrick Foubet<p>Autant pour moi !! Je voulais écrire :<br />
#define ATOI2(ar) ((ar)[0] - '0') * 10 + ((ar)[1] - '0')<br />
Comme quoi la critique est une arme à double tranchant ;-)</p>
<p>En tous cas, avec un gcc 3.3.5 le code que tu signales ne passe pas !!</p>au détour d'une macro crasseuse - Patrick Foubeturn:md5:fd6721cdc4cf1a41d8f2b855e41221e02009-08-26T17:43:00+02:00Patrick Foubet<p>Je ne sais pas ce que le programmeur d'OpenBSD a fumé avant d'écrire cela mais :<br />
#define ATOI2(ar) ((ar)[-2] - '0') * 10 + ((ar)[-1] - '0')<br />
est quand même plus simple, plus rapide et fonctionne avec tous les compilateurs ;-)</p>au détour d'une macro crasseuse - Gilles Blancurn:md5:069a7f1c6af78e9fe46935e5f1bbce412009-05-28T16:38:24+02:00Gilles Blanc<p>Aaaahhh, bien vu l'expert ! :)</p>au détour d'une macro crasseuse - Samurn:md5:1a9dba419d64cd97a7b52ee845ec5ecd2009-05-27T18:45:08+02:00Sam<p>Cela dit, aujourd'hui, il n'y aurait aucune raison de ne pas le coder comme une fonction :</p>
<p>static inline unsigned char atoi2(const char **ar);</p>
<p>Mais nous sommes en 2009, les compilateurs n'étaient probablement pas aussi efficace à l'époque où cette macro a été codée.</p>au détour d'une macro crasseuse - Samurn:md5:dbbf8c54ac5471165a019a176c7b28052009-05-27T18:31:41+02:00Sam<p>Pourtant, tu as probablement déjà utilisé la virgule comme opérateur, par exemple dans "i++, j++" comme troisième argument d'un "for".</p>
<p>Ce genre d'utilisations est assez fréquente si on ne veut pas utiliser les extensions de GCC qui permettent d'avoir des blocs "{}" renvoyant un résultat, similaires à une lambda expression et permettant même d'y mettre des boucles du coup.</p>