9.11.2012

Notiz - Solid Code (2)

Consider:

DragAnimation* dragAnimation = 0; while (mousePressed ()) { if (mouseMoved ()) { if (dragAnimation == 0) dragAnimation = new DragAnimation; dragAnimation->animate (); } } delete dragAnimation;

Was ist an dem Code oben falsch? Nichts – zunächst.

Wenn „mouseMoved ()“ immer „false“ zurückliefert, ist „dragAnimation“ immer noch „0” – der Code ruft dann „delete“ auf einen „0”-Pointer. Der C++-Standard definiert, daß dies perfekt zulässig ist.

Mein Code oben ist aber ein wenig „zu clever” – er verläßt sich auf den C++ Standard, um ein wenig mehr Performance herauszuholen. Wäre er ein wenig „passiver“ geschrieben, hätte ich den Fehler wohl schon im Ansatz, noch beim Hinzufügen einer zusätzlichen Zeile (eine gute Weile, nachdem ich den prinzipiell richtigen Code eingecheckt hatte) im Ansatz gesehen:

dragAnimation->conclude ();

nach dem „while“-Loop, und ohne vorherige Abfrage, ob das „new“ zuvor zustande kam, und man es immer noch mit einem „0”-Pointer zu tun hat.

Wenn der User die Maus gar nicht bewegt, kommt es zuverlässig zum Crash.

Das Problem ist hier mE. gar nicht so sehr, daß der Code zum Crash führt. Wesentlich bedenklicher finde ich, daß man solche Bugs – die nur „ausnahmsweise” in der Benutzung des Programms aufschlagen – (notwendig!) sehr spät findet.

(Kommentarfunktion z.Zt. deaktiviert.)