2015-07-22 8 views
20

Zastanawiam się, czy to daje w niezdefiniowanej zachowań:Czy wywołanie printf z nadmiernymi argumentami niezdefiniowanego zachowania?

printf("Test %d %s", 123, "abc", "def", "ghi"); 

Pierwsze dwa argumenty po format string pasuje ciąg formatu, więc są OK; ale 3 i 4 argumenty są w nadmiarze, ponieważ nie ma więcej odpowiednich specyfikatorów formatu.

IMHO printf() powinien po prostu zignorować te nadmierne argumenty i nie powinno być żadnych UB. Czy to jest poprawne?

+0

Myślę, że to pytanie jest jak pytanie "Czy funkcja akceptująca varargs może przyjmować dowolną liczbę argumentów?". Mechanizm, który pozwala na posługiwanie się zmienną liczbą argumentów, działa niezależnie od tego, w jaki sposób funkcja używa tych argumentów ... – SJuan76

Odpowiedz

32

Tak, ten scenariusz jest wyraźnie określony przez standard. Jest to niezdefiniowane zachowanie not.

Cytując standardowego C11, rozdział §7.21.6.1, fprintf() funkcja

[...] Jeśli format jest wyczerpana, podczas gdy argumenty pozostają nadmiar argumenty są oceniane (jak zawsze) ale poza tym są ignorowane [...]

+3

+1, nie wiedziałem, że jest ona jawnie zdefiniowana. BTW "nie UB" można zoptymalizować, "nie" i "un" anulować, pozostaje "zdefiniowane zachowanie". –

+0

Jako ktoś, kto nie jest zaznajomiony z implementacją C: dlaczego ocenia resztki argumentów? Zakładając, że pierwotny ciąg formatu (pierwszy argument) jest oceniany przed zamianą, wydaje się, że można go zoptymalizować. – Jules

+3

@JulesMazur Nie przeliczanie argumentów oznaczałoby, że 'printf ("% d ", ++ i);' zwiększyłoby 'i', podczas gdy' printf ("foo", ++ i); 'nie. Które prawie nie ma sensu i jest niewiarygodnie niejasne. Dlatego "jak zwykle" argumenty są oceniane przed przekazaniem, a następnie ignorowane przez funkcję. – Quentin

3

Zasadniczo printf (lub dowolnej funkcji formatowania) przeanalizuje tylko 'n' liczbie% d,% C% f. .., itp. w łańcuchu formatu z argumentu listy zmiennych. Inne są po prostu ignorowane.

Powiązane problemy