Mailinglist Archive: opensuse-de (5264 mails)
| < Previous | Next > |
Re: Viele warnings = unsauberes Programm?
- From: Erhard Schwenk <eschwenk@xxxxxx>
- Date: Thu, 14 Jun 2001 13:01:46 +0200 (CEST)
- Message-id: <200106141102.f5EB2EA16808@xxxxxxxxxxx>
On 14-Jun-01 Alexander Tukac wrote:
> aus meiner Erfahrung kann ich sagen, dass Warnings oft auf unsauber
> programmierte Programme hinweisen. Viele Warnings lassen sich zwar
> nicht vermeiden.
Zum Beispiel? Ich wüßte keine Compilerwarnung, die man nicht entweder
durch eine sauberere Codevariante oder durch Setzen der entsprechenden
Pragmas/Compilerschalter wegbrächte, wobei Ersteres natürlich der
sinnvollere Weg ist.
> Weiterhin kommt es drauf an, mit welchen Optionen das Makefile bzw.
> der
> Komplier gestartet wird. Wnn bspw. -pedantic oder -ansi dort drin
> steht, werden
> erfahrungsgemäss sehr viele Warnings produziert, da auf jede kleine
> unsaubere Stelle reagiert wird.
Dann sollte man entweder diese Schalter nicht benutzen oder eben
beim Programmieren solche Unsauberkeiten nicht einbauen und "schon" hat
man die Warnungen los ;). Die Erfahrung zeigt klar, daß Programme,
die so lange debuggt werden bis sie Warnungsfrei durch den Compiler
laufen, viel weniger Restfehler haben.
>> Mich interessiert nun, ob Programme mit vielen warnings einfach
>> unsauberer geschrieben sind, oder woran die zum Teil wirklich
>> erheblichen Unterschiede liegen.
Eine Warnung ist ein Hinweis an den Programmierer, daß er etwas tut,
was normalerweise nicht sinnvoll ist oder zu undefinierten Ergebnissen
führt. Zum Beispiel führt die Zuweisung eines Zahlenwertes an einen
Zeiger in C zu einer Compilerwarnung, also etwa sowas wie:
long *c = 0xF0000000;
Normalerweise deutet diese Konstruktion darauf hin, daß man entweder
Datentypen durcheinandergebracht oder sich vertippt hat (z.B. weil man
eigentlich long c schreiben wollte). Außerdem ist die Konstruktion
gefährlich, weil sie impliziert, daß sizeof(long *) >= sizeof(long)
ist, was nicht zwangsläufig gegeben sein muß. In dem fall würden da dann
Datenverluste auftreten, die unvorhersehbare Ergebnisse erzeugen.
Wenn diese Zuweisung in einem speziellen Fall sinnvoll ist (z.B. weil
der Systemprogrammierer im Kernel ganz gezielt den Grafikkartenspeicher
adressieren möchte, der nunmal eine fixe Adresse hat), dann kann man
die Warnung natürlich einfach ignorieren. Oder man macht es richtig und
formuliert das auch entsprechend, z.B. mit einem Cast:
long *c = ((long *)0xF0000000);
Das sagt dem Compiler dann sozusagen gezielt "Jawohl, ich will!", und
zumindest die mir bekannten Compiler verzichten dann auf die Warnung,
weil es in diesem Fall z.B. viel unwahrscheinlicher ist, daß die
Konstruktion auf einem Tippfehler basiert.
--
Erhard Schwenk
http://www.fto.de - http://www.akkordeonjugend.de
No Spam replies please.
| < Previous | Next > |