Etwas für C-progger, die gern englisch lesen…

Ich finde es ja faszinierend: eine relativ kurze C-funkzjon, die vorsätzlich so geschrieben wurde, dass sie je nach gesetzten kompeiler-fläggs beim aufruf von gcc jeden int-wert zwischen 0 und 767 zurückliefern kann, dokumentiert, dass ohne genaue kenntnis der fläggs und argumente, mit denen der kompeiler aufgerufen wird, nicht vorausgesagt werden kann, was für ein ergebnis bei einem programmlauf rauskommt. 😖

Der link geht auf ein PDF in englischer sprache.

Klar ist dieser demonstrazjonskohd am ende relativ weit weg von kohd, der in realen programmen auftritt. Aber jede konstrukzjon für sich allein ist auch nicht so untypisch, dass sie rein akademisch wäre. Und es ist völlig korrektes C. Leider.

In was sind noch mal unsere betrübssysteme gekohdet? 😧

Tja, wenn man kohd schreibt, der von der implementazjon abhängt, dann bekommt man eben ergebnisse, die von der implementazjon abhängen — und in C ist es sehr, sehr einfach, solchen kohd zu schreiben. Zum beispiel hängt der wert einer literalen konstanten wie -1U von der implementazjon ab, in diesem fall von der anzahl bits in einem unsigned int und von der repräsentazjon vorzeichenbehafteter ganzzahliger werte in der CPU (zum glück gibt es inzwischen nur noch die darstellung als zweierkomplement). Und ein völlig legaler ausdruck wie (int)-1U/2 gehört dann besser nicht zu den dingen, die man beim kohden tippt. Auch nicht indirekt, etwa, indem man statt direkt -1U eine variable vom typ unsigned int mit wert 1U verwendet und da ein minuszeichen vorschreibt. Natürlich kann die deklarazjon der variablen im kwelltext meilenweit von ihrer verwendung entfernt sein, so dass man ihren typ nicht immer vor augen hat… 😦

Ein statisches analyse-werkzeug wie das olle lint oder das freie splint kann zwar mit der opzjon -strict ganz schön nerven und hirnen, macht aber auch klar, wo mögliche probleme liegen. Dies leider in einem fürchterlichen wust des nicht so wichtigen, aber dafür pedantischen und neurotischen fehlermeldens. Ich habe noch nie ein nichttriviales stück C-programm geschrieben, das ohne erschröckliche meldungen durch splint -strict durchgegangen wäre.

Wer mit solchen problemen nicht leben kann, sollte vielleicht besser in einer anderen sprache als ausgerechnet C (oder seinem bastardkind C++) kohden. 😉

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden /  Ändern )

Google Foto

Du kommentierst mit Deinem Google-Konto. Abmelden /  Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden /  Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden /  Ändern )

Verbinde mit %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.