 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Andreas Dunke Guest
|
Posted: Mon Sep 22, 2003 12:53 pm Post subject: return 0 bei Rückgabetyp std::string => Kein Compiler-Error? |
|
|
Hallo allerseits!
Habe gerade durch Cut & Paste einen Fehler eingebaut, bei dem es mich
wundert, daß der Compiler das überhaupt (gcc 3.3.1) zuläßt.
Die Funktion hat als Rückgabe einen std::string.
Durch meine Unaufmerksamkeit hatte ich aber an einer Stelle ein return 0
stehen. Der Compiler hat nicht gemeckert, aber dafür ist das Programm
abgestürzt.
Was passiert also bei:
std::string foo( const std::string & bar )
{
if( bar == "xyz" )
return bar;
else
return 0; // was passiert hier?
}
--
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 |
|
 |
Christoph Rabel Guest
|
Posted: Mon Sep 22, 2003 1:10 pm Post subject: Re: return 0 bei Rückgabetyp std::string => Kein Compiler-Er |
|
|
Andreas Dunke wrote:
| Quote: | Habe gerade durch Cut & Paste einen Fehler eingebaut, bei dem es mich
wundert, daß der Compiler das überhaupt (gcc 3.3.1) zuläßt.
Die Funktion hat als Rückgabe einen std::string.
Durch meine Unaufmerksamkeit hatte ich aber an einer Stelle ein return 0
stehen. Der Compiler hat nicht gemeckert, aber dafür ist das Programm
abgestürzt.
Was passiert also bei:
std::string foo( const std::string & bar )
{
if( bar == "xyz" )
return bar;
else
return 0; // was passiert hier?
}
|
Der Compiler interpretiert die 0 als const char*.
Dann ruft er den Contruktor von std::string(const char*) auf und
versucht ein temporäres Objekt als Rückgabewert zu erzeugen. Dabei
greift der Konstruktor auf den 0 Pointer zu und krach...
mfg
Christoph
--
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 Dunke Guest
|
Posted: Mon Sep 22, 2003 1:12 pm Post subject: Re: return 0 bei Rückgabetyp std::string => Kein Compiler-Er |
|
|
Christoph Rabel schrieb:
| Quote: | Andreas Dunke wrote:
Habe gerade durch Cut & Paste einen Fehler eingebaut, bei dem es mich
wundert, daß der Compiler das überhaupt (gcc 3.3.1) zuläßt.
Die Funktion hat als Rückgabe einen std::string.
Durch meine Unaufmerksamkeit hatte ich aber an einer Stelle ein return
0 stehen. Der Compiler hat nicht gemeckert, aber dafür ist das
Programm abgestürzt.
Was passiert also bei:
std::string foo( const std::string & bar )
{
if( bar == "xyz" )
return bar;
else
return 0; // was passiert hier?
}
Der Compiler interpretiert die 0 als const char*.
Dann ruft er den Contruktor von std::string(const char*) auf und
versucht ein temporäres Objekt als Rückgabewert zu erzeugen. Dabei
greift der Konstruktor auf den 0 Pointer zu und krach...
Ich weiß schon warum ich keine char* mag.  |
Danke!
Andreas
--
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 Dunke Guest
|
Posted: Tue Sep 23, 2003 6:31 am Post subject: Re: return 0 bei Rückgabetyp std::string => Kein Compiler- |
|
|
Tibor Pausz schrieb:
| Quote: | Andreas Dunke <NO_SPAM_adunke (AT) maku (DOT) de> wrote:
Ich weiß schon warum ich keine char* mag.
Danke!
Gerade in der Norm nachgelesen, char* sei kein Nullpointer. Da spart
jemand aus "Effizienzgründen" an der falschen Stelle.
??? Die Aussage verstehe ich jetzt nicht. |
--
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 |
|
 |
