🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: fr.comp.lang.c
Article #15653

Re: post/pre incrementations et bugs de compilos

#15653
From: Antoine Leca
Date: Wed, 14 Sep 2005 14:01
104 lines
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-mail
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>

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