Последняя строка - это пример команды для запуска, чтобы продемонстрировать сбой с примером программы. По сути, Perl печатает 2.100.000 раз «5», а затем передает это в стандартный поток программы «a.out» (которая должна быть скомпилированной программой примера).
Прежде всего, scanf()
следует использовать только для тестирования, а не в реальных программах из-за нескольких проблем, которые он не будет корректно обрабатывать (например, запрашивать «% i», но пользователь вводит «12345abc» («abc»). "останется в stdin и может привести к тому, что следующие входные данные будут заполнены без возможности изменения пользователем).
Относительно этой проблемы: scanf()
будет знать, что должно прочитать целочисленное значение, однако не будет знать, как долго это может продолжаться. Указатель может указывать на 16-битное целое, 32-битное целое или 64-битное целое или что-то еще большее (что он не знает). Функции с переменным числом аргументов (определены с помощью ...
) не знают точный тип данных переданных элементов, поэтому он должен полагаться на строку формата (причина в том, что теги формата не являются необязательными, как в C #, где вы просто нумеруйте их, например "{0} {1} {2}"
). А без заданной длины она должна принимать некоторую длину, которая также может зависеть от платформы (что делает функцию еще более небезопасной для использования).
В общем, посчитайте, что это возможно вредно и является отправной точкой для атак переполнения буфера. Если вы хотите обезопасить и оптимизировать свою программу, начните с замены ее альтернативами.