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. 😉