HeadlinesBriefing HeadlinesBriefing.com

Votre C n'est pas le C standard

Hacker News •
×

Voici une liste incomplète des incompatibilités entre le C tel qu'il est décrit dans la norme et le C tel qu'il existe en pratique pour les utilisateurs de gcc ou clang avec glibc ou musl.

Par défaut, gcc et clang reconnaissent le mot-clé asm comme une extension. En C standard, asm est un identifiant valide non réservé ; un code conforme à la norme peut donc ne pas compiler avec les paramètres par défaut. Les compilateurs ne sont pas conformes par défaut, et la norme pourrait faire d'asm un mot réservé comme en C++, ce qu'elle n'a pas fait.

La norme exige que FLT_ROUNDS reflète les modifications du mode d'arrondi effectuées à l'exécution via fesetround dans <fenv.h>. Pourtant, gcc définit toujours FLT_ROUNDS à 1 (arrondi au plus proche), quel que soit le mode d'arrondi en cours d'exécution. Clang fournit un élément intégré, __builtin_flt_rounds(), mais gcc n'en dispose pas.

La norme C spécifie des pragmas à virgule flottante, ajoutés en C99 et C23, pour contrôler le comportement arithmétique. Plus de 27 ans après C99, gcc les ignore toujours comme des opérations sans effet, et clang ne prend en charge que les pragmas de C99. Certaines fonctionnalités peuvent être reproduites avec des options de ligne de commande, mais celles-ci s'appliquent à l'ensemble de l'unité de traduction et non à des fonctions ou blocs individuels.

La norme exige que les qualificatifs des types de retour de fonction soient ignorés. Clang, en revanche, les considère comme significatifs ; déclarer int f(); et const int f(); ensemble produit donc une erreur de types conflictuels, alors que ces deux déclarations devraient être identiques.

Source: Hacker News · Résumé par HeadlinesBriefing