GNU/Linux >> Tutoriels Linux >  >> Linux

Existe-t-il des compilateurs ou des runtimes C "ésotériques" (étranges) mais conformes aux normes ?

Comme nous le savons, le standard C ne spécifie pas beaucoup de détails d'implémentation, par exemple la valeur du pointeur NULL, l'ordre des bits et des octets (endiannes), l'alignement dans les structures et les paramètres de la pile, l'organisation réelle de la mémoire (je ne ne pensez pas que la disposition de la pile soit nécessaire du tout, juste "auto").
De plus, certaines autres parties sont plutôt définies (ou indéfinies) pour produire un comportement indéfini, comme le déréférencement null (généralement segfault mais pas nécessairement)

Étant donné que les plates-formes modernes (ou est-ce au compilateur ?) (Intentionnellement ?) Se comportent de la même manière, il est en fait dangereux de s'appuyer sur certains comportements cohérents des programmes.

Alors, existe-t-il une variante Unix ou une plate-forme inspirée d'Unix (ou un compilateur si cela dépend principalement du compilateur ?) Qui est standard mais intentionnellement bizarre pour produire des bogues et signaler un comportement indéfini et une non-portabilité ? chose existe mais pour POSIX au lieu de C? Est-ce même une chose raisonnable à essayer et à mettre en œuvre ?

Réponse acceptée :

HP-UX de Hewlett Packard est le plus proche auquel je puisse penser.

Le compilateur C autorisera le déréférencement du pointeur NULL, bien qu'il y ait eu un indicateur pour changer cela. La pile a augmenté "vers le haut" (vers des adresses plus grandes) et le tas a augmenté vers le bas (vers des adresses plus petites) sur le matériel PA-RISC.

Le matériel PA-RISC présentait également quelques bizarreries au-delà de l'inversion pile/tas. Il avait un registre de segment (fonctionnait différemment des segments x86) de sorte que diverses bibliothèques vivaient réellement dans différents segments, et les pointeurs vers les fonctions n'étaient pas un seul pointeur 64 bits. Cependant, je ne me souviens pas si PA-RISC était aussi strict sur l'alignement du pointeur que SPARC.

À un niveau un peu plus disponible, vous pouvez utiliser des compilateurs C comme Clang, Pcc ou même Tcc, bien que Tcc ait quelques problèmes avec les éditeurs de liens et les chargeurs GNU à cause de "symboles faibles" si je comprends bien. À tout le moins, vous obtiendrez différents messages d'avertissement de ces compilateurs alternatifs, ce qui est toujours utile.

Vous pouvez également essayer des bibliothèques C alternatives, comme Diet Libc ou Musl. J'ai eu du code faire des choses différentes lorsqu'il est compilé avec Musl par opposition à GNU Libc. Ces deux bibliothèques prennent en charge la liaison statique, ce que GNU Libc rend difficile ou impossible. Musl a même un système de liens dynamiques très différent, qui pourrait exposer des bogues latents dans votre code.

Connexe :Ubuntu - Comment faire en sorte que pam_exec exécute le script en tant qu'utilisateur actuel ?
Linux
  1. Existe-t-il un moyen de vérifier s'il existe des liens symboliques pointant vers un répertoire ?

  2. Dans quels langages Windows, Mac OS X et Linux sont-ils écrits ?

  3. Existe-t-il un programme comme COM0COM sous Linux ?

  4. Existe-t-il des options pour laisser le chat sortir avec la couleur?

  5. Existe-t-il des alternatives à l'utilisation de `udev` ?

Il n'y a pas de référentiels activés Solution RHEL

Pourquoi certains Emoji N&B et d'autres sont-ils trop gros ?

Existe-t-il des alternatives au centre logiciel ?

Certains dossiers et/ou fichiers sur disque dur externe sont accessibles sous Linux mais pas sous macOS et Windows

pourquoi timer_t est-il défini dans time.h sous Linux mais pas sous OS X

Pourquoi il y a `/lib` et `/lib64` mais seulement `/bin` ?