¿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
snprintfes equivalente afprintf, excepto que la salida se escribe en una matriz (especificada por el argumentos) en lugar de en una secuencia. Sines cero, no se escribe nada yspuede ser un puntero nulo. De lo contrario, los caracteres de salida más allá deln-1se 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.