GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Gibt es „esoterische“ (schräge), aber standardkonforme C-Compiler oder Runtimes?

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?
Linux
  1. Gibt es eine Möglichkeit zu überprüfen, ob symbolische Links auf ein Verzeichnis verweisen?

  2. In welchen Sprachen sind Windows, Mac OS X und Linux geschrieben?

  3. Gibt es Optionen, um cat mit Farbe ausgeben zu lassen?

  4. Warum ist timer_t in time.h unter Linux definiert, aber nicht unter OS X

  5. Warum gibt es `/lib` und `/lib64` aber nur `/bin`?

Es gibt keine aktivierten Repositories für die RHEL-Lösung

Warum sind einige Emoji B&W und andere zu groß?

N entspricht Top, aber für Netzwerk-E/A?

Gibt es Alternativen zum Software Center?

Auf einige Ordner und/oder Dateien auf der externen Festplatte kann unter Linux, aber nicht unter macOS und Windows zugegriffen werden

Gibt es Alternativen zur Verwendung von `udev`?