C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Compilerbug?
Goto page 1, 2, 3  Next
 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German)
View previous topic :: View next topic  
Author Message
King Leo - Martin Oberzal
Guest





PostPosted: Thu Oct 07, 2004 8:18 pm    Post subject: Compilerbug? Reply with quote



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





PostPosted: Thu Oct 07, 2004 9:54 pm    Post subject: Re: Compilerbug? Reply with quote



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





PostPosted: Fri Oct 08, 2004 6:59 am    Post subject: Re: Compilerbug? Reply with quote



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





PostPosted: Fri Oct 08, 2004 7:22 am    Post subject: Re: Compilerbug? Reply with quote

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





PostPosted: Fri Oct 08, 2004 10:04 am    Post subject: Re: Compilerbug? Reply with quote

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





PostPosted: Fri Oct 08, 2004 11:13 am    Post subject: Re: Compilerbug? Reply with quote

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





PostPosted: Fri Oct 08, 2004 11:19 am    Post subject: Re: Compilerbug? Reply with quote

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





PostPosted: Fri Oct 08, 2004 11:20 am    Post subject: Re: Compilerbug? Reply with quote

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





PostPosted: Fri Oct 08, 2004 11:21 am    Post subject: Re: Compilerbug? Reply with quote

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





PostPosted: Fri Oct 08, 2004 12:39 pm    Post subject: Re: Compilerbug? Reply with quote

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





PostPosted: Fri Oct 08, 2004 3:22 pm    Post subject: Re: Compilerbug? Reply with quote

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





PostPosted: Fri Oct 08, 2004 3:23 pm    Post subject: Re: Compilerbug? Reply with quote

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





PostPosted: Fri Oct 08, 2004 4:06 pm    Post subject: Re: Compilerbug? Reply with quote

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





PostPosted: Fri Oct 08, 2004 4:08 pm    Post subject: Re: Compilerbug? Reply with quote

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





PostPosted: Fri Oct 08, 2004 7:11 pm    Post subject: Re: Compilerbug? Reply with quote

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
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German) All times are GMT
Goto page 1, 2, 3  Next
Page 1 of 3

 
Jump to:  
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


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.