Article View: fr.comp.lang.c
Article #15653Re: post/pre incrementations et bugs de compilos
From: Antoine Leca
Date: Wed, 14 Sep 2005 14:01
Date: Wed, 14 Sep 2005 14:01
104 lines
5128 bytes
5128 bytes
En <news:pxbmzmfyjrf.fsf@news.bourguet.org>,
Jean-Marc Bourguet va escriure:
> Ce n'est permis evidemment que quand ces parametres sont des
> expressions sans appels de fonction, sinon il y a quelques points de
> sequencement en plus
Oui.
> (mais leur ordre relatif n'est pas fixe).
Oui.
> Pour reprendre mon exemple:
>
> int incr(int* i) {
> return (*i)++;
> }
> i = 0;
> k = f(incr(i), incr(i));
Mmmh, avoir deux objets nomm�s i n'aide pas...
> ici on est sur que l'appel a f se fait avec a=0 et b=1 ou a=1 et b=0.
> (Ou alors il y a autre chose qui m'echappe).
Bon, � moi il y a beaucoup de choses qui m'�chappent ;-)
Tu as fait beaucoup trop de copier-coller avant de poster :-)
Alors, on part de main::i (qui est donc devenu int*), initialis� � NULL (!)
Bouh. On va donc corriger cela pour �crire plut�t
k = f(incr(&i), incr(&i)); /* ;-) */
Reprenons : on part de main::i, initialis� � 0. Dans le contexte de l'appel
de la fonction f, avant le point de s�quence de l'appel, nous avons deux
appels (ind�pendants, th�oriquement ex�cutables sur deux processeurs
distincts pour reprendre le cas de Chqrlie) ; vu que les deux appels
modifient tous les deux l'objet main::i, il faut s'attendre � des soucis
;-).
Certes, chacun des deux appels � incr sont OK : pour chacun d'entre eux, on
cr�e un objet (avec type pointeur, incr::i), on lui donne une valeur
(&main::i), on a un point de s�quence dans le sous-fil (sans effet notable),
puis deux op�rations s�rialis�es (affectation du r�sultat et
incr�mentation), puis un autre point de s�quence, puis destruction de
incr::i et mise � disposition du r�sultat.
Mais ces points de s�quence n'affectent _pas_ l'autre appel � incr (on se
demande bien comment il ferait).
R�sultat, le comportement est ind�fini.
> Plus subtil, est-ce que
>
> k = f(incr(i), i++);
>
> a les memes garanties?
De comportement ind�fini ? Oui.
> Naturellement, je laisse
>
> int j = 0;
> incr(int*i) { j++; return (*i)++;}
> k = f(incr(i), i++ + j++);
>
> a ceux qui veulent reellement s'amuser.
Tu penses probablement �
int j = 0; /*globale*/
static int incr(int*p) { j++; return (*p)++;} /*changement de nom*/
extern int f(int a, int b);
int main(){
int i=0;
return k= f(incr(&i), i++ + j++); }
i est modifi� deux fois avant l'appel � f, j aussi, le comportement est
ind�fini (deux fois).
Un compilateur moyennement optimisateur va simplifier cela en
return k= f( (0, j++, i++), i++ + j++); }
(le 0, repr�sente le point de s�quence � l'appel de incr), et le probl�me
devrait �tre �vident.
> Une chose qui m'echappe c'est un exemple realiste ou ca apporte un
> gain et ou la regle du "as-if" ne permet pas le meme gain.
Je ne comprend pas la question. Gain pour qui ?
La r�gle de comportement ind�fini vient du fait qu'avant la normalisation,
on rendontrait les diff�rentes possibilit�s dans la nature (quelquefois sur
le m�me compilo avec des options diff�rentes), et rien ne justifiait de
privil�gier un sens plut�t qu'un autre ; et au contraire on voyait bien le
parti que pouvait tirer les optimisateurs sur la possibilit� d'ordonner les
�valuations de sous-expressions � leur guise, y compris dans les expressions
complexes quand il y a p�nurie de registres (spilling).
Donc la libert� a �t� donn�e aux compilateurs, et pas aux programmeurs.
Antoine
Technical Details
Message-ID:
<dg9afr$kas$1@shakotay.alphanet.ch>Path:
arc1-ca.pugleaf.net!g2news1.google.com!news2.google.com!proxad.net!212.101.4.254.MISMATCH!solnet.ch!solnet.ch!news.imp.ch!news.imp.ch!80.83.46.147.MISMATCH!news.alphanet.ch!alphanet.ch!not-for-mailReferences:
<43207e0a$0$162$a3f2974a@nnrp1.numericable.fr> <dfrnh7$j63$1@news.hispeed.ch> <dfrvtp$j9u$1@shakotay.alphanet.ch> <4321fb01$0$21296$7a628cd7@news.club-internet.fr> <mn.52367d59df2fc1aa.31483@laposte.net> <dg23un$9f5$1@reader1.imaginet.fr> <pxbhdcq1z5u.fsf@news.bourguet.org> <dg3iss$p5s$1@shakotay.alphanet.ch> <pxb8xy21qk8.fsf@news.bourguet.org> <dg8pns$gto$1@reader1.imaginet.fr> <pxbmzmfyjrf.fsf@news.bourguet.org>Show Full Headers
Complete Article Headers
X-Google-Thread: f9822,d07db62495be07f8 X-Google-Attributes: gidf9822,public X-Google-Language: FRENCH,ASCII Path: arc1-ca.pugleaf.net!g2news1.google.com!news2.google.com!proxad.net!212.101.4.254.MISMATCH!solnet.ch!solnet.ch!news.imp.ch!news.imp.ch!80.83.46.147.MISMATCH!news.alphanet.ch!alphanet.ch!not-for-mail From: "Antoine Leca" <root@localhost.invalid> Newsgroups: fr.comp.lang.c Subject: Re: post/pre incrementations et bugs de compilos Date: Wed, 14 Sep 2005 16:01:30 +0200 Organization: Posted through ALPHANET (http://www.alphanet.ch/) Lines: 105 Sender: antoinel@143.red-217-127-250.pooles.rima-tde.net Message-ID: <dg9afr$kas$1@shakotay.alphanet.ch> References: <43207e0a$0$162$a3f2974a@nnrp1.numericable.fr> <dfrnh7$j63$1@news.hispeed.ch> <dfrvtp$j9u$1@shakotay.alphanet.ch> <4321fb01$0$21296$7a628cd7@news.club-internet.fr> <mn.52367d59df2fc1aa.31483@laposte.net> <dg23un$9f5$1@reader1.imaginet.fr> <pxbhdcq1z5u.fsf@news.bourguet.org> <dg3iss$p5s$1@shakotay.alphanet.ch> <pxb8xy21qk8.fsf@news.bourguet.org> <dg8pns$gto$1@reader1.imaginet.fr> <pxbmzmfyjrf.fsf@news.bourguet.org> NNTP-Posting-Host: 143.red-217-127-250.pooles.rima-tde.net Mime-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 8bit X-Trace: shakotay.alphanet.ch 1126706491 20828 217.127.250.143 (14 Sep 2005 14:01:31 GMT) X-Complaints-To: usenet@alphanet.ch NNTP-Posting-Date: Wed, 14 Sep 2005 14:01:31 +0000 (UTC) X-Priority: 3 X-MSMail-Priority: Normal X-Newsreader: Microsoft Outlook Express 6.00.2800.1506 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1506