| View previous topic :: View next topic |
| Author |
Message |
Markus Dehmann Guest
|
Posted: Tue May 04, 2004 1:49 pm Post subject: Zugriff auf double -> segmentation fault |
|
|
Seltsames Problem:
Ich habe eine double-Membervariable in meiner Klasse. Evtl. wird die nie
initialisiert (ich arbeite mit komplexem Code, den jmd anderes geschrieben
hat).
Bei einer bestimmten Stelle in der Programmausführung tritt ein
Segmentation Fault ein. Mit dem Debugger-Tool valgrind habe ich nun
herausgefunden, dass ein Read-Zugriff auf diese double-Variable den
Segmentation Fault verursacht:
double val;
....
return val == log(0.0);
Invalid read of size 8 (test.h:10)
segmentation fault
Für die einfache return-Zeile!
Jetzt habe ich mal eine NULL-Abfrage hinzugefügt:
if(val == NULL){
// bla
}
Dann tritt sogar der Segmentation Fault in der Zeile mit der
if-NULL-Abfrage auf (laut valgrind)! Mit der NULL-Abfrage bekomme ich
zusätzlich eine unschöne g++Warnung: "NULL used in arithmetic"
Also was macht man mit so einem evtl. uninitialisierten double-Wert?
Danke,
Markus
--
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 |
|
 |
Tibor Pausz Guest
|
Posted: Fri May 07, 2004 1:41 pm Post subject: Re: Zugriff auf double -> segmentation fault |
|
|
Markus Dehmann <markus.cl (AT) gmx (DOT) de> wrote:
| Quote: | return val == log(0.0);
|
Die Zeile ist Quatsch!
lg 0 ist mathematisch nicht definiert.
--
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 |
|
 |
Hendrik Belitz Guest
|
Posted: Fri May 07, 2004 1:43 pm Post subject: Re: Zugriff auf double -> segmentation fault |
|
|
Markus Dehmann wrote:
| Quote: | double val;
...
return val == log(0.0);
|
log(0.0) ist ja schonmal keine so gute Idee...
und Klammern könnten hier auch nicht schaden
| Quote: | Also was macht man mit so einem evtl. uninitialisierten double-Wert?
|
Initialisieren wäre gut. Ansonsten wäre der vollständige Code nützlich, so
läßt sich da garnichts sagen...
--
To get my real email adress, remove the two onkas
--
Dipl.-Inform. Hendrik Belitz
Central Institute of Electronics
Research Center Juelich
--
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 May 07, 2004 2:53 pm Post subject: Re: Zugriff auf double -> segmentation fault |
|
|
Tibor Pausz wrote:
| Quote: | Markus Dehmann <markus.cl (AT) gmx (DOT) de> wrote:
return val == log(0.0);
Die Zeile ist Quatsch!
lg 0 ist mathematisch nicht definiert.
|
Aber z.B. in IEEE Arithmetik.
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 |
|
 |