Peter Schütte Guest
|
Posted: Tue Sep 23, 2003 7:25 am Post subject: Re: return 0 bei Rückgabetyp std::string => Kein Compiler-Er |
|
|
| Quote: | Wenn man hätte auf Nummer sicher gehen wollen, dann würde
char* s = 0;
std::string x (s);
einen leeren string konstruieren (einen Crash finde ich keine brauchbare
Alternative, aber die Norm sagt s darf kein Nullpointer sein), wenig
sinnvoll aber sicher.
|
Ein nicht existenter String ist aber kein leerer String. Der Entwickler
sagt explizit, daß s auf "nichts" zeigt und der Konstruktor von
std::string soll daraus "etwas" machen? :-/
| Quote: | Alternativ könnte man eine Assertion einbauen oder
oder. Statt dessen ist man Norm konform und pfft raucht das Programm ab,
da das Verhalten wohl undefined ist. Im Sinne der Stabilität war diese
Entscheidung nicht.
|
Bei C ist das aber bei z.B. strcpy() auch so und es wird nicht implizit
ein leerer String angenommen.
Gruß Peter
--
int l = 1; /* aus algorithmischen Gruenden mit 1 beginnen */
(aus einem "echten" C++ Quelltext)
--
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 |
|
 |
Ludwig Pumberger Guest
|
Posted: Tue Sep 23, 2003 7:49 am Post subject: Re: return 0 bei Rückgabetyp std::string => Kein Compiler-Er |
|
|
Peter Schütte schrieb:
| Quote: | Wenn man hätte auf Nummer sicher gehen wollen, dann würde
char* s = 0; std::string x (s);
einen leeren string konstruieren (einen Crash finde ich keine brauchbare
Alternative, aber die Norm sagt s darf kein Nullpointer sein), wenig
sinnvoll aber sicher.
Ein nicht existenter String ist aber kein leerer String. Der Entwickler
sagt explizit, daß s auf "nichts" zeigt und der Konstruktor von
std::string soll daraus "etwas" machen? :-/
|
Was wäre eigentlich mit:
template<...>
class basic_string
{
basic_string(int); //0 abweisen, niemals implementiert
....
public:
basic_string(const char_type *);
....
};
Wenn ich die C++ Überladungsregeln richtig im Kopf habe müsste std::string
s = 0; so zur Compilezeit fehlschlagen. Und der size_type C'tor verlangt ja
(anders als bei vector) ohnehin immer noch ein zweites Argument.
--
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 |
|
 |
André Pönitz Guest
|
Posted: Tue Sep 23, 2003 8:13 am Post subject: Re: return 0 bei Rückgabetyp std::string => Kein Compiler- |
|
|
Tibor Pausz <pausz (AT) stud (DOT) uni-frankfurt.de> wrote:
| Quote: | Andreas Dunke <NO_SPAM_adunke (AT) maku (DOT) de> wrote:
??? Die Aussage verstehe ich jetzt nicht.
Wenn man hätte auf Nummer sicher gehen wollen, dann würde
char* s = 0;
std::string x (s);
einen leeren string konstruieren (einen Crash finde ich keine brauchbare
Alternative, aber die Norm sagt s darf kein Nullpointer sein), wenig
sinnvoll aber sicher.
|
Auch in C gibt es einen Unterschied zwischen
char * s = 0;
und
char * t = "";
Wieso sollte C++ jetzt so tun, als ob es das gleiche waere?
| Quote: | Im Sinne der Stabilität war diese Entscheidung nicht.
|
Wahrscheinlich nicht, aber auch nicht 'falsch'.
Andre'
--
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 |
|
 |
Jirka Klaue Guest
|
Posted: Tue Sep 23, 2003 11:11 am Post subject: Re: return 0 bei Rückgabetyp std::string => Kein Compiler-E |
|
|
Tibor Pausz wrote:
| Quote: | Peter Schütte <ps (AT) ivu (DOT) de> wrote:
Bei C ist das aber bei z.B. strcpy() auch so und es wird nicht implizit
ein leerer String angenommen.
Ist das ein Grund in C++ die Schwächen von C zu übernehmen? Man hat sich
für das bekannte Verhalten entscheiden. Ok, damit muß man leben für gut
halte ich die Entscheidung nicht.
|
Mir ist nicht klar, was Du daran auszusetzen hast, daß ein null pointer anders
interpretiert wird als ein pointer, der auf *etwas* zeigt.
Jirka
--
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 |
|
 |
