Twój przykład jest bezpieczny. W rzeczywistości był bezpieczny z printf
. Podobnie jak printf
, Boost.Format analizuje tylko jeden ciąg formatu, więc nie ma możliwości wstawienia dodatkowych specyfikatorów formatu. Przekazanie niekompletnego obiektu format
do boost::format
powoduje zgłoszenie wyjątku.
Domyślam się, czego się boisz, to format string exploits. Są to, moim zdaniem, niemożliwe przy użyciu Boost.Format. Powody printf
jest podatne są zestawione przez Cowan et al.:
%n
pozwala na zapisywanie do dowolnych miejscach pamięci.
varargs
nie pozwala na zliczanie argumentów, więc ciąg znaków może wydrukować całą stertę.
varargs
nie jest bezpieczny w użyciu.
Ad (1), %n
został omitted z Boost.Format ", ponieważ nie pasuje w tym kontekście." Ad (2), Boost.Format nie używa varargs
i zgłasza wyjątek, gdy liczba argumentów nie pasuje do ciągu formatującego. Ad (3), jest to rozwiązane, ponieważ argumenty do operator%
są sprawdzane podczas kompilacji.
(ja po prostu starał się Boost.Format wydrukować adres ciąg C w pamięci przy użyciu własnego formatu, a to nie pozwoli mi.)
Ponadto, przepełnienie bufora w sprintf
jest uniknięto, ponieważ łańcuchy są przydzielane dynamicznie.
Jeśli chcesz być po bezpiecznej stronie, nie używaj ciągów formatów z niezaufanych źródeł.