Torsten Robitzki Guest
|
Posted: Fri May 07, 2004 3:59 pm Post subject: Re: Zugriff auf double -> segmentation fault |
|
|
Markus Dehmann wrote:
| Quote: | Seltsames Problem:
Ich habe eine double-Membervariable in meiner Klasse. Evtl. wird die
nie initialisiert (ich arbeite mit komplexem Code, den jmd anderes
geschrieben hat).
Bei einer bestimmten Stelle in der Programmausführung tritt ein
Segmentation Fault ein. Mit dem Debugger-Tool valgrind habe ich nun
herausgefunden, dass ein Read-Zugriff auf diese double-Variable den
Segmentation Fault verursacht:
double val;
...
return val == log(0.0);
Invalid read of size 8 (test.h:10)
segmentation fault
Für die einfache return-Zeile!
Jetzt habe ich mal eine NULL-Abfrage hinzugefügt:
if(val == NULL){
// bla
}
Dann tritt sogar der Segmentation Fault in der Zeile mit der
if-NULL-Abfrage auf (laut valgrind)! Mit der NULL-Abfrage bekomme ich
zusätzlich eine unschöne g++Warnung: "NULL used in arithmetic"
Also was macht man mit so einem evtl. uninitialisierten double-Wert?
|
Keine Ahnung. Mein Tip wäre aber eher, das die Funktion über einen
dereferenzierten null Zeiger (oder Ähnlichem) aufrufst.
type* t = 0;
t->f();
schreib mal ein assert(this); an den Anfang der Funktion.
mfg Torsten
--
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: Fri May 07, 2004 5:52 pm Post subject: Re: Zugriff auf double -> segmentation fault |
|
|
Markus Dehmann wrote:
| Quote: | Ich habe eine double-Membervariable in meiner Klasse. Evtl. wird die
nie initialisiert (ich arbeite mit komplexem Code, den jmd anderes
geschrieben hat).
Bei einer bestimmten Stelle in der Programmausführung tritt ein
Segmentation Fault ein.
|
Dann war wohl der this-Zeiger ungültig.
| Quote: | Jetzt habe ich mal eine NULL-Abfrage hinzugefügt:
if(val == NULL){
// bla
}
Dann tritt sogar der Segmentation Fault in der Zeile mit der
if-NULL-Abfrage auf (laut valgrind)! Mit der NULL-Abfrage bekomme ich
zusätzlich eine unschöne g++Warnung: "NULL used in arithmetic"
|
Man vergleicht ja auch nicht double-'val' mit Zeiger-'NULL'.
Ich würde wetten, dass der Fehler auch beim Auslesen eines 'int' oder
'char*' oder 'std::vector<YellowSubmarine>' auftreten würde. Auf
gängigen Architekturen hat 'double' zwar IIRC trap-representations
(signalling NaN), die geben dir aber ein SIGFPE. Bleibt also nur der
this-Zeiger.Und der kann auf viele Arten verschutt gegangen sein.
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 |
|
 |
Horst Kraemer Guest
|
Posted: Sat May 08, 2004 5:33 pm Post subject: Re: Zugriff auf double -> segmentation fault |
|
|
On Tue, 04 May 2004 09:49:12 -0400, "Markus Dehmann"
<markus.cl (AT) gmx (DOT) de> wrote:
| Quote: | Seltsames Problem:
Ich habe eine double-Membervariable in meiner Klasse. Evtl. wird die nie
initialisiert (ich arbeite mit komplexem Code, den jmd anderes geschrieben
hat).
Bei einer bestimmten Stelle in der Programmausführung tritt ein
Segmentation Fault ein. Mit dem Debugger-Tool valgrind habe ich nun
herausgefunden, dass ein Read-Zugriff auf diese double-Variable den
Segmentation Fault verursacht:
double val;
...
return val == log(0.0);
Invalid read of size 8 (test.h:10)
segmentation fault
Für die einfache return-Zeile!
Jetzt habe ich mal eine NULL-Abfrage hinzugefügt:
if(val == NULL){
// bla
}
|
warum nicht val == 0 ?
| Quote: | Dann tritt sogar der Segmentation Fault in der Zeile mit der
if-NULL-Abfrage auf (laut valgrind)! Mit der NULL-Abfrage bekomme ich
zusätzlich eine unschöne g++Warnung: "NULL used in arithmetic"
|
Richtig. Die Verwendung von NULL sollte sich auf Zeiger beschraenken,
denn nur *dafuer* ist dieses Makro bestimmt.
| Quote: | Also was macht man mit so einem evtl. uninitialisierten double-Wert?
|
Nichts. Man initialisiert die Variable halt im c'tor Dazu sind
Konstruktoren da. Das Verhalten einer beliebigen Aktion mit dem Wert
einer uninitialisierten Variablen ist undefiniert - dazu zaehlen
natuerlich auch Vergleiche. Ich finde, es ist ein exzellentes Feature,
wenn der Vergleich einer uninitialisierten Variablen das Programm
crasht. Sollte vom naechsten C++-Standard vorgeschrieben werden ;-)
--
Horst
--
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 |
|
 |
|