O sprintf (buffer, “% s […]”, buffer, […]) é seguro?

Eu vi o uso desse padrão para concatenar em uma string em algum código no qual eu estava trabalhando:

sprintf(buffer, "%s <input type='file' name='%s' />\r\n", buffer, id);
sprintf(buffer, "%s</td>", buffer);

e estou bastante certo de que não é seguro C. Você notará quebuffer é a saída e a primeira entrada.

Além da possibilidade óbvia de um estouro de buffer, Acredito que não há garantia de que o buffer não seja alterado entre o início e o fim da função (ou seja, não há garantia de qual será o estado do buffer durante a execução da função). A assinatura do sprintf especifica adicionalmente que a cadeia de destino érestricted.

Eu também lembro de um relatório de umescrita especulativa no memcpye não vejo razão para que alguma biblioteca C faça a mesma coisa em um sprintf. Nesse caso, é claro, estaria escrevendo para sua fonte. assimeste comportamento é seguro?

Para sua informação, propus:

char *bufEnd = buffer + strlen(buffer);
/* sprintf returns the number of f'd and print'd into the s */
bufEnd += sprintf(bufEnd, " <input type='file' name='%s' />\r\n", id);

para substituir isso.

questionAnswers(3)

yourAnswerToTheQuestion