Это расширение POSIX (не найдено в C99), которое просто позволит вам выбрать, какой аргумент из списка аргументов использовать для источника данных.
При обычном printf
каждый спецификатор формата %
извлекает текущий аргумент из списка и перемещает «указатель» к следующему. Это означает, что если вы хотите напечатать одно значение двумя разными способами, вам нужно что-то вроде:
printf ("%c %d\n", chVal, chVal);
Используя позиционные спецификаторы, вы можете сделать это следующим образом:
printf ("%1$c %1$d\n", chVal);
, поскольку обе строки формата будут использовать первый аргумент в качестве своего источника.
Другой пример на странице википедии:
printf ("%2$d %2$#x; %1$d %1$#x",16,17);
, который даст вам вывод:
17 0x11; 16 0x10
В основном это позволяет вам отключать порядок спецификаторов формата от предоставленных значений, позволяя вам перемещаться по списку аргументов любым удобным вам способом, используя значения снова и снова, в любом произвольном порядке.
Теперь, можете ли вы использовать это как вектор атаки пользователя, я сомневаюсь, поскольку он добавляет только средство для программиста , чтобы изменить источник данных, а не туда, куда данные отправляются .
Он не менее безопасен, чем обычный стиль printf
, и я не вижу реальных уязвимостей, если у вас нет возможности каким-либо образом изменить строку формата. Но, если бы вы могли это сделать, обычный printf
также был бы широко открыт для злоупотреблений.