Ludwig Pumberger Guest
|
Posted: Tue Sep 23, 2003 7:45 pm Post subject: Re: return 0 bei Rückgabetyp std::string => Kein Compiler-Er |
|
|
Christoph Rabel schrieb:
| Quote: | Tibor Pausz wrote:
Es hätte drei sinnvollere Lösungen gegeben.
- Leeren string konstruieren, es wurden schließlich keinerlei Daten an
den Konstruktor übergeben.
- Exception werfen
- assertion auslösen
Im Rahmen der Möglichkeiten die C++ bietet ist es meiner Meinung nach
die schlechteste Lösung. std::string ist eh kein Geschwindigkeitswunder,
da hätte man lieber eine sichere Lösung wählen sollen.
Ich persönlich hätte die assertion vorgezogen, vor allem da ich die ja
durch NDEBUG abschalten/wegoptimieren kann. Ein 0 Pointer müsste ein
Programmierfehler sein, daher wäre mir das die liebste Lösung gewesen.
|
Aus Falschem folgt bekanntlich Beliebiges. std::string s = 0 ist
undefiniert also kann ein konformer Compiler eine Assertation auslösen was
ja auch das sinnvollste Verhalten wäre. Die Standardlibrary von VC7 tut das
aber offenbar nicht wie mein Test gerade ergeben hat.
--
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 |
|
 |
André Pönitz Guest
|
Posted: Wed Sep 24, 2003 7:46 am Post subject: Re: return 0 bei R?ckgabetyp std::string => Kein Compiler-Er |
|
|
Ludwig Pumberger <elpeka (AT) gmx (DOT) at> wrote:
| Quote: | Aus Falschem folgt bekanntlich Beliebiges. std::string s = 0 ist
undefiniert also kann ein konformer Compiler eine Assertation auslösen was
ja auch das sinnvollste Verhalten wäre. Die Standardlibrary von VC7 tut das
aber offenbar nicht wie mein Test gerade ergeben hat.
|
Der Vollstaendigekeit halber:
g++ 3.2 scheint 'ne Ausnahme "attempt to create string with null
pointer" zu produzieren.
Andre'
--
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 |
|
 |
