2015-07-22 16 views
20

Mi chiedo se questo produce in un comportamento indefinito:sta chiamando printf con argomenti in eccesso un comportamento indefinito?

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

I primi due argomenti che seguono la stringa di formato corrispondono alla stringa di formato, quindi queste sono OK; ma il 3 ° e il 4 ° argomento sono in eccesso perché non ci sono più specificatori di formato corrispondenti.

IMHO printf() deve semplicemente ignorare questi argomenti in eccesso e non dovrebbe esserci UB. È corretto?

+0

Penso che questa domanda sia come chiedere "Una funzione che accetta varargs può richiedere un numero qualsiasi di argomenti?". Il meccanismo che consente la gestione di un numero variabile di argomenti funziona indipendentemente dai particolari di come la funzione utilizza tali argomenti ... – SJuan76

risposta

32

Sì, questo scenario è definito esplicitamente dallo standard. È non comportamento non definito.

per citare il C11 standard capitolo §7.21.6.1, La funzione di fprintf()

[...] Se il formato si esaurisce mentre rimangono argomenti, gli argomenti in eccesso vengono valutati (come sempre) ma sono altrimenti ignorati [...]

+3

+1, non ero consapevole del fatto che sia esplicitamente definito. BTW "not UB" può essere ottimizzato, il "not" e il "un" annullano, rimane "comportamento definito". –

+0

Come qualcuno che non ha familiarità con l'implementazione di C: perché valutare gli argomenti avanzati? Supponendo che la stringa di formattazione originale (primo argomento) sia valutata prima delle sostituzioni, sembra che potrebbe essere ottimizzata. – Jules

+3

@JulesMazur Non valutare gli argomenti significherebbe che 'printf ("% d ", ++ i);' incrementerebbe 'i', mentre' printf ("foo", ++ i); 'non lo farebbe. Che non ha alcun senso ed è incredibilmente oscuro. Quindi, "come sempre", gli argomenti vengono valutati prima di essere passati, quindi ignorati dalla funzione. – Quentin

3

in sostanza, printf (o qualsiasi funzione di formattazione) esaminerà solo 'n' numero di% d,% c,% f. .., ecc. nella stringa di formato dall'argomento dell'elenco di variabili. Altri sono semplicemente ignorati.

Problemi correlati