Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

urkomischer "Fehler" in switch-Anweisung

14 views
Skip to first unread message

Frans Fürst

unread,
Sep 10, 2005, 5:35:04 AM9/10/05
to
Hallo!

Ich hoffe ich bin hier OT, weil ich nur über einen compiler-bug
(linux/gcc 3.3.5) stolpere, ansonsten weiss ich nicht weiter:

ich habe eine Klasse mit einer protected Methode und von der leite ich
ab.

Nach einigem Fehlereinkreisen sieht diese funktion nun so aus:

protected:

int messageout( int meta, const char message[] ){

switch( meta ){
/*
case 0: printf( "hallo" ); break;
case 1: printf( "hallo" ); break;
case 2: printf( "hallo" ); break;
*/
case 3: printf( "hallo" ); break;
case 4: printf( "hallo" ); break;
case 5: printf( "hallo" ); break;
case 6: printf( "hallo" ); break;
case 7: printf( "hallo" ); break;

}

return 0;
}

Wenn ich compiliert habe (optimizer ist egal) und linke bekomme ich
mehrere Meldungen folgender Art:

/usr/lib/gcc-lib/i686-pc-linux-gnu/3.3.5/../../../../i686-pc-linux-gnu/bi
n/ld: `.gnu.linkonce.t._ZN10CDebugFeat10messageoutEiPKc' referenced in
section `.rodata' of lib/ssgthing.o: defined in discarded section
`.gnu.linkonce.t._ZN10CDebugFeat10messageoutEiPKc' of lib/ssgthing.o

Und zwar für jede .cpp (bzw. ihre .o) Datei, in der ich aus einer von
genannter Klasse abgeleiteten Klasse die obige Funktion aufrufe und
jeweils einmal pro Funktionsaufruf.

Und das wars noch nicht: Die Meldungen kann ich folgendermassen
ein/ausschalten: Kommentiere ich ein oder mehrere der switch-Blöcke 3...7
aus, so kommen keine Meldungen mehr. Statt dem case 3-Block kann ich aber
auch ein oder Mehrere der Blöcke von 0..2 aktivieren. Soweit zumindest
meine Beobachtungen.

Ist das nun ein Bug oder habe ich schon wieder etwas Neues über C++
gelernt?


Für Hinweise und ähnliches vielen Dank im Voraus

Frans

--
de.comp.lang.iso-c++ - Moderation: mailto:voyag...@bud.prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+...@bud.prima.de

Florian Weimer

unread,
Sep 10, 2005, 8:45:21 AM9/10/05
to
* Frans Fürst:

> Ist das nun ein Bug oder habe ich schon wieder etwas Neues über C++
> gelernt?

Ohne vollständige Quellen läßt sich das nicht endgültig sagen. Auf
jeden Fall ist es aber ein GCC- oder binutils-Bug, denn selbst wenn
der Fehler in Deinem Code liegt, solltest Du eine anständige
Fehlermeldung bekommen.

> Und das wars noch nicht: Die Meldungen kann ich folgendermassen
> ein/ausschalten: Kommentiere ich ein oder mehrere der switch-Blöcke 3...7
> aus, so kommen keine Meldungen mehr. Statt dem case 3-Block kann ich aber
> auch ein oder Mehrere der Blöcke von 0..2 aktivieren. Soweit zumindest
> meine Beobachtungen.

Der (potentielle) Bug dürfte nur auftreten, wenn das switch-Statement
per Jump-Tabelle implementiert wird.

albrecht.fritzsche

unread,
Sep 10, 2005, 7:32:13 AM9/10/05
to
Frans Fürst wrote:
>
> protected:
>
> int messageout( int meta, const char message[] ){
>
> switch( meta ){
> /*
> case 0: printf( "hallo" ); break;
> case 1: printf( "hallo" ); break;
> case 2: printf( "hallo" ); break;
> */
> case 3: printf( "hallo" ); break;
> case 4: printf( "hallo" ); break;
> case 5: printf( "hallo" ); break;
> case 6: printf( "hallo" ); break;
> case 7: printf( "hallo" ); break;
>
> }
>
> return 0;
> }

Da kann ich nichts falsches sehen.

> Wenn ich compiliert habe (optimizer ist egal) und linke bekomme ich
> mehrere Meldungen folgender Art:
>
> /usr/lib/gcc-lib/i686-pc-linux-gnu/3.3.5/../../../../i686-pc-linux-gnu/bi
> n/ld: `.gnu.linkonce.t._ZN10CDebugFeat10messageoutEiPKc' referenced in
> section `.rodata' of lib/ssgthing.o: defined in discarded section
> `.gnu.linkonce.t._ZN10CDebugFeat10messageoutEiPKc' of lib/ssgthing.o

