2016-01-30 21 views
11

Supponiamo di aver dimenticato di chiudere la staffa quadrata destra ] di un set. Cosa succederà allora? Invoca il comportamento indefinito?Cosa succede se dimentico di chiudere un set?

Esempio:

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); 

Ho ricevuto un avviso da GCC durante la compilazione:

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

e l'uscita come

s1='Hello!' s2='' 

Ho anche notato che i sscanf restituisce 1 Ma cosa sta succedendo esattamente qui?

Ho controllato lo standard C11, ma non ho trovato alcuna informazione relativa a questo.

risposta

5

Eccellente! Dovresti presentare un rapporto sui difetti per C11!

Qui è la parte rilevante C11 7.21.6.2

... L'indicatore di conversione comprende tutti i caratteri successivi nella stringa di formato, fino ad includere la staffa destra corrispondente (]). I caratteri tra parentesi (la lista di scansione) compongono lo scanset, a meno che il carattere dopo la parentesi di sinistra non sia un circonflesso (^), nel qual caso l'insieme contiene tutti i caratteri che non compaiono nell'elenco di scansione tra il circonflesso e il braccio destro.

Una rigida interpretazione I caratteri tra parentesi è che in assenza di una staffa di chiusura non vi siano tali caratteri, ma in presenza di ^ come primo carattere dopo [, sarebbe incoerente . gcc è abbastanza gentile da indicare il probabile errore nel codice sorgente. Il comportamento effettivo è determinato dall'implementazione della libreria C, ma non sembra essere specificato nello standard C. In quanto tale, è una forma di comportamento indefinito che IMHO dovrebbe essere realmente documentato come tale nello Standard.

+0

Grazie! Ti suggerisco di presentare un rapporto sui difetti perché non so dove andare e come farlo. –

+1

Ho mandato una mail a Daniel Plakosh, il segretario del gruppo di lavoro del C, ti terrò informato sul procedimento. – chqrlie

Problemi correlati