Su ejemplo es seguro. De hecho, era seguro con printf
. Al igual que printf
, Boost.Format solo analiza su cadena de formato una vez, por lo que no hay posibilidad de insertar especificadores de formato adicionales. Pasar un objeto format
incompleto a boost::format
arroja una excepción.
Supongo que lo que le teme es format string exploits. Esos, creo, imposibles usando Boost.Format. Las razones por las printf
es vulnerable son resumidos por Cowan et al.:
%n
permite la escritura a las posiciones de memoria arbitrarias.
varargs
no permite el recuento de argumentos, por lo que una cadena puede imprimir todo el montón.
varargs
no es seguro.
anuncio (1), %n
ha sido omitted de Boost.Format "porque no encaja en este contexto". Ad (2), Boost.Format no usa varargs
y arroja una excepción cuando el número de argumentos no se ajusta a la cadena de formato. Ad (3), esto se resuelve porque los argumentos a operator%
se comprueban en tiempo de compilación.
(Sólo traté de conseguir Boost.Format para imprimir la dirección de una cadena C en la memoria utilizando una cadena de formato personalizado, y no me deja.)
Además, el desbordamiento de búfer en sprintf
es evitado porque las cadenas se asignan dinámicamente.
Si quiere estar seguro, no use cadenas de formato de fuentes que no sean de confianza.