У меня есть список чисел, и я хочу дать своим пользователям возможность ввести строку формата printf в стиле, чтобы указать, как должны выводиться числа.
Как я могу проверить предоставленную пользователем строку формата в моем списке параметров? Неправильный ввод не должен приводить к сбою программы, и я хочу избежать любых атак форматной строки.
Мне все равно, обрабатывает ли валидация только те параметры формата, которые указаны в POSIX, или специфический для компилятора суперсет. Для этого есть какой-нибудь библиотечный вызов, или мне придется написать самому?
Пояснение:
Мне нужно что-то вроде этого:
float var1, var2, var3, var4;
// var1 .. var2 are given by the program
const char * userSupplied = getFormatStringFromUser();
if( isValidFormat( userSupplied, "float", "float", "float", "float" ) )
printf( userSupplied, var1, var2, var3, var4 );
else
printf( "The format you gave was invalid!\n" );
В этом примере я знаю, что у меня есть четыре поплавка.
Я хочу разрешить любой формат, который ссылается только с нуля на четыре числа с плавающей точкой.
Таким образом, следующие строки формата должны быть разрешены isValidFormat () :
- "% f% g% e% .1f"
- "Foo% g, бар% g"
- "Ничего"
Хотя следует отклонить следующее: