Me pregunto si esto produce un comportamiento indefinido:
printf("Test %d %s", 123, "abc", "def", "ghi");Los dos primeros argumentos después de la cadena de formato coinciden con la cadena de formato, por lo que están bien; pero los argumentos tercero y cuarto están en exceso porque no hay más especificadores de formato correspondientes.
En mi humilde opinión printf() simplemente debería ignorar estos argumentos en exceso y no debería haber UB. ¿Es esto correcto?
Sí, este escenario está explícitamente definido por la norma. No es un comportamiento indefinido.
Para citar el estándar C11 , capítulo §7.21.6.1, La función fprintf()
[...] Si el formato se agota mientras quedan argumentos, los argumentos en exceso se evalúan (como siempre) pero de lo contrario se ignoran [...]
Básicamente, printf (o cualquier función de formato) buscará solo el número 'n' de %d, %c, %f..., etc. en la cadena de formato del argumento de la lista de variables. Otros simplemente son ignorados.