Das sind zum einen Meldungen vom Linker, zum anderen eine Frage - denkst
Du, dass das ein Fehler ist? Ich meine, gibt denn der gcc nicht
ansonsten einen Hinweis auf Fehler/Warning oder so?

Vielleicht ein gcc Bug?
Ali

Georg Baum

unread,
Sep 12, 2005, 8:08:08 AM9/12/05
to
Frans Fürst wrote:

> /usr/lib/gcc-lib/i686-pc-linux-gnu/3.3.5/../../../../i686-pc-linux-gnu/bi
> n/ld: `.gnu.linkonce.t._ZN10CDebugFeat10messageoutEiPKc' referenced in
> section `.rodata' of lib/ssgthing.o: defined in discarded section
> `.gnu.linkonce.t._ZN10CDebugFeat10messageoutEiPKc' of lib/ssgthing.o

Vielleicht liegt es auch gar nicht am gcc.
Ich bekomme ähnliche Meldungen bei Benutzung von colorgcc unter SuSE 9.2 und
gcc version 3.3.4 (pre 3.3.5 20040809). Rufe ich gcc direkt auf, bleiben
sie weg. Die erzeugten executables funktionieren aber, deshalb habe ich nie
weiter nach der Quelle dieser Warnung gesucht.


Viele Grüße,

Georg

Frans Fürst

unread,
Sep 12, 2005, 8:32:15 AM9/12/05
to
Georg Baum wrote:
> Frans Fürst wrote:
>
>>
/usr/lib/gcc-lib/i686-pc-linux-gnu/3.3.5/../../../../i686-pc-linux-gnu/bi
>> n/ld: `.gnu.linkonce.t._ZN10CDebugFeat10messageoutEiPKc' referenced
>> in section `.rodata' of lib/ssgthing.o: defined in discarded section
>> `.gnu.linkonce.t._ZN10CDebugFeat10messageoutEiPKc' of lib/ssgthing.o
>
> Vielleicht liegt es auch gar nicht am gcc.
> Ich bekomme ähnliche Meldungen bei Benutzung von colorgcc unter SuSE
> 9.2 und gcc version 3.3.4 (pre 3.3.5 20040809). Rufe ich gcc direkt
> auf, bleiben sie weg. Die erzeugten executables funktionieren aber,
> deshalb habe ich nie weiter nach der Quelle dieser Warnung gesucht.

Das ist ja eigenartig - ich verwende tatsächlich auch colorgcc, dann wird
es wohl daran liegen. Aber auch wenn ich es mir noch nicht genau
angeschaut habe - colorgcc ist nur ein formatier-Perl-Script. Dass es
eigene Fehlermeldungen produziert/hervorruft ist sonderbar..

Frans Fürst

unread,
Sep 12, 2005, 9:02:53 AM9/12/05
to
> Vielleicht liegt es auch gar nicht am gcc.
> Ich bekomme ähnliche Meldungen bei Benutzung von colorgcc unter SuSE
> 9.2 und gcc version 3.3.4 (pre 3.3.5 20040809). Rufe ich gcc direkt
> auf, bleiben sie weg. Die erzeugten executables funktionieren aber,
> deshalb habe ich nie weiter nach der Quelle dieser Warnung gesucht.
>
Nachtrag: habs grad probiert - der "Fehler" tritt bei mir auch ohne
colorgcc auf, scheint also nicht daran zu liegen. Macht die Sache nur
noch ein bischen geheimnisvoller, wenn es bei Dir ohne colorgcc
funktioniert :). Bist Du Dir sicher, dass du den gleichen compiler (bzw
eigentlich den linker, glaube ich) verwendet hast den colorgcc auch
aufruft? (welchen sonst auch immer). Ich habe bei mir gerade nur den
colorgcc-Pfad aus $PATH rausgenommen..

Georg Baum

unread,
Sep 12, 2005, 12:01:01 PM9/12/05
to
Frans Fürst wrote:

> Nachtrag: habs grad probiert - der "Fehler" tritt bei mir auch ohne
> colorgcc auf, scheint also nicht daran zu liegen. Macht die Sache nur
> noch ein bischen geheimnisvoller, wenn es bei Dir ohne colorgcc
> funktioniert :).

