Недавно, читая книгу Диомидиса Спинеллиса "Анализ программного кода на примере проектов Open Source", узнал что функция printf возвращает результат - количество фактически выведенных символов. Посмотрел в мане и стандарте на язык С - таки да "The printf function returns the number of characters transmitted, or a negative value if an output or encoding error occurred". А я то всегда думал что она void. И практически повсеместно встречал ее использование без проверки возвращаемого значения. К чему это может привести? Это может привести к тому, что в ходе выполнения программы может возникнуть ошибка, которая пройдет незамеченной (в лучшем случае).
Вообще все функции вывода - в частности, при перенаправлении стандартного потока вывода в файл - могут завершиться аварийно по целому ряду причин:
Функция err - это нестандартное BSD расширение для выдачи форматированных сообщений об ошибках.
Так, что подобные очевидные моменты не стоит недооценивать...
Upd: благодаря комментарию Сергея Кондрикова - вот ссылка на очень хорошую статью в Википедии: Printf. В ней, помимо всего прочего, довольно подробно описаны уязвимости функции и возможные последствия.
Вообще все функции вывода - в частности, при перенаправлении стандартного потока вывода в файл - могут завершиться аварийно по целому ряду причин:
- на устройстве, куда перенаправляется вывод, может не хватить свободного места
- может исчерпаться квота пользователя на объем дискового пространства
- процесс может попытаться записать файл, который превысит максимально допустимый для этого процесса или системы объем
- на устройстве может произойти аппаратная ошибка
- дескриптор файла или потока, ассоциированного со стандартным потоком вывода, может оказаться не разрешенным для записи
if (ferror(stdout))
err(1, "stdout");
Функция err - это нестандартное BSD расширение для выдачи форматированных сообщений об ошибках.
Так, что подобные очевидные моменты не стоит недооценивать...
Upd: благодаря комментарию Сергея Кондрикова - вот ссылка на очень хорошую статью в Википедии: Printf. В ней, помимо всего прочего, довольно подробно описаны уязвимости функции и возможные последствия.
This comment has been removed by the author.
ReplyDeleteЕсли не удалось записать, то это просто цветочки по сравнению с возможными эффектами от несоответствия строки форматирования и переданных аргументов.
ReplyDelete