Warum man fremdem Code nicht trauen darf

main():
  1. int a = 0;
  2. printf("Der Wert von Variable 'a' ist %d.\n", a);
  3. BoeseFunktion(4711);
  4. a = 1;
  5. printf("Der Wert von Variable 'a' ist jetzt %d.\n", a);
Was meint ihr, gelingt es mir als Programmierer von BoeseFunktion() dass die Ausgabe in der zweiten Zeile Der Wert von Variable 'a' ist jetzt 0. lautet? Selbst wenn 'a' nur lokal der Main-Funktion bekannt ist? Ich sage ja:
BoeseFunktion():
  1. void BoeseFunktion(int tmp) {
  2.   int* pointer;
  3.   pointer = &tmp - 1;
  4.   *pointer = *pointer + 8;
  5. }
Das funktioniert eigentlich ganz einfach. Mit pointer = &tmp - 1; hole mich mir einen Zeiger auf den ersten Funktionsparameter und reduziere die Adresse um 1. Auf x86-Systemen bin ich nun an der Rücksprungadresse von BoeseFunktion() auf dem Stack. So sieht das im Speicher aus: Stack Und mit *pointer = *pointer + 8; erhöhe ich anschließend die Rücksprungadresse um 8 Byte, was gerade soviel ist um das a = 1; in main() zu überspringen. Solches Gehacke mit Pointer-Arithmetik ist natürlich sowieso pfui. Aber was uns dieses Beispiel eigentlich lehren soll ist, dass man fremden Funktionen nicht trauen soll. Es könnte schließlich sein, dass ich sie geschrieben habe... 😉

Schadensabwehr

Aber wie bekommt man nun das Problem in den Griff, dass Fremdcode, den man in so gut wie jedem Projekt findet, unbeabsichtigt oder beabsichtigt Unfug anstellt und Daten oder die Programmausführung beeinträchtigt? Da gibt es mehrere Möglichkeiten. Unter anderem:
  • Logische Programmablaufkontrolle Man stelle sich vor, jede eigene Funktion meldet sich bei ihrem Aufruf an einer zentralen Instanz mit einem eindeutigen Key. Die zentrale Instanz überprüft dann anhand einer Tabelle ob es in Ordnung ist, dass Funktion3 nun auf Funktion2 folgt oder nicht. Bringt fremder Code - zum Beispiel eine defekte DLL - den Ablauf durcheinander so wird dies schnell aufgedeckt. Voraussetzung für ein solches System ist natürlich eine deterministische Reihenfolge der Funktionsaufrufe.
  • Datenredundanz Zuerst einmal sollten alle Daten, die irgendwie wichtig sind, redundant vorliegen; am besten redundant-invers. Das heißt, es gibt nicht eine Variable 'a', sondern z.B. 'unsigned char u8VentilSollwert' und 'unsigned char u8VentilSollwertInvers'. Das hat nicht nur einen eingängigeren Namen als 'a' sondern informiert uns auch gleich noch über das Präfix u8, dass es eine unsigned 8-Bit-Variable ist mit Wertebereich von 0..255. In der einen steht dann z.B. 1 (binär 0000 0001) und in der anderen das Gegenteil, also 254 (1111 1110). Vor Verwendung wird jedes Mal geprüft, ob die beiden Variablen noch Bit-invers sind und falls nicht mit Fehlermeldung abgebrochen.
  • Datensicherung Wenn die Daten umfangreicher sind, gibt es die Möglichkeit sie mit einer Checksumme zu sichern. Wird die Checksumme oder die Daten beschädigt, so fällt dies auf, sobald man die Checksumme nachrechnet und mit dem Prüfwert vergleicht.

Dach fertig

Bitumen ist ein widerliches Zeug. Erst recht, wenn man in der Mitagshitze mit einer wackeligen Leiter auf einem steilen Dach klebrige Schindeln aufnagelt. Das Dach zu decken hat mich dann auch ganze zwei Tage Zeit und etliche Liter Schweiß gekostet. Ich hoffe, es hält jetzt auch eine Weile. Die empfohlene Dachneigung habe ich hier ja nicht unbedingt.
Hexenhaus
Und nun ist auch der Zweck der kleinen Holzschindeln klar.

Kettensägenmassaker, bunte Fenster und zauberhafte Details

Meine arme kleine 1600W-Spielzeugkettensäge musste sehr über ihr Können hinauswachsen, als ich letztens einen Baumstamm der Länge nach halbiert habe. Warum mach ich so was Beklopptes? Weil eine schnöde Plastikregenrinne keinesfalls einem Hexenhaus angemessen wäre. Da muss etwas uriges her, und wenn es noch so aufwändig wird. Und natürlich mit einem möglichst sinnlos verdreht und verwinkeltem Abflussrohr:
Hexenhaus
Mit im Bild: aktuelle Innenansicht, Türklopfer (eBay) und märchenhafte Gardinen für das Oberstübchen.
Meine bessere Hälfte hat sich inzwischen mit den Ausmaßen, die dieses Projekt räumlich und finanziell annimmt, arrangiert und bastelt fleißig bei der Inneneinrichtung mit:
Spinnenkissen
Die Arbeitsteilung ist bei uns offensichtlich eher klassisch, aber irgendwann bringe ich mir auch noch Nähen bei...
Das Spinnenfenster ist endlich auch fertig geworden:
Spinnenfenster
Die Laterne ist übrigens vom Flohmarkt und ein Kunstwerk für sich allein.
Sieht von Innen sogar noch besser aus:
Spinnenfenster
"Villa Spinnenbein", wie Kind #2 die Hütte taufte, macht ihrem Namen zunehmend alle Ehre.
Was von Innen ebenfalls so gut aussieht wie erhofft, ist das nun verglaste Erkerfenster:
Buntglasfenster
Schade nur, dass mir die Scheibe unten links gerissen ist :-(
Ich habe lange mit mir gerungen, ob 14 € (!) pro einzelner (!!) Glasscheibe es wert sind; aber sie sind es. Und wenn ich Sonntags keinen Krach machen darf, dann male ich eben etwas zur Entspannung. Wie z.B. 200 kleine Holzschindeln:
Holzschindeln
Und ob Cypax jetzt einen kleinen Sonnenstich hat und 20m² Dach mit einer Handvoll fitzeliger Mini-Plättchen eindecken will oder was er sonst damit vor hat, das erfahrt ihr beim nächsten Mal...

Arachnophobie anyone?

Dann besser nicht weiterlesen. Wir haben nämlich eine neue achtbeinige Hausbewohnerin. Naja, eigentlich eine alte Hausbewohnerin, die aber jetzt aus dem Keller in ein neues Zimmer umgezogen ist:
Winkelspinne
Darf ich vorstellen? Eratigena atrica, eine Große Winkelspinne.
Ihr neues, luxuriöses Heim steht bei uns im WC und dient sowohl der Desensibilisierung der weiblichen Familienmitglieder als auch (als Kollateralschaden) nichts ahnender Gäste mit Harndrang. Und schließlich gilt es ja auch den Erziehungsauftrag wahrzunehmen und den Nachwuchs möglichst schon in frühkindlichem Alter an Naturkunde heranzuführen. Kind #3 jedenfalls teilt die Begeisterung seines Vaters für die Fütterungszeiten, wenn nervige, dumme Dusselfliegen und diese elendigen, fiesen Schnaken ihr verdientes Ende in der Spinnenarena finden. Ring frei!