Ich habe das noch mal ausprobiert, und die Fehlermeldung kommt auch ohne
colorgcc. Ich meine mich aber zu erinnern, daß sie, als sie das erste Mal
auftrat, nur mit colorgcc kam. Offensichtlich stimmt diese Erinnerung
nicht.

> Bist Du Dir sicher, dass du den gleichen compiler (bzw
> eigentlich den linker, glaube ich) verwendet hast den colorgcc auch
> aufruft? (welchen sonst auch immer). Ich habe bei mir gerade nur den
> colorgcc-Pfad aus $PATH rausgenommen..

Ich habe auch noch einen anderen Compiler probiert (gcc 3.4.1), und bei dem
kommt die Fehlermeldung auch. Deinen Code kann ich allerdings sowohl mit
gcc 3.3.4 als auch mit 3.4.1 ohne Fehlermeldung übersetzen.

Es scheint sich also doch um ein gcc-Problem zu handeln, vielleicht fragst
Du mal auf der Mailingliste?


Viele Grüße,

Georg

Hubert Schmid

unread,
Sep 12, 2005, 2:15:20 PM9/12/05
to
"Frans Fürst" <fr...@gno.de> writes:

> Wenn ich compiliert habe (optimizer ist egal) und linke bekomme ich
> mehrere Meldungen folgender Art:
>
> /usr/lib/gcc-lib/i686-pc-linux-gnu/3.3.5/../../../../i686-pc-linux-gnu/bi
> n/ld: `.gnu.linkonce.t._ZN10CDebugFeat10messageoutEiPKc' referenced in
> section `.rodata' of lib/ssgthing.o: defined in discarded section
> `.gnu.linkonce.t._ZN10CDebugFeat10messageoutEiPKc' of lib/ssgthing.o

Ich hatte so ähnliche Meldungen vor ein paar Wochen auf meinem
Debian/unstable-System. Die Meldungen sind verschwunden, nachdem ich
das Paket binutils aktualisiert habe, das auch den Linker ld enthält.

Schau mal nach einem aktuelleren binutils-Paket und teste, ob die
Meldungen damit immer noch auftreten.

Gruß, Hubert

Andreas Huennebeck

unread,
Sep 13, 2005, 2:57:14 AM9/13/05
to
Frans Fürst wrote:

> Ich hoffe ich bin hier OT, weil ich nur über einen compiler-bug
> (linux/gcc 3.3.5) stolpere, ansonsten weiss ich nicht weiter:
>

> [..]


> Wenn ich compiliert habe (optimizer ist egal) und linke bekomme ich
> mehrere Meldungen folgender Art:
>
> /usr/lib/gcc-lib/i686-pc-linux-gnu/3.3.5/../../../../i686-pc-linux-gnu/bi
> n/ld: `.gnu.linkonce.t._ZN10CDebugFeat10messageoutEiPKc' referenced in
> section `.rodata' of lib/ssgthing.o: defined in discarded section
> `.gnu.linkonce.t._ZN10CDebugFeat10messageoutEiPKc' of lib/ssgthing.o

Wenn Du
c++filt _ZN10CDebugFeat10messageoutEiPKc
rufst, bekommst Du den C++ Funktionsnamen:
CDebugFeat::messageout(int, char const*)

Diese Warnung bekomme ich seit gestern auch, und ebenfalls ohne
Konsequenzen für das Programm. Bei mir ist ein operator=().

> Und das wars noch nicht: Die Meldungen kann ich folgendermassen
> ein/ausschalten: Kommentiere ich ein oder mehrere der switch-Blöcke 3...7
> aus, so kommen keine Meldungen mehr. Statt dem case 3-Block kann ich aber
> auch ein oder Mehrere der Blöcke von 0..2 aktivieren. Soweit zumindest
> meine Beobachtungen.
>
> Ist das nun ein Bug oder habe ich schon wieder etwas Neues über C++
> gelernt?

Ich denke das ist eher ein Bug.

Tschau
Andreas
--
Andreas Hünnebeck | email: a...@despammed.com
----- privat ---- | www : http://www.huennebeck-online.de
Fax/Anrufbeantworter: 0721/151-284301
GPG-Key: http://www.huennebeck-online.de/public_keys/andreas.asc
PGP-Key: http://www.huennebeck-online.de/public_keys/pgp_andreas.asc

0 new messages