[linux-l] do{ . } while (0) (was: Arrays in C)

Jan-Benedict Glaw jbglaw at lug-owl.de
Do Nov 24 20:09:24 CET 2005


On Thu, 2005-11-24 10:37:43 +0100, Oliver Bandel <oliver at first.in-berlin.de> wrote:
> On Thu, Nov 24, 2005 at 08:05:24AM +0100, Jan-Benedict Glaw wrote:
> > On Thu, 2005-11-24 00:43:56 +0100, Oliver Bandel <oliver at first.in-berlin.de> wrote:
> > > Auch mache ich es normalerweise so, daß ich jeden Pointer, den ich
> > > irgendwann mal im Laufe der Funktion benutze, gleich am Anfang
> > > schon auf NULL setze. Dann ist er in gewisser Weise in einem
> > > definierten Zustand und ich kann mit NULL-Tests immer abchecken,
> > > was Sache ist. (Ich chekce auch immer alle Args auf NULL,
> > > was manche inem paranoid erscheint - aber für gute/solide SW-Entwicklung
> > > braucht man diesen gewissen paranoiden Mindest-Zustand ;-))
> > 
> > Hmmm... Das seh' ich anders. Wenn ein pointer dazu genutzt werden
> > soll, ein Ergebnis entgegenzunehmen, warum sollte man ihn dann vorher
> > nochmal initialisieren? Das bläht doch nur das DATA-Segment auf...
> 
> Weil man als Mensch auch mal Fehler macht und es auch mal vorkommen
> kann, daß man in seinem Code mal etwas umbaut, und dann etwas übersieht.
> Dann ist der Pointer ggf. nicht auf NULL initialisiert und ein NULL-Test
> geht ins Leere, man hebelt dann also seine eigenen Sicherheitsmechanismen
> aus.

Der GCC warnt, wenn eine Variable benutzt wird, ohne, daß sie vorher
initialisiert ist. (Vielleicht geht das aber ins Leere, wenn diese
nicht-initialisierte Variable an weitere Funktionen übergeben wird.)

> Ich brauche mir nur anschauen, wie viele BufferOferflow und
> andere Bugs dauernd in SW-Projekten angezeigt werden und
> weiß dann, daß das nicht stimmt.
> Du magst da ja die große Ausnahme sein. ;-)
> 
> Ich weiß von mir jedenfalls, daß ich Fehler mache
> und "paranoider" Programmierstil hilft, diese frühzeitig
> aufzudecken.

Ich versuche aber auch, schlank zu programmieren...

> > > (Und wenn andere Funktionen das immer schön abtesten, weiß man
> > >  dann, wenn es an irgend einer Stelle statt eines Crashes eine
> > >  Fehlermeldung gibt, daß da eine NULL erschien, die nicht erwartet wurde,
> > >  wie weit Fehler in einer Source reichen können... "Das Weltall, unbekannte Tiefen...")
> > 
> > Wenn schon, dann richtig!  In so einer Situation (wo eine _erwartete_
> > Zuweisung aufmal weg ist) würde ich einen Crash / assert erwarten.
> 
> Hoffentlich keinen Crash in dem Sinne, wie ich ihn verstehe: Wilde-Sau-Spiel
> durch Pointer-Zugriff auf irgendwelchen unbekannten Müll sonstwo im
> RAM-Universum.

Mit Crash meine ich SIGSEGV, jähes Ende des Programm-Lebens,
vielleicht noch ein core dump zum Abschied, und dann ist finito.

Ein totes Programm ist mir deutlich lieber, als eines, daß erst noch
die Daten hächselt...

> Und selbst wenn C in bestimmten Fällen Defaults vorgibt
> und Werte vor-definiert mag es u.U. sinnvoll sein, diese
> nochmals explizit hin zu schreiben (z.B. bei static),
> enfach deshalb, daß man es explizit nochmal sieht, wenn man
> in den Code guckt.

/* = 0 */

> Alles, was explizit im Code steht ist schon mal Selbstdokumentation
> und schafft Klarheit.

So kann man das auch sehen...

MfG, JBG

-- 
Jan-Benedict Glaw       jbglaw at lug-owl.de    . +49-172-7608481             _ O _
"Eine Freie Meinung in  einem Freien Kopf    | Gegen Zensur | Gegen Krieg  _ _ O
 für einen Freien Staat voll Freier Bürger"  | im Internet! |   im Irak!   O O O
ret = do_actions((curr | FREE_SPEECH) & ~(NEW_COPYRIGHT_LAW | DRM | TCPA));
-------------- nächster Teil --------------
Ein Dateianhang mit Binärdaten wurde abgetrennt...
Dateiname   : signature.asc
Dateityp    : application/pgp-signature
Dateigröße  : 189 bytes
Beschreibung: Digital signature
URL         : <https://mlists.in-berlin.de/pipermail/linux-l-mlists.in-berlin.de/attachments/20051124/e403b0f6/attachment.sig>


Mehr Informationen über die Mailingliste linux-l