Это вдохновлено этим вопросом и комментариями к одному конкретному ответу, в котором я узнал, что strncpy
не очень безопасная функция обработки строк в C, и она дополняет нулями, пока не достигнет n
, о чем я не знал.
В частности, чтобы процитировать R..
strncpy не завершается нулем и заполняет нулем всю оставшуюся часть целевого буфера, что является огромной тратой времени. Вы можете обойти первое, добавив собственное пустое заполнение, но не последнее. Он никогда не предназначался для использования в качестве функции «безопасной обработки строк», но для работы с полями фиксированного размера в таблицах каталогов Unix и файлах базы данных. snprintf(dest, n, "%s", src) - единственный правильный "безопасный strcpy" в стандартном C, но он, вероятно, будет намного медленнее. Между прочим, усечение само по себе может быть серьезной ошибкой и в некоторых случаях может привести к повышению привилегий или отказу в обслуживании, поэтому использование «безопасных» строковых функций, которые усекают свой вывод в проблеме, не является способом сделать ее «безопасной» или « безопасный". Вместо этого вы должны убедиться, что буфер назначения имеет правильный размер, и просто использовать strcpy (или, что еще лучше, memcpy, если вы уже знаете длину исходной строки).
И от Джонатана Леффлера
Обратите внимание, что интерфейс strncat() еще более сбивает с толку, чем strncpy() — опять же, что это за аргумент длины? Это не то, что вы ожидаете, основываясь на том, что вы предоставляете strncpy() и т. д., поэтому он более подвержен ошибкам, даже чем strncpy(). Что касается копирования строк, я все больше склоняюсь к мнению, что есть веский аргумент в пользу того, что вам нужна только memmove(), потому что вы всегда заранее знаете все размеры и заранее убедитесь, что места достаточно. Используйте memmove() вместо любого из методов strcpy(), strcat(), strncpy(), strncat(), memcpy().
Итак, я явно немного заржавел в стандартной библиотеке C. Поэтому я хотел бы задать вопрос:
Какие функции стандартной библиотеки C используются ненадлежащим образом/таким образом, что это может вызвать/привести к проблемам безопасности/дефектам кода/неэффективности?
В интересах объективности у меня есть ряд критериев для ответа:
- Пожалуйста, если можете, укажите конструктивные причины рассматриваемой функции, т.е. ее предполагаемое назначение.
- Пожалуйста, выделите неправомерное использование кода в настоящее время.
- Укажите, почему такое неправильное использование может привести к возникновению проблемы. Я знаю, что это должно быть очевидно, но это предотвращает мягкие ответы.
Пожалуйста, избегайте:
- Дебаты по поводу соглашений об именах функций (за исключением случаев, когда это однозначно вызывает путаницу).
- «Я предпочитаю x, а не y» — предпочтения в порядке, они есть у всех, но меня интересуют настоящие неожиданные побочные эффекты и способы защиты от них.
Поскольку это, вероятно, будет считаться субъективным и не имеет определенного ответа, я сразу отмечаю вики сообщества.
Я также работаю в соответствии с C99.