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