Aussi disponible en : English · Español · Português · العربية
Le problème norvégien de YAML
Pourquoi country: NO finit en false, quelles autres valeurs font de même, et comment vérifier un fichier entier d’un coup.
Qu’est-ce que le problème norvégien ?
Écrivez country: NO dans un fichier YAML et quantité d’analyseurs vous rendront le booléen false plutôt que la chaîne « NO ». Le code pays de la Norvège est une écriture de false en YAML 1.1, avec quinze autres mots courants, et rien dans le fichier ne le signale : la valeur arrive en booléen et quelque chose casse bien plus loin.
En cause : deux spécifications de YAML sont en usage quotidien. YAML 1.1, publiée en 2005, accepte vingt-deux écritures d’un booléen : y, Y, yes, Yes, YES, n, N, no, No, NO, true, True, TRUE, false, False, FALSE, on, On, ON, off, Off et OFF. YAML 1.2 les a ramenées à six — true, True, TRUE, false, False, FALSE — si bien que les seize autres sont devenues du texte ordinaire. Les deux versions sont largement implémentées : le même fichier signifie donc réellement deux choses.
Les booléens sont le cas célèbre, pas le seul. En YAML 1.1, une valeur comme 12:30 est un nombre en base soixante et devient 750 ; un zéro initial signifie octal, donc 0755 vaut 493 ; et les tirets bas sont des séparateurs de chiffres, donc 1_000 vaut mille. En YAML 1.2, les trois sont des chaînes ou de simples décimaux. Cette page inspecte un fichier pour toute cette famille d’un seul coup.
Comment s’en servir
- Collez votre YAML. Un fichier entier ou seulement le passage qui vous inquiète. Rien n’est envoyé : la vérification se fait dans la page.
- Lisez le tableau. Chaque valeur simple dont le sens dépend de la version, avec ce qu’en fait YAML 1.1, ce qu’en fait 1.2, et la règle responsable.
- Mettez entre guillemets ce qui est signalé. Un scalaire entre guillemets est une chaîne dans toutes les versions et tous les analyseurs. C’est tout le correctif, et le tableau se vide à mesure.
Quel analyseur est-ce que j’utilise, au juste ?
C’est de cette question que dépend vraiment le problème norvégien, et la réponse est rarement visible de l’extérieur. PyYAML — de loin la bibliothèque YAML la plus utilisée en Python, et donc ce qui se trouve sous une grande partie de l’outillage d’infrastructure — implémente YAML 1.1 : elle lit encore NO comme false. En JavaScript, js-yaml résout le schéma core de YAML 1.2, et le même fichier vous rend la chaîne. Les bibliothèques Go, Ruby et Java varient selon la version et le schéma configuré.
Conséquence pratique : un fichier peut passer tous les tests sur une machine et changer de sens sur une autre, sans la moindre erreur nulle part. Une configuration écrite et validée dans une chaîne d’outils JavaScript, puis lue par un service Python, est exactement la forme de cette panne — et les codes pays, les interrupteurs écrits on et off, les horaires écrits 12:30 sont assez courants pour la rencontrer.
C’est aussi pourquoi le correctif consiste à mettre des guillemets plutôt qu’à choisir un camp. Vous ne maîtrisez pas quel analyseur lira votre fichier en aval, et une chaîne entre guillemets veut dire la même chose pour tous.
Limites assumées
Cette page lit les valeurs ligne à ligne au lieu d’analyser réellement du YAML, et elle s’y tient de façon délibérément étroite : seules les lignes clé/valeur et les éléments de liste simples sont examinés, tout ce qui est déjà entre guillemets est ignoré, et tout scalaire de bloc introduit par une barre verticale ou un chevron est sauté avec l’intégralité de son corps indenté. Ce dernier point compte : un script shell dans un scalaire de bloc peut contenir des lignes qui ressemblent exactement à du YAML, et les signaler serait un faux positif, pas une trouvaille.
Cette étroitesse a un coût. Les collections en ligne, les fichiers multi-documents, les ancres et les clés de fusion ne sont pas analysés : une valeur cachée dans l’un d’eux ne sera pas signalée. L’analyse préfère se taire plutôt que se tromper.
Les règles YAML 1.1 sont transcrites des pages de types de yaml.org, qui publient les expressions régulières de résolution, et la transcription est vérifiée face à ces pages au lieu d’être crue sur parole. Les réponses 1.2 sont vérifiées face à js-yaml, la bibliothèque que ce site emploie déjà ailleurs. Rien de tout cela ne remplace l’exécution de votre analyseur réel sur votre fichier réel.
Enfin, qu’une valeur soit signalée ne veut pas dire que votre installation est cassée. Si tout ce qui lit le fichier est en YAML 1.2, NO est déjà une chaîne et il n’y a aucun problème. Le tableau dit où le fichier dépend de cette hypothèse, pas qu’elle soit fausse aujourd’hui.
Pourquoi est-ce gratuit ?
La vérification tient en quelques centaines de lignes de comparaison de motifs qui s’exécutent dans votre navigateur. Aucun serveur n’intervient : rien à facturer, aucun compte à créer — et cela compte ici, car un fichier de configuration nomme souvent des hôtes internes, des buckets et des services.
Rien n’est envoyé et rien n’est conservé. Rechargez la page et elle aura oublié le fichier.