Ваш пример в безопасности. На самом деле, это было безопасно с printf
. Как и printf
, Boost.Format анализирует только одну строку формата, поэтому нет никакой возможности вставить дополнительные спецификаторы формата. Передача неполного format
объекта в boost::format
вызывает исключение.
Полагаю, вы боитесь форматных строк . Это, я думаю, невозможно с помощью Boost.Format. Причины уязвимости printf
обобщены в Cowan и др. :
%n
позволяет выполнять запись в произвольные области памяти.
varargs
не позволяет считать аргументы, поэтому строка может распечатать всю кучу.
varargs
не является типобезопасным.
Объявление (1), %n
было опущено в Boost.Format "потому что оно не вписывается в этот контекст". Объявление (2), Boost.Format не использует varargs
и выдает исключение, когда количество аргументов не соответствует форматной строке. В Ad (3) это решается, потому что аргументы operator%
проверяются во время компиляции.
(Я только что попытался заставить Boost.Format напечатать адрес строки C в памяти, используя строку произвольного формата, и это мне не дало.)
Кроме того, переполнение буфера в sprintf
предотвращается, поскольку строки распределяются динамически.
Если вы хотите быть в безопасности, не используйте строки форматирования из ненадежных источников.