Re: Compiler error in necpp

Thomas Hertweck <[email protected]> Mon, 16 Nov 2009 21:56:06 +0000
Newsgroups gmane.linux.suse.programming
Message-ID <[email protected]>

Sascha 'saigkill' Manns wrote:
>>> c_geometry.cpp:712: warning: 'delz' may be used uninitialized 
>>
>> Das sagt der Compiler, wenn im Code nicht direkt zu erkennen ist, ob
>> die betreffende Variable initialisiert wird bevor sie genutzt wird.
>
> Wie kann ich delz initialisieren? #include <delz>?

Uh, vielleicht solltest Du doch einmal etwas Programmieren lernen. Nichts
fuer ungut und Dein Engagement in allen Ehren, ich bekomme allerdings
immer Bauchweh, wenn ich solche Fragen von Leuten sehe, die ganz offiziell
Pakete fuer openSUSE via Buildservice bauen.

delz ist eine Variable im Code. Die Variable wird an einer Stelle im Code
benutzt und der Compiler kann nicht genau erkennen, ob dieser Variablen
vorher ein Wert zugewiesen wurde. Falls das nicht geschah bis zu dem
Zeitpunk der Verwendung der Variablen ist diese Variable offensichtlich
uninitialisiert und liefert (das ist aber compilerabhaengig) i.d.R. eine
Zufallszahl - Zufallszahl heisst hier, Du bekommst schlicht das, was
zufaelligerweise gerade an der Speicheradresse der uninitialisierten
Variablen steht. Du bekommst nicht das, was der Programmierer
urspruenglich mal angedacht hat. Je nachdem, was auf die Benutzung der
uninitialisierten Variablen folgt, kann das Programm abstuerzen, falsche
Ergebnisse liefern, oder auch zufaelligerweise richtige Ergebnisse liefern
oder Ergebnisse, die zumindest plausibel aussehen.

Tools wie valgrind checken jeden Speicherzugriff zur Laufzeit und
entdecken relativ leicht uninitialisierte Variablen. Allerdings erhoeht
sich die Laufzeit des Programms drastisch. Fuer Entwicklung und Debuggen
von Programmen ist valgrind (oder insure++ etc) aber IMO unverzichtbar.

Der Compiler kann manchmal schon beim Compilieren entdecken, ob eine
Variable uninitialisiert ist. Oftmals aber nicht mit absoluter Sicherheit.
Deswegen heisst es "may be used uninitialized" (falls der Compiler sicher
ist, heisst es "is used uninitialized"). Das Problem tritt z.B. auf, wenn
eine Variable unter Bedingungen (d.h. in einem if-statement) initialisiert
wird. Das muss nicht zwangsweise xur Folge haben, dass die Variable
spaeter uninitialisiert verwendet wird (der Programmierer mag wissen, ob
das der Fall ist oder nicht), aber es besteht die Moeglichkeit. Siehe das
gcc Manual fuer Beispiele, suche nach -Wuninitialized. In anderen Worten,
die Warnung des Compilers kann muss aber nicht auf einen Bug hindeuten.

Um auf Dein Problem zurueckzukommen: Man kann die Warnung abstellen, in
dem man delz schon bei der Deklaration einen Wert zuweist. Allerdings muss
man den Code und das Problem verstehen, um Variablen korrekt zu
initialisieren, nicht immer ist Initialisieren mit 0 oder 0.0 korrekt.
Wenn man Bugs finden will, hilft es manchmal auch, alle Variablen mit sehr
seltsamen Werten zu initialisieren, da es die Wahrscheinlichkeit von
Problemen zur Laufzeit erhoeht und man so einfacher Bugs finden kann.
Manche Compiler (wie z.B. der von Intel) koennen das automatisch erledigen
(zumindest in Fortran, bei C/C++ weiss ich das gerade nicht).

Hope this helps,
Thomson