Какие функции в стандартной библиотеке C обычно способствуют неправильной практике? [закрыто]

Это навеяно этим вопросом и комментариями к одному конкретному ответу, в котором я узнал, что 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 используются ненадлежащим образом / способами, которые могут вызвать / привести к проблемам безопасности / дефектам / неэффективности кода?

В интересах объективности я ряд критериев для ответа:

  • Пожалуйста, если можете, укажите причины дизайна, стоящие за данной функцией, то есть ее предполагаемое назначение.
  • Пожалуйста, выделите неправильное использование кода в настоящее время.
  • Пожалуйста, укажите почему такое неправильное использование может привести к проблеме. Я знаю, что это должно быть очевидно, но это мешает мягким ответам.

Пожалуйста, избегайте:

  • Споров по поводу соглашений об именах функций (кроме тех случаев, когда это однозначно вызывает путаницу).
  • «Я предпочитаю x, а не y» - предпочтение в порядке , они есть у всех, но меня интересуют реальные неожиданные побочные эффекты и способы защиты от них.

Поскольку это, вероятно, будет считаться субъективным и не имеет определенного ответа, я сразу же обращаюсь к вики сообщества. Я также работаю по C99.

54
задан 2 revsuser257111 23 May 2017 в 02:08
поделиться