Extensions lexicales et mots réservés
Par défaut, gcc et clang traitent le mot‑clé asm comme une extension. Dans le C standard, asm reste un identifiant non réservé, ce qui signifie qu’un programme conforme peut l’utiliser comme nom de variable. L’activation du mode -std force la conformité, mais l’état initial du compilateur montre une dérive importante : le code portable peut échouer à la compilation sans option explicite.
Macro FLT_ROUNDS et environnement flottant
Le standard C impose que FLT_ROUNDS reflète le mode d’arrondi actif, modifiable via fesetround. gcc fixe systématiquement FLT_ROUNDS à 1 (arrondi au plus proche), même après un appel à fesetround. Le code source montre l’opération suivante :
#undef FLT_ROUNDS
#define FLT_ROUNDS 1Cette implémentation ignore la dynamique prévue par la norme, alors que clang propose un builtin (__builtin_flt_rounds()) capable de restituer la valeur réelle.
Pragmas standards non implémentés
Depuis C99, cinq pragmas standard contrôlent le comportement flottant (#pragma STDC FP_CONTACT, #pragma STDC FENV_ACCESS, #pragma STDC CX_LIMITED_RANGE) et C23 en ajoute deux (#pragma STDC FENV_ROUND, #pragma STDC FENV_DEC_ROUND). Après plus de deux décennies, gcc ne reconnaît aucun de ces pragmas ; ils sont simplement ignorés. clang accepte les pragmas C99 mais rejette ceux de C23. L’absence de prise en charge locale empêche de restreindre le mode d’arrondi à l’échelle d’une fonction ou d’un bloc, contrairement aux options de ligne de commande qui s’appliquent à l’ensemble du fichier.
Qualificateurs de type de retour et en‑tête stdarg.h sous musl
Le standard indique que les qualificateurs (const, volatile, etc.) appliqués au type de retour d’une fonction sont éliminés. clang considère toutefois ces qualificateurs comme incompatibles, comme le montre l’exemple suivant :
int f();
const int f();Le compilateur signale une incompatibilité alors que la norme les rend identiques. Par ailleurs, la bibliothèque musl fournit une version de stdarg.h qui redéfinit va_start ainsi :
#define va_start(v,l) __builtin_va_start(v,l)Cette définition ne prend pas en charge la forme C23 sans second argument, alors que le compilateur supporte déjà __builtin_c23_va_start. Le résultat est une impossibilité d’utiliser la version C23 de va_start lorsqu’on compile contre musl, même si le compilateur le permet.