Stefan Reuther Guest
|
Posted: Wed Sep 24, 2003 11:04 am Post subject: Re: return 0 bei Rückgabetyp std::string => Kein Compiler-E |
|
|
Hallo,
Tibor Pausz <pausz (AT) stud (DOT) uni-frankfurt.de> wrote:
| Quote: | Jirka Klaue <jklaue (AT) ee (DOT) tu-berlin.de> wrote:
Mir ist nicht klar, was Du daran auszusetzen hast, daß ein null pointer anders
interpretiert wird als ein pointer, der auf *etwas* zeigt.
Undefiniertes Verhalten ist immer schlecht, vorallem wenn man so einfach
eine definierbare Alternative zur Verfügung hätte.
|
Dereferenzieren eines Nullzeigers generiert auf vielen aktuellen
Systemen einen Trap, auf einigen jedoch nicht. Du möchtest für
die Behandlung von Nullzeigern besonderes Verhalten fordern.
Das ist, mit Verlaub gesagt, Blödsinn.
Damit müßte jeweils ein Teil der Systeme extra Tests einbauen,
um entweder
- explizit auf Nullpointer zu testen und einen Trap zu generieren
(also 'int i = *p' wird zu 'if (!p) trap(); else i = *p;')
- explizit auf Nullpointer zu testen und den Trap vermeiden
(also 'int i = *p' wird zu 'if (!p) i = 0; else i = *p;')
Undefiniertes Verhalten heißt, daß der Compiler einfach den Code
für '*p' generieren darf, ohne sich zu kümmern, ob das einen
Trap, eine Fehlermeldung, eine Speicherzelle mit Wert 0 oder den
Wert des FUBAR-Registers ergibt.
Selbst, wenn du das nicht für den allgemeinen Fall fordern
würdest, sondern meinetwegen nur für nullterminierte Strings,
müßten die entsprechenden Funktionen ('strXXX' aus <cstring>,
std::string, std::fstream, ...) entsprechende Tests bekommen.
Aus
std::string::string(const char* p) {
init_empty();
assign(p, strlen(p));
}
würde also z.B.
std::string::string(const char* p) {
init_empty();
if (p) assign(p, strlen(p));
}
Jedermann müßte also für irgendwelche teuren Vergleiche
bezahlen - und das nur, damit irgendwelche Leute, die Nullzeiger
nicht von Zeiger-auf-Null unterscheiden können, 'std::string(0)'
schreiben können.
Danke, ohne mich.
Abgesehen davon ist es in den meisten Fällen ein Programmier-
fehler, wenn du einen Nullzeiger bekommst, aber einen
Zeiger-auf-etwas haben wolltest. Und da möchte ich bitteschön
einen Coredump bekommen, um das Problem zu debuggen (weil auf
meiner Maschine 'undefiniertes Verhalten' bedeutet, daß ich beim
Dereferenzieren eines Nullpointers ein Core bekomme).
Stefan
--
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 Dunke Guest
|
Posted: Fri Sep 26, 2003 6:55 am Post subject: Geschwindigkeit von Strings (Re: return 0 bei Rückgabetyp |
|
|
Tibor Pausz schrieb:
| Quote: | "Geschwindigkeit" hätte haben wollen. Aber angesichts der
Geschwindigkeit von std::string, wären Nullpointertest ohne Belang
gewesen.
|
Warum ist (soll) denn std::string so langsam sein?
--
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 |
|
 |
Falk Hueffner Guest
|
Posted: Fri Sep 26, 2003 9:10 am Post subject: Re: Geschwindigkeit von Strings (Re: return 0 bei |
|
|
Christoph Rabel <odie (AT) hal9000 (DOT) vc-graz.ac.at> writes:
Compilation : No optimization
Somit vollkommen uninteressant fuer Performancevergleiche.
--
Falk
--
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 |
|
 |
Christoph Rabel Guest
|
Posted: Fri Sep 26, 2003 9:13 am Post subject: Re: Geschwindigkeit von Strings (Re: return 0 bei Rückgabety |
|
|
Andreas Dunke wrote:
| Quote: | Tibor Pausz schrieb:
"Geschwindigkeit" hätte haben wollen. Aber angesichts der
Geschwindigkeit von std::string, wären Nullpointertest ohne Belang
gewesen.
Warum ist (soll) denn std::string so langsam sein?
|
Kommt sicher auf die Anwendung an.
Unter folgendem Link findest du einige Performancemessungen zum Thema
std::string. Alex Vinokur hat da einige gemacht, irgendwo gibt es auch
einen Vergleich vector<char>/string von ihm.
Die Benchmarks sind relativ glaubwürdig, vor allem da er genau angibt
was er gemessen hat.
http://groups.google.at/groups?q=Alex+Vinokur+performance+string&hl=de&lr=&ie=UTF-8&oe=UTF-8&selm=bd221m%24oh654%241%40ID-79865.news.dfncis.de&rnum=1
mfg
Christoph
--
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 |
|
 |
Christoph Rabel Guest
|
Posted: Fri Sep 26, 2003 9:49 am Post subject: Re: Geschwindigkeit von Strings (Re: return 0 bei Rückgabety |
|
|
Falk Hueffner wrote:
| Quote: |
Compilation : No optimization
Somit vollkommen uninteressant fuer Performancevergleiche.
|
Hoppla! Ich dachte die Ergebnisse mit Optimization wären weiter unten.
Ich kenn nämlich von ihm diverse Benchmarks die von ohne bis maximale
Optimierung alles auflisten.
mfg
Christoph
--
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
|
|