 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
King Leo - Martin Oberzal Guest
|
Posted: Thu Oct 07, 2004 8:18 pm Post subject: Compilerbug? |
|
|
Hallo!
Folgender Code:
int foo( int q )
{
return q+1;
}
int main()
{
int i = foo( i ); //< sollte es hier nicht krachen?
}
Der g++ kompiliert dies anstandslos (gcc version 3.3.3).
Wenn dies kein Bug sein sollte, wie ist dann das Verhalten definiert wenn
ich eine Klasse verwende?
zb:
std::string ret = bar( ret );
Comeau liefert wenn ich einen int verwendet nur eine Warning, dass die
Variable benutzt wird, bevor sie initialisiert ist. Verwende ich
std::string schluckt er den Code anstandslos.
Gruß, Martin!
--
Manche wollen den Frieden durch Ruestung erzwingen.
Andere vermeiden es einfach, sich Feinde zu machen.
Alexander Bartolich in at.linux
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Rolf Magnus Guest
|
Posted: Thu Oct 07, 2004 9:54 pm Post subject: Re: Compilerbug? |
|
|
King Leo - Martin Oberzalek wrote:
| Quote: | Hallo!
Folgender Code:
int foo( int q )
{
return q+1;
}
int main()
{
int i = foo( i ); //< sollte es hier nicht krachen?
}
|
Der Name i ist nach dem "int i" bekannt, daher kann man ihn auch als
Parameter für foo nehmen. Allerdings ist i noch nicht initialisiert und
damit das Verhalten des Aufrufs undefiniert.
| Quote: | Der g++ kompiliert dies anstandslos (gcc version 3.3.3).
Wenn dies kein Bug sein sollte, wie ist dann das Verhalten definiert wenn
ich eine Klasse verwende?
zb:
std::string ret = bar( ret );
|
Das Verhalten hier ist genausowenig definiert. Semantisch ist der Code aber
korrekt.
| Quote: | Comeau liefert wenn ich einen int verwendet nur eine Warning, dass die
Variable benutzt wird, bevor sie initialisiert ist. Verwende ich
std::string schluckt er den Code anstandslos.
|
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Andreas Huennebeck Guest
|
Posted: Fri Oct 08, 2004 6:59 am Post subject: Re: Compilerbug? |
|
|
King Leo - Martin Oberzalek wrote:
| Quote: | Folgender Code:
int foo( int q )
{
return q+1;
}
int main()
{
int i = foo( i ); //< sollte es hier nicht krachen?
}
Der g++ kompiliert dies anstandslos (gcc version 3.3.3).
|
Ist ja auch legaler Code, macht nur keinen Sinn.
| Quote: | Wenn dies kein Bug sein sollte, wie ist dann das Verhalten definiert wenn
ich eine Klasse verwende?
zb:
std::string ret = bar( ret );
Comeau liefert wenn ich einen int verwendet nur eine Warning, dass die
Variable benutzt wird, bevor sie initialisiert ist.
|
Das ist exakt die richtige Warnung.
| Quote: | Verwende ich std::string schluckt er den Code anstandslos.
|
Auch hier sollte diese Warnung kommen.
Tschau
Andreas
--
Andreas Hünnebeck | email: [email]ah (AT) despammed (DOT) com[/email]
----- privat ---- | www : http://www.huennebeck-online.de
Fax/Anrufbeantworter: 0721/151-284301
GPG-Key: http://www.huennebeck-online.de/public_keys/andreas.asc
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Marcel Müller Guest
|
Posted: Fri Oct 08, 2004 7:22 am Post subject: Re: Compilerbug? |
|
|
Rolf Magnus wrote:
| Quote: | Wenn dies kein Bug sein sollte, wie ist dann das Verhalten definiert wenn
ich eine Klasse verwende?
zb:
std::string ret = bar( ret );
Das Verhalten hier ist genausowenig definiert. Semantisch ist der Code aber
korrekt.
|
Bei Klassen halte ich das für definiertes Verhalten, da die Definition
von einem impliziten Konstruktoraufruf begleitet ist.
Anders gesagt, str is ein zunächst Leerstring, und was bar dann
zurückgibt wird anschließend zugewiesen.
Marcel
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Stephan Feinen Guest
|
Posted: Fri Oct 08, 2004 10:04 am Post subject: Re: Compilerbug? |
|
|
Andreas Huennebeck wrote:
| Quote: | Comeau liefert wenn ich einen int verwendet nur eine Warning, dass die
Variable benutzt wird, bevor sie initialisiert ist.
Das ist exakt die richtige Warnung.
Verwende ich std::string schluckt er den Code anstandslos.
Auch hier sollte diese Warnung kommen.
|
Äh, wird bei
std:string strBlub;
strBlub nicht automatisch durch seinen default c'tor initialisiert?
gruß
stephan
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Edzard Egberts Guest
|
Posted: Fri Oct 08, 2004 11:13 am Post subject: Re: Compilerbug? |
|
|
Hallo Andreas,
| Quote: | std::string ret = bar( ret );
Verwende ich std::string schluckt er den Code anstandslos.
Auch hier sollte diese Warnung kommen.
|
das ist aber genau genommen keine Initialisierung, sondern eine
Zuweisung. Dem std::string ret, der ja einen Standardkonstruktor hat,
wird nach der Initialisierung etwas zugewiesen und dabei steht dann
schon ein initialisierter ret zur Verfügung.
std::string ret(bar(ret)); // das müsste die Warnung bringen
Gruß,
Ed
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Karl Heinz Buchegger Guest
|
Posted: Fri Oct 08, 2004 11:19 am Post subject: Re: Compilerbug? |
|
|
Edzard Egberts wrote:
| Quote: |
Hallo Andreas,
std::string ret = bar( ret );
Verwende ich std::string schluckt er den Code anstandslos.
Auch hier sollte diese Warnung kommen.
das ist aber genau genommen keine Initialisierung, sondern eine
Zuweisung. Dem std::string ret, der ja einen Standardkonstruktor hat,
wird nach der Initialisierung etwas zugewiesen und dabei steht dann
schon ein initialisierter ret zur Verfügung.
|
Weit verbreiteter Irrtum.
Das *ist* eine Initialisierung auch wenn da ein '=' steht.
Warum?
Weil es sich um die Definion einer Variablen handelt. Und da
kommt *immer* ein Konstruktor zum Einsatz, niemals eine Zuweisung!
Im obigen Beispiel wuerde der Copy Konstruktor benutzt werden um
den std::string zu initialisieren.
T var = InitValue;
ist identisch zu
T var( InitValue );
--
Karl Heinz Buchegger
[email]kbuchegg (AT) gascad (DOT) at[/email]
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Rolf Magnus Guest
|
Posted: Fri Oct 08, 2004 11:20 am Post subject: Re: Compilerbug? |
|
|
Edzard Egberts wrote:
| Quote: | Hallo Andreas,
std::string ret = bar( ret );
Verwende ich std::string schluckt er den Code anstandslos.
Auch hier sollte diese Warnung kommen.
das ist aber genau genommen keine Initialisierung, sondern eine
Zuweisung.
|
Nein. Es ist (auch genau genommen) eine Initialisierung. Es ist äquivalent
zu:
std::string ret(std::string(bar(ret)));
Eine Zweisung wäre es nur bei:
std::string ret; ret = bar(ret);
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Helmut Zeisel Guest
|
Posted: Fri Oct 08, 2004 11:21 am Post subject: Re: Compilerbug? |
|
|
Rolf Magnus wrote:
| Quote: | zb:
std::string ret = bar( ret );
Das Verhalten hier ist genausowenig definiert.
|
Tatsaechlich? Sollte ret nicht vor Aufruf von bar bereits mit dem
Default Constructor initialisiert worden sein? Bei PODs ist die Warnung
korrekt, da sie keinen Default Konstruktor haben.
Oder andersrum gefragt:
Isr
T t=bar(t);
das selbe wie
T t;
t=bar(t);
? Helmut
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Karl Heinz Buchegger Guest
|
Posted: Fri Oct 08, 2004 12:39 pm Post subject: Re: Compilerbug? |
|
|
Helmut Zeisel wrote:
| Quote: |
Rolf Magnus wrote:
zb:
std::string ret = bar( ret );
Das Verhalten hier ist genausowenig definiert.
Tatsaechlich? Sollte ret nicht vor Aufruf von bar bereits mit dem
Default Constructor initialisiert worden sein?
|
Nein.
Warum sollte es.
Es ist der Return Wert von bar(), mit dem ret initialisiert wird.
| Quote: | Bei PODs ist die Warnung
korrekt, da sie keinen Default Konstruktor haben.
|
Der hat damit ueberhaupt nichts zu tun, da er in Obigem nie zum Einsatz
kommt.
| Quote: |
Oder andersrum gefragt:
Isr
T t=bar(t);
das selbe wie
T t;
t=bar(t);
|
Nein.
Das erste ist eine Initialisierung, das zweite eine Zuweisung.
Komplett verschiedene Dinge. Im ersten wird der Copy Konstruktor
benutzt, im zweiten der op=
Du scheinst auch auf eine weit verbreitets Missverstaendniss
hereinzufallen:
In
T v = Init_value;
kommt *keine* Zuweisung vor. Das obige ist equivalent zu
T v( Init_value );
und der Copy-Konstruktor ist dafuer zustaendig!
--
Karl Heinz Buchegger
[email]kbuchegg (AT) gascad (DOT) at[/email]
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Rolf Magnus Guest
|
Posted: Fri Oct 08, 2004 3:22 pm Post subject: Re: Compilerbug? |
|
|
Karl Heinz Buchegger wrote:
| Quote: | Du scheinst auch auf eine weit verbreitets Missverstaendniss
hereinzufallen:
In
T v = Init_value;
kommt *keine* Zuweisung vor. Das obige ist equivalent zu
T v( Init_value );
|
Nicht eher:
T v(T(Init_value));
? Meines Erarchtens wird erst Init_value in ein temporäres T konvertiert,
dann aus diesem v kopierkonstruiert. Ich bin mir aber nicht sicher, was
passiert, wenn Init_value bereits ein T ist. Ich dachte aber, daß - sofern
der Compiler es nicht wegoptimiert - im Prinzip dann zweimal
kopierkonstruiert wird.
| Quote: | und der Copy-Konstruktor ist dafuer zustaendig!
|
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Rolf Magnus Guest
|
Posted: Fri Oct 08, 2004 3:23 pm Post subject: Re: Compilerbug? |
|
|
Stephan Feinen wrote:
| Quote: | Andreas Huennebeck wrote:
Comeau liefert wenn ich einen int verwendet nur eine Warning, dass die
Variable benutzt wird, bevor sie initialisiert ist.
Das ist exakt die richtige Warnung.
Verwende ich std::string schluckt er den Code anstandslos.
Auch hier sollte diese Warnung kommen.
Äh, wird bei
std:string strBlub;
strBlub nicht automatisch durch seinen default c'tor initialisiert?
|
Doch, aber das hat mit dem Beispiel nichts zu tun.
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Thomas Maeder Guest
|
Posted: Fri Oct 08, 2004 4:06 pm Post subject: Re: Compilerbug? |
|
|
Stephan Feinen <Stephan.Feinen (AT) gmx (DOT) de> writes:
| Quote: | Äh, wird bei
std:string strBlub;
strBlub nicht automatisch durch seinen default c'tor initialisiert?
|
Doch.
Allerdings haben wir es mit
std::string ret = bar( ret );
zu tun, und das ist ewas ganz anderes. Hier wird ein std::string-Konstruktor
verwendet, in dessen Parametertyp sich der Rückgabewert von bar(ret)
konvertieren lässt.
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Thomas Maeder Guest
|
Posted: Fri Oct 08, 2004 4:08 pm Post subject: Re: Compilerbug? |
|
|
Marcel Müller <news.5.maazl (AT) spamgourmet (DOT) org> writes:
| Quote: | std::string ret = bar( ret );
Das Verhalten hier ist genausowenig definiert. Semantisch ist der
Code aber korrekt.
Bei Klassen halte ich das für definiertes Verhalten, da die Definition
von einem impliziten Konstruktoraufruf begleitet ist.
Anders gesagt, str is ein zunächst Leerstring, und was bar dann
zurückgibt wird anschließend zugewiesen.
|
Wie kommt Ihr alle da drauf????
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
King Leo - Martin Oberzal Guest
|
Posted: Fri Oct 08, 2004 7:11 pm Post subject: Re: Compilerbug? |
|
|
King Leo - Martin Oberzalek wrote:
| Quote: | int foo( int q )
{
return q+1;
}
int main()
{
int i = foo( i ); //< sollte es hier nicht krachen?
}
Der g++ kompiliert dies anstandslos (gcc version 3.3.3).
|
Ich hab das Beispiel nun nochmals gebastelt:
=================================
#include
using namespace std;
class Bar
{
private:
Bar(){}
public:
int i;
Bar( int i ) : i( i ) { cout << "Konstruktor" << endl; }
Bar( const Bar &b ) { i = b.i; cout << "kopier Kontruktor" << endl; }
Bar & operator=( const Bar &b ) { i = b.i; cout << "operator=" << endl;
return *this; }
};
Bar foo( const Bar & q )
{
return q;
}
int main()
{
Bar i = foo( i );
cout << "===========" << endl;
Bar j( foo( j ) ); //< error: `j' undeclared (first use this function)
Bar q = 10101;
{
Bar q = foo( q );
cout << "i: " << q.i << endl;
}
}
=================
Bar i = foo( i );
Wird wieder anstandos geschluckt und das Programm liefert folgendes:
kopier Kontruktor
===========
Konstruktor
kopier Kontruktor
i: 0
Es wird die Klasse also nicht korrekt initialisiert! Bei
Bar j( foo( j ) );
kommt es zu einer Fehlermeldung, wie ich sie auch bei "Bar i = foo( i );"
erwartet hätte.
Alles in allem halte ich dies für einen ziehmlich großen Fallstrick in C++.
Gruß, Martin!
--
8:59pm an 0:25, 4 Benutzer, Durchschnittslast: 0,08, 0,05, 0,07
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|