Article View: de.comp.os.linux
Article #45Re: BUG im gcc ??? (strlen)
From: Anselm Lingnau
Date: Wed, 21 Feb 1996 08:59
Date: Wed, 21 Feb 1996 08:59
62 lines
3367 bytes
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-mailReferences:
<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