🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: de.comp.os.linux
Article #45

Re: BUG im gcc ??? (strlen)

#45
From: Anselm Lingnau
Date: Wed, 21 Feb 1996 08:59
62 lines
3367 bytes
Im Artikel <4gcc9n$bpm@sparcserver.lrz-muenchen.de> schrieb
Wolfram Gloger <Gloger@lrz.uni-muenchen.de>:

> Ich meinte folgendes: Im Ausdruck
> 
> int i; unsigned u; double d;
> 
> i + u + d;
> 
> muss zuerst i nach unsigned gecasted werden, bevor dann das Resultat
> von i + u zu double wird und mit d verknuepft wird.  Es darf nicht
> zuerst u zu double gecasted werden und dann i direkt nach double
> gecasted werden (wenn was anderes rauskommen wuerde).  Oder ?

Genau. Die Semantik von C bezieht sich auf eine `abstrakte Maschine',
in der Optimierung irrelevant ist. Alle Optimierungen, die ein C-Compiler
vornimmt, m"ussen dasselbe Ergebnis bewirken wie das, das die abstrakte
Maschine liefern w"urde.

Die `Assoziativit"at' in der Sprachbeschreibung bezieht sich also auf die
Interpretation eines Ausdrucks in der abstrakten Maschine, also der
Festlegung von dem, was `herauskommen muss'.

Im Beispiel wird der Ausdruck von der AM als (i + u) + d interpretiert.
Ein gegebener C-"Ubersetzer kann diesen Ausdruck beliebig `optimieren',
solange das Ergebnis des optimierten Codes dasselbe ist wie das, was
der vom selben Compiler erzeugte `unoptimierte' Code (also der, der exakt
der AM-Interpretation entspricht) liefert.

> Wenn nicht, was heisst dann eigentlich, `von links assoziativ' ?

Wie gesagt, die Assoziativit"atsangaben beziehen sich auf die
Interpretation eines Ausdrucks in der `abstrakten Maschine', also die
Bestimmung des `richtigen' Ergebnisses. Bei den angesprochenen Beispielen
sind die Unterschiede nicht leicht zu sehen; es wird interessant, wenn
man Overflow usw. einbezieht. Ein Beispiel (aus ISO/IEC 9899):

Im Programmfragment

	int a, b;
	...
	a = a + 32760 + b + 5;

wird der Ausdruck wie `a = (((a + 32760) + b) + 5)' interpretiert,
massgeblich daf"ur sind Vorrang und Assoziativit"at der beteiligten
Operatoren `+' und `='. Nehmen wir nun eine C-Implementierung an, bei
der "Uberlauf einen Fehler ausl"ost und in einem `int' ganze Zahlen im
Intervall [-32768,+32767] dargestellt werden k"onnen. Eine solche
Implementierung darf den oben genannten Ausdruck nicht zu

	a = ((a + b) + 32765)

umschreiben, denn wenn a = -32754 und b = -15 w"are, w"urde die Summe
`(a + b)' einen "Uberlauf produzieren und der urspr"ungliche Code nicht.
Bei einer Implementierung, wo "Uberl"aufe keine Fehler ausl"osen und ihre
Wirkung umkehrbar ist, ist die Optimierung erlaubt.

Anselm
-- 
Anselm Lingnau ......................... lingnau@tm.informatik.uni-frankfurt.de
Insisting on perfect safety is for people who don't have the balls to live
in the real world.                            --- Mary Shafer, NASA Ames Dryden
Technical Details
Message-ID: <4gemsv$ehv@rigel.tm.informatik.uni-frankfurt.de>
Path: arc1-ca.pugleaf.net!zeus.rbi.informatik.uni-frankfurt.de!not-for-mail
References: <4ga36v$6tv@picard.toppoint.de> <4gb0ub$h6o@sparcserver.lrz-muenchen.de> <4gca39$7p4@rigel.tm.informatik.uni-frankfurt.de> <4gcc9n$bpm@sparcserver.lrz-muenchen.de>

Show Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!zeus.rbi.informatik.uni-frankfurt.de!not-for-mail
From: Anselm Lingnau <lingnau@tm.informatik.uni-frankfurt.de>
Newsgroups: de.comp.os.linux,de.comp.lang.c
Subject: Re: BUG im gcc ??? (strlen)
Date: 21 Feb 1996 09:59:11 +0100
Organization: Dept. of Computer Science, University of Frankfurt, Germany
Sender: lingnau@rigel.tm.informatik.uni-frankfurt.de
Message-ID: <4gemsv$ehv@rigel.tm.informatik.uni-frankfurt.de>
References: <4ga36v$6tv@picard.toppoint.de> <4gb0ub$h6o@sparcserver.lrz-muenchen.de> <4gca39$7p4@rigel.tm.informatik.uni-frankfurt.de> <4gcc9n$bpm@sparcserver.lrz-muenchen.de>
NNTP-Posting-Host: rigel.tm.informatik.uni-frankfurt.de