Que se passe-t-il si j’oublie de fermer un scanset?

Supposons que j’ai oublié de fermer le crochet droit ] d’un scanset. Qu’est-ce qui va arriver ensuite? Invoque-t-il le comportement non défini?

Exemple:

 char str[] = "Hello! One Two Three"; char s1[50] = {0}, s2[50] = {0}; sscanf(str, "%s %[^h", s1, s2); /* UB? */ printf("s1='%s' s2='%s'\n", s1, s2); 

Je reçois un avertissement de GCC lors de la compilation:

 source_file.c: In function 'main': source_file.c:11:5: warning: no closing ']' for '%[' format [-Wformat=] sscanf(str, "%s %[^h", s1, s2); /* UB? */ 

et la sortie comme

 s1='Hello!' s2='' 

J’ai aussi remarqué que le sscanf revient à 1. Mais que se passe-t-il exactement ici?

J’ai vérifié la norme C11, mais je n’ai trouvé aucune information à ce sujet.

Excellent! Vous devriez déposer un rapport de défaut pour C11!

Voici la partie pertinente de C11 7.21.6.2

Le spécificateur de conversion inclut tous les caractères suivants dans la chaîne de format, y compris le crochet droit correspondant (]). Les caractères entre les crochets (la liste de balayage) composent le balayage, sauf si le caractère après le crochet de gauche est un circumflexe (^). Dans ce cas, le balayage contient tous les caractères qui n’apparaissent pas dans la liste de balayage entre le contour et le crochet droit.

Une interprétation ssortingcte des caractères entre crochets est qu’en l’absence d’un crochet de fermeture, il n’existe pas de tels caractères, mais en présence de ^ comme premier caractère après [ , il serait incohérent. gcc est assez gentil pour indiquer l’erreur probable dans le code source. Le comportement réel est déterminé par l’implémentation de la bibliothèque C, mais ne semble pas être spécifié dans la norme C. En tant que tel, il s’agit d’une forme de comportement indéfini pour lequel IMHO devrait vraiment être documenté en tant que tel dans la norme.