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 - Commentaires 2014-05-14T10:00:05+02:00 Gilles Blanc urn:md5:b402c09b50e67198753bdd4269dc5b19 Dotclear decreasing the size of the distribution [OpenBSD] - Gilles Blanc urn:md5:d97acd8aa264ac7ff1f47a8e71cf246c 2009-10-27T10:16:58+01:00 Gilles 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] - Xuelynom urn:md5:44d28111c50b2db2ab68f029120f085c 2009-10-26T21:05:50+01:00 Xuelynom <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 Blanc urn:md5:bb82d071c136d8af17290dd55c442f54 2009-08-28T18:59:46+02:00 Gilles Blanc <p>Eh bien, tu t'es lâché dis-moi ! ^^&nbsp; 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 Foubet urn:md5:8ed4db9e4007ff40dd7f51f03cbeb9fd 2009-08-28T17:25:01+02:00 Patrick 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 &lt;stdio.h&gt;</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=&lt;%s&gt; b=&lt;%s&gt; ",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=&lt;256789&gt; b=&lt;256789&gt;<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&amp;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 Blanc urn:md5:b65fed26bf720f7b905f868b9e0d1afc 2009-08-27T11:40:28+02:00 Gilles 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 Foubet urn:md5:36eda3d9259d65482608334d76efb407 2009-08-27T11:15:26+02:00 Patrick 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 Foubet urn:md5:fd6721cdc4cf1a41d8f2b855e41221e0 2009-08-26T17:43:00+02:00 Patrick 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 Blanc urn:md5:069a7f1c6af78e9fe46935e5f1bbce41 2009-05-28T16:38:24+02:00 Gilles Blanc <p>Aaaahhh, bien vu l'expert !&nbsp; :)</p> au détour d'une macro crasseuse - Sam urn:md5:1a9dba419d64cd97a7b52ee845ec5ecd 2009-05-27T18:45:08+02:00 Sam <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 - Sam urn:md5:dbbf8c54ac5471165a019a176c7b2805 2009-05-27T18:31:41+02:00 Sam <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>