Aquí está la situación:
Recibimos código de una fuente externa que usa sprintf como strcat. Me gusta esto:
char buffer[1024]; sprintf(buffer, "Some text."); sprintf(buffer, "%s%s", buffer, "Some more text"); sprintf(buffer, "%s%s", buffer, "again more text");Ahora, esto se ve raro. Todos estamos de acuerdo en que esto se ve raro. Eso no es lo que estoy preguntando. Todos sabemos que se debería haber usado strcat, y es más sencillo. Estoy preguntando sobre los posibles problemas, además de parecer raro, que esto podría causar. Estamos ejecutando en RHEL6 y usando gcc 4.9.3.
Gracias por tu ayuda.
La función se declara como
int sprintf(char * restrict s, const char * restrict format, ...); preste atención al calificador de tipo restrict .
Según el Estándar C (7.21.6.6 La función sprintf)
2 La función sprintf es equivalente a fprintf, excepto que la salida se escribe en una matriz (especificada por el argumento s) en lugar de en una secuencia. Se escribe un carácter nulo al final de los caracteres escritos; no se cuenta como parte del valor devuelto. Si la copia tiene lugar entre objetos que se superponen, el comportamiento no está definido .
Entonces estas llamadas
sprintf(buffer, "%s%s", buffer, "Some more text"); sprintf(buffer, "%s%s", buffer, "again more text");invocar un comportamiento indefinido.
En cambio, las llamadas podrían escribirse como
char buffer[1024]; int offset = 0; offset = sprintf( buffer + offset, "Some text."); offset += sprintf( buffer + offset, "%s", "Some more text"); sprintf( buffer + offset, "%s", "again more text");O
char buffer[1024]; char *p = buffer; p += sprintf( p, "Some text."); p += sprintf( p, "%s", "Some more text"); sprintf( p, "%s", "again more text"); En cuanto al calificador restrict entonces en términos generales en los medios (6.7.3 Calificadores de tipo)
8 Un objeto al que se accede a través de un puntero restringido tiene una asociación especial con ese puntero. Esta asociación, definida en 6.7.3.1 a continuación, requiere que todos los accesos a ese objeto usen, directa o indirectamente, el valor de ese puntero en particular.