GNU/Linux >> Znalost Linux >  >> Linux

Existují „esoterické“ (divné), ale standardy vyhovující C kompilátory nebo runtime?

Jak víme, standard C nespecifikuje mnoho detailů implementace, například hodnotu NULL ukazatele, pořadí bitů a bajtů (endiannes), zarovnání ve strukturách a parametrech zásobníku, skutečnou organizaci paměti (nevím Nemyslím si, že rozložení zásobníku je vůbec nutné, jen „auto“).
Některé další části jsou navíc definovány (nebo nedefinovány), aby produkovaly nedefinované chování, jako je dereferencování null (běžně segfault, ale ne nutně)

Vzhledem k tomu, že moderní platformy (nebo je to na kompilátoru?) (záměrně?) se chovají podobně, je na určité konzistentní chování programů skutečně nebezpečné spoléhat.

Existuje tedy unixová varianta nebo platforma inspirovaná unixem (nebo kompilátor, pokud je to většinou na kompilátoru?), která je standardní, ale záměrně divná, aby produkovala chyby a poukazovala na nedefinované chování a nepřenositelnost?
Existuje něco podobného věc existuje, ale pro POSIX místo C? Je to vůbec rozumné zkoušet a implementovat?

Přijatá odpověď:

HP-UX společnosti Hewlett Packard je nejblíže, jaké si dokážu představit.

Kompilátor C umožní dereferencování ukazatelů NULL, ačkoli existoval příznak, který to změnil. Zásobník rostl „nahoru“ (směrem k větším adresám) a hromada rostla dolů (směrem k menším adresám) na hardwaru PA-RISC.

Hardware PA-RISC měl také některé zvláštnosti kromě převrácení zásobníku/hromady. Měl segmentový registr (fungoval jinak než x86 segmenty), takže různé knihovny skutečně žily v různých segmentech a ukazatele na funkce nebyly jediným 64bitovým ukazatelem. Nevzpomínám si však, jestli byl PA-RISC tak přísný ohledně zarovnání ukazatelů jako SPARC.

Na poněkud dostupnější úrovni můžete použít kompilátory C jako Clang, Pcc nebo dokonce Tcc, ačkoli Tcc má určité problémy s GNU linkery a loadery kvůli „slabým symbolům“, jak tomu rozumím. Přinejmenším budete od těchto alternativních kompilátorů dostávat různé varovné zprávy, což se vždy vyplatí.

Můžete také vyzkoušet alternativní knihovny C, jako je Diet Libc nebo Musl. Při kompilaci proti Musl jsem měl kód dělat různé věci, na rozdíl od GNU Libc. Obě tyto knihovny podporují statické linkování, což GNU Libc ztěžuje nebo znemožňuje. Musl má dokonce velmi odlišný systém dynamického propojení, který může odhalit skryté chyby ve vašem kódu.

Související:Ubuntu – Jak nechat pam_exec spustit skript jako aktuální uživatel?
Linux
  1. N Ekvivalent horní části, ale pro síťový I/O?

  2. V jakých jazycích jsou napsány Windows, Mac OS X a Linux?

  3. Existují v Linuxu nějaké standardní kódy ukončení?

  1. Existují konvence pojmenování proměnných ve skriptech Shell?

  2. Příkaz Ubuntu „pip“ nebyl nalezen, ale existuje 18 podobných

  3. Existuje linuxový příkaz jako mv, ale s regulárním výrazem?

  1. Otestovat, zda existují soubory odpovídající vzoru, aby bylo možné spustit skript?

  2. Existuje nějaký druh převodníku Pdf na text?

  3. Může Grep vrátit pravdu/nepravdu nebo existují alternativní metody?