2016-01-30 39 views
11

Załóżmy, że zapomniałem zamknąć prawy wspornik kwadratowy ] zestawu skanowania. Co się wtedy stanie? Czy wywołuje Nieokreślone zachowanie?Co się stanie, jeśli zapomnę zamknąć zestaw?

Przykład:

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

dostaję ostrzeżenie z GCC podczas kompilacji:

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

i wyjście jako

s1='Hello!' s2='' 

Zauważyłam również, że sscanf zwraca 1 Ale co dokładnie się tutaj dzieje?

Sprawdziłem standard C11, ale nie znalazłem żadnych informacji na ten temat.

Odpowiedz

5

Doskonale! Powinieneś złożyć raport o usterce dla C11!

Oto odpowiednia część w C11 7.21.6.2

... specyfikatorem konwersja obejmuje wszystkie kolejne znaki w ciągu formatu, włącznie z pasujący wspornik prawy (]). Znaki między nawiasami (lista skanów) tworzą zestaw skanów, chyba że znak po lewym nawiasie jest okalający (^), w takim przypadku zestaw skanów zawiera wszystkie znaki, które nie pojawiają się na liście skanowania między oknem a prawym wspornikiem.

ścisłej interpretacji Znaki nawiasach jest to, że w przypadku braku wspornika zamknięcia nie ma takiej postaci, ale w obecności ^ jako pierwszy znak po [ byłoby niezgodne . gcc jest na tyle uprzejmy, aby wskazać prawdopodobny błąd w kodzie źródłowym. Rzeczywiste zachowanie jest określone przez implementację biblioteki C, ale nie wydaje się być określone w C Standard. Jako taka jest to forma nieokreślonego zachowania, że ​​IMHO powinno być rzeczywiście udokumentowane jako takie w Standardzie.

+0

Dzięki! Proponuję złożyć raport o usterce, ponieważ nie wiem, gdzie iść i jak to zrobić. –

+1

Wysłałem e-mail do Daniela Plakosha, sekretarza grupy roboczej C, będę informować o postępach. – chqrlie