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