GNU/Linux >> Linux Esercitazione >  >> Linux

Esistono compilatori o runtime C "esoterici" (strani) ma conformi agli standard?

Come sappiamo, lo standard C non specifica molti dettagli dell'implementazione, ad esempio valore del puntatore NULL, ordine di bit e byte (endiannes), allineamento nelle strutture e dei parametri dello stack, organizzazione effettiva della memoria (non Penso che il layout dello stack sia necessario, solo "auto").
Inoltre, alcune altre parti sono invece definite (o non definite) per produrre un comportamento indefinito, come il dereferenziamento null (comunemente segfault ma non necessariamente)

Poiché le piattaforme moderne (o dipende dal compilatore?) (intenzionalmente?) si comportano in modo simile, è pericoloso fare affidamento su alcuni comportamenti coerenti dei programmi.

Quindi, esiste una variante unix o una piattaforma ispirata a unix (o un compilatore se dipende principalmente dal compilatore?) che è standard ma intenzionalmente strana per produrre bug e sottolineare comportamenti indefiniti e non portabilità?
È simile cosa esiste ma per POSIX invece di C? È anche una cosa ragionevole provare a implementare?

Risposta accettata:

HP-UX di Hewlett Packard è quanto di più vicino mi viene in mente.

Il compilatore C consentirà il dereferenziamento del puntatore NULL, sebbene fosse presente un flag per modificarlo. Lo stack è cresciuto "in alto" (verso indirizzi più grandi) e l'heap è cresciuto (verso indirizzi più piccoli) sull'hardware PA-RISC.

Anche l'hardware PA-RISC presentava alcune stranezze oltre all'inversione stack/heap. Aveva un registro di segmento (funzionava in modo diverso rispetto ai segmenti x86) in modo che varie librerie vivessero effettivamente in segmenti diversi e i puntatori a funzioni non erano un singolo puntatore a 64 bit. Tuttavia, non ricordo se PA-RISC fosse così rigoroso sull'allineamento del puntatore come lo era SPARC.

A un livello un po' più disponibile, puoi usare compilatori C come Clang, Pcc o anche Tcc, sebbene Tcc abbia alcuni problemi con i linker e i caricatori GNU a causa di "simboli deboli" da come ho capito. Per lo meno, riceverai diversi messaggi di avviso da questi compilatori alternativi, il che vale sempre la pena.

Potresti anche provare librerie C alternative, come Diet Libc o Musl. Ho avuto codice che faceva cose diverse quando compilato contro Musl rispetto a GNU Libc. Entrambe queste librerie supportano il collegamento statico, cosa che GNU Libc rende difficile o impossibile. Musl ha anche un sistema di collegamento dinamico molto diverso, che potrebbe esporre bug latenti nel tuo codice.

Correlati:Ubuntu - Come fare in modo che pam_exec esegua lo script come utente corrente?
Linux
  1. Grep può restituire vero/falso o esistono metodi alternativi?

  2. N Equivalente a Top ma per I/o di rete?

  3. C'è un modo per verificare se ci sono collegamenti simbolici che puntano a una directory?

  4. In quali linguaggi sono scritti Windows, Mac OS X e Linux?

  5. Comando Ubuntu 'pip' non trovato, ma ce ne sono 18 simili

Non ci sono repository abilitati RHEL soluzione

Perché alcune Emoji in bianco e nero e altre sono troppo grandi?

Ci sono alternative al Software Center?

Alcune cartelle e/o file sull'HDD esterno sono accessibili su Linux ma non su macOS e Windows

Ci sono alternative all'uso di `udev`?

Perché ci sono `/lib` e `/lib64` ma solo `/bin`?