¿Este código causa un comportamiento indefinido? Porque el búfer tiene solo 128 bytes de largo, pero le digo a snprintf()
que es más largo. Sin embargo, la cadena resultante es más corta que 128 bytes.
#include <stdio.h> int main(void) { char buffer[128]; snprintf(buffer,294201,"%s","ABC"); puts(buffer); return 0; }
C 2018 7.21.6.5 2 dice:
La función
snprintf
es equivalente afprintf
, excepto que la salida se escribe en una matriz (especificada por el argumentos
) en lugar de en una secuencia. Sin
es cero, no se escribe nada ys
puede ser un puntero nulo. De lo contrario, los caracteres de salida más allá deln-1
se descartan en lugar de escribirse en la matriz, y se escribe un carácter nulo al final de los caracteres realmente escritos en la matriz.
Tenga en cuenta que esto no dice que a snprintf
se le pasa una matriz de n
o más caracteres. Por lo tanto, snprintf
no tiene ninguna licencia para asumir que puede escribir en s[n-1]
a menos que el fprintf
al que es equivalente escriba n
caracteres (incluido el carácter nulo de terminación).
Mirando esto de otra manera, supongamos que definimos un buffer
de matriz de 294,201 caracteres, lo llenamos con datos y llamamos a snprintf(buffer,294201,"%s","ABC");
. ¿Esperaríamos que no cambie nada más allá de los primeros cuatro caracteres? Si algún otro byte en el búfer cambiara, entonces esta llamada snprintf
no sería "equivalente a fprintf
, excepto que la salida se escribe en una matriz..." Lo consideraría una violación de esta especificación si cambiara algo más en el búfer.