Wie wir wissen, spezifiziert der C-Standard nicht viele Details der Implementierung, zum Beispiel den Wert des NULL-Zeigers, die Reihenfolge von Bits und Bytes (Endiannes), die Ausrichtung in Strukturen und von Stack-Parametern, die tatsächliche Organisation des Speichers (ich weiß nicht Ich denke nicht, dass ein Stack-Layout überhaupt notwendig ist, nur „auto“.
Zusätzlich sind einige andere Teile stattdessen definiert (oder undefiniert), um ein undefiniertes Verhalten zu erzeugen, wie z>
Da sich moderne Plattformen (oder liegt es am Compiler?) (absichtlich?) ähnlich verhalten, ist es tatsächlich gefährlich, sich auf ein konsistentes Verhalten von Programmen zu verlassen.
Gibt es also eine Unix-Variante oder eine Unix-inspirierte Plattform (oder einen Compiler, wenn es hauptsächlich auf den Compiler ankommt?), der Standard ist, aber absichtlich seltsam ist, um Fehler zu produzieren und auf undefiniertes Verhalten und Nichtportabilität hinzuweisen?
Tut Ähnliches Ding existiert, aber für POSIX anstelle von C? Ist es überhaupt sinnvoll, es zu versuchen und umzusetzen?
Akzeptierte Antwort:
HP-UX von Hewlett Packard kommt mir am nächsten.
Der C-Compiler erlaubt die Dereferenzierung von NULL-Zeigern, obwohl es ein Flag gab, um dies zu ändern. Auf PA-RISC-Hardware wuchs der Stack „nach oben“ (in Richtung größerer Adressen) und der Heap nach unten (in Richtung kleinerer Adressen).
Die PA-RISC-Hardware hatte auch einige Kuriositäten, die über die Stack/Heap-Umkehrung hinausgingen. Es hatte ein Segmentregister (funktionierte anders als x86-Segmente), sodass verschiedene Bibliotheken tatsächlich in verschiedenen Segmenten lebten und Zeiger auf Funktionen kein einzelner 64-Bit-Zeiger waren. Ich kann mich jedoch nicht erinnern, ob PA-RISC bei der Zeigerausrichtung so streng war wie SPARC.
Auf einer etwas verfügbareren Ebene können Sie C-Compiler wie Clang, Pcc oder sogar Tcc verwenden, obwohl Tcc einige Probleme mit GNU-Linkern und -Loadern hat, da es meines Wissens nach „schwache Symbole“ gibt. Zumindest erhalten Sie von diesen alternativen Compilern unterschiedliche Warnmeldungen, was sich immer lohnt.
Sie können auch alternative C-Bibliotheken wie Diet Libc oder Musl ausprobieren. Ich habe Code verschiedene Dinge tun lassen, wenn er gegen Musl kompiliert wurde, im Gegensatz zu GNU Libc. Beide Bibliotheken unterstützen statisches Linken, was GNU Libc erschwert oder unmöglich macht. Musl hat sogar ein ganz anderes dynamisches Linksystem, das verborgene Fehler in Ihrem Code aufdecken könnte.
Verwandte:Ubuntu – Wie kann pam_exec das Skript als aktueller Benutzer ausführen?