stringtranslate.com

Обработка C-строки

Язык программирования C имеет набор функций, реализующих операции над строками (строками символов и строками байтов) в своей стандартной библиотеке . Поддерживаются различные операции, такие как копирование, конкатенация , токенизация и поиск. Для строк символов стандартная библиотека использует соглашение, что строки заканчиваются нулем : строка из n символов представляется как массив из n + 1 элементов, последний из которых является « символом NUL » с числовым значением 0.

Единственная поддержка строк в самом языке программирования заключается в том, что компилятор транслирует заключенные в кавычки строковые константы в строки с завершающим нулем.

Определения

Строка определяется как непрерывная последовательность кодовых единиц, завершающаяся первой нулевой кодовой единицей (часто называемой нулевой кодовой единицей). [1] Это означает, что строка не может содержать нулевую кодовую единицу, так как первая увиденная отмечает конец строки. Длина строки — это количество кодовых единиц до нулевой кодовой единицы. [1] Память, занимаемая строкой, всегда на одну кодовую единицу больше длины, так как для хранения нулевого терминатора требуется место.

Обычно термин строка означает строку, в которой кодовая единица имеет тип char, который на всех современных машинах составляет ровно 8 бит. C90 определяет широкие строки [1] , которые используют кодовую единицу типа wchar_t, которая на современных машинах составляет 16 или 32 бита. Это было предназначено для Unicode , но все чаще вместо этого в обычных строках для Unicode используется UTF-8 .

Строки передаются в функции путем передачи указателя на первую кодовую единицу. Поскольку char *и wchar_t *являются разными типами, функции, обрабатывающие широкие строки, отличаются от функций, обрабатывающих обычные строки, и имеют разные имена.

Строковые литералы ( "text"в исходном коде C) преобразуются в массивы во время компиляции. [2] Результатом является массив кодовых единиц, содержащий все символы плюс конечный нулевой кодовый блок. В C90 L"text"создается широкая строка. Строковый литерал может содержать нулевой кодовый блок (один из способов — поместить \0в исходный код), но это приведет к тому, что строка закончится в этой точке. Остальная часть литерала будет помещена в память (с добавлением еще одного нулевого кодового блока в конец), но невозможно узнать, были ли эти кодовые единицы переведены из строкового литерала, поэтому такой исходный код не является строковым литералом. [3]

Кодировки символов

Каждая строка заканчивается первым вхождением нулевой кодовой единицы соответствующего вида ( charили wchar_t). Следовательно, байтовая строка ( char*) может содержать ненулевые символы в ASCII или любом расширении ASCII , но не символы в кодировках, таких как UTF-16 (даже если 16-битная кодовая единица может быть ненулевой, ее старший или младший байт может быть нулевым). Кодировки, которые могут быть сохранены в широких строках, определяются шириной wchar_t. В большинстве реализаций wchar_tсоставляет не менее 16 бит, и поэтому могут быть сохранены все 16-битные кодировки, такие как UCS-2 . Если wchar_tсоставляет 32 бита, то могут быть сохранены 32-битные кодировки, такие как UTF-32 . (Стандарт требует «тип, который содержит любой широкий символ», что в Windows больше не выполняется после перехода с UCS-2 на UTF-16. Это было признано дефектом в стандарте и исправлено в C++.) [4] C++11 и C11 добавляют два типа с явной шириной char16_tи char32_t. [5]

Кодировки переменной ширины могут использоваться как в байтовых строках, так и в широких строках. Длина строки и смещения измеряются в байтах или wchar_t, а не в «символах», что может сбивать с толку начинающих программистов. UTF-8 и Shift JIS часто используются в байтовых строках C, в то время как UTF-16 часто используется в широких строках C, когда wchar_tсоставляет 16 бит. Усечение строк с символами переменной ширины с помощью таких функций strncpyможет привести к появлению недопустимых последовательностей в конце строки. Это может быть небезопасно, если усеченные части интерпретируются кодом, который предполагает, что входные данные допустимы.

Поддержка литералов Unicode, таких как (UTF-8) или (UTF-16 или UTF-32, в зависимости от ), определяется реализацией [6] и может потребовать, чтобы исходный код был в той же кодировке, особенно для случаев, когда компиляторы могут просто копировать то, что находится между кавычками. Некоторые компиляторы или редакторы потребуют ввода всех не-ASCII символов в виде последовательностей для каждого байта UTF-8 и/или для каждого слова UTF-16. Начиная с C11 (и C++11), доступен новый префикс литерала, который гарантирует UTF-8 для литерала строки байтов, как в . [7] Начиная с C++20 и C23 , был добавлен тип, предназначенный для хранения символов UTF-8, а типы префиксных символьных и строковых литералов u8 были изменены на и соответственно.char foo[512] = "φωωβαρ";wchar_t foo[512] = L"φωωβαρ";wchar_tchar\xNN\uNNNNu8char foo[512] = u8"φωωβαρ";char8_tchar8_tchar8_t[]

Функции

Терминология

В исторической документации термин «символ» часто использовался вместо «байта» для строк C, что приводит многих [ кто? ] к мысли, что эти функции каким-то образом не работают для UTF-8 . Фактически, все длины определяются как в байтах, и это верно во всех реализациях, и эти функции работают как с UTF-8, так и с однобайтовыми кодировками. Документация BSD была исправлена, чтобы прояснить это, но документация POSIX, Linux и Windows по-прежнему использует «символ» во многих местах, где «байт» или «wchar_t» являются правильным термином.

Функции для обработки буферов памяти могут обрабатывать последовательности байтов, включающие нулевой байт как часть данных. Имена этих функций обычно начинаются с mem, в противоположность префиксу str.

Заголовки

Большинство функций, работающих со строками C, объявляются в string.hзаголовке ( cstringв C++), в то время как функции, работающие со строками C wide, объявляются в wchar.hзаголовке ( cwcharв C++). Эти заголовки также содержат объявления функций, используемых для обработки буферов памяти; таким образом, это название является не совсем правильным.

Функции, объявленные в , string.hчрезвычайно популярны, поскольку, как часть стандартной библиотеки C , они гарантированно работают на любой платформе, которая поддерживает C. Однако с этими функциями существуют некоторые проблемы безопасности, такие как потенциальное переполнение буфера при неаккуратном и неправильном использовании, заставляющие программистов предпочитать более безопасные и, возможно, менее переносимые варианты, из которых некоторые популярные перечислены ниже. Некоторые из этих функций также нарушают константную корректность , принимая constуказатель на строку и возвращая не constуказатель внутри строки. Чтобы исправить это, некоторые из них были разделены на две перегруженные функции в версии стандартной библиотеки C++.

Константы и типы

Функции

Многобайтовые функции

Все эти функции требуютmbstate_tобъект, изначально в статической памяти (что делает функции не потокобезопасными) и в более поздних дополнениях вызывающий должен поддерживать. Первоначально это было предназначено для отслеживания состояний сдвига вмбкодировки, но современные, такие как UTF-8, не нуждаются в этом. Однако эти функции были разработаны на основе предположения, чтоТуалеткодировка не является кодировкой переменной ширины и, таким образом, предназначена для работы только с однимwchar_tза раз, передавая его по значению, а не используя указатель на строку. Поскольку UTF-16 — это кодировка переменной ширины,mbstate_tбыл повторно использован для отслеживания суррогатных пар в широкой кодировке, хотя вызывающая сторона все равно должна обнаружить и вызватьмбтовкдважды для одного символа. [80] [81] [82] Более поздние дополнения к стандарту признают, что единственное преобразование, которое интересует программистов, — это преобразование между UTF-8 и UTF-16, и напрямую предоставляют это.

Числовые преобразования

Стандартная библиотека C содержит несколько функций для числовых преобразований. Функции, которые работают с байтовыми строками, определены в stdlib.hзаголовке ( cstdlibheader в C++). Функции, которые работают с широкими строками, определены в wchar.hзаголовке ( cwcharheader в C++).

Функции strchr, bsearch, strpbrk, strrchr, strstr, memchrи их широкие аналоги не являются const-correct , поскольку они принимают constуказатель на строку и возвращают не- constуказатель внутри строки. Это было исправлено в C23 . [95]

Также, начиная с Нормативной поправки 1 (C95), atoxxфункции считаются включенными в strtoxxxфункции, по этой причине ни C95, ни любой более поздний стандарт не предоставляют версии этих функций с широкими символами. Аргумент против atoxxзаключается в том, что они не различают ошибку и 0. [96]

Популярные расширения

Замены

Несмотря на общепризнанную необходимость замены strcat[22] и strcpy[18] функциями, которые не допускают переполнения буфера, общепринятого стандарта не появилось. Это отчасти связано с ошибочным убеждением многих программистов на языке C, что strncatи strncpyимеют желаемое поведение; однако ни одна из функций не была разработана для этого (они были предназначены для манипулирования буферами строк фиксированного размера с нулевым дополнением, формат данных, который реже используется в современном программном обеспечении), а поведение и аргументы неинтуитивны и часто пишутся неправильно даже опытными программистами. [108]

Наиболее популярной [a] заменой являются функции strlcat[111] и strlcpy[112] , которые появились в OpenBSD 2.4 в декабре 1998 года. [108] Эти функции всегда записывают один NUL в буфер назначения, при необходимости усекая результат, и возвращают размер буфера, который потребуется, что позволяет обнаружить усечение и предоставляет размер для создания нового буфера, который не будет усекаться. Долгое время они не были включены в библиотеку GNU C (используемую программным обеспечением в Linux) на основании того, что они якобы неэффективны, [113] поощряют использование строк C (вместо какой-либо превосходной альтернативной формы строки), [114] [115] и скрывают другие потенциальные ошибки. [116] [117] Даже несмотря на то, что glibc не добавила поддержку, strlcat и strlcpy были реализованы в ряде других библиотек C, включая библиотеки для OpenBSD, FreeBSD , NetBSD , Solaris , OS X и QNX , а также в альтернативных библиотеках C для Linux, таких как libbsd, представленная в 2008 году, [118] и musl , представленная в 2011 году, [119] [120] , а исходный код был добавлен непосредственно в другие проекты, такие как SDL , GLib , ffmpeg , rsync и даже внутри ядра Linux . Это изменилось в 2024 году, в часто задаваемых вопросах по glibc отмечается, что с версии glibc 2.38 код был зафиксирован [121] и, таким образом, добавлен. [122] Эти функции были стандартизированы как часть POSIX.1-2024, [123] Austin Group Defect Tracker ID 986 отслеживал некоторые обсуждения таких планов для POSIX.

Иногда используются memcpy[53] или memmove[55]strcpy , так как они могут быть более эффективными, чем те, которые не проверяют повторно NUL (это менее верно для современных процессоров). Поскольку им нужна длина буфера в качестве параметра, правильная настройка этого параметра может избежать переполнения буфера.

В рамках своего жизненного цикла разработки безопасности 2004 года Microsoft представила семейство «безопасных» функций, включая strcpy_sи strcat_s(наряду со многими другими). ​​[124] Эти функции были стандартизированы с некоторыми незначительными изменениями как часть необязательного C11 (Приложение K), предложенного ISO/IEC WDTR 24731. [125] Эти функции выполняют различные проверки, включая проверку того, является ли строка слишком длинной для помещения в буфер. Если проверки не пройдены, вызывается указанная пользователем функция «обработчика ограничений времени выполнения», [126] которая обычно прерывает программу. [127] [128] Эти функции вызвали значительную критику, поскольку изначально они были реализованы только в Windows, и в то же время Microsoft Visual C++ начал выдавать предупреждающие сообщения, предлагающие использовать эти функции вместо стандартных. Некоторые предполагали, что это попытка Microsoft запереть разработчиков на своей платформе. [129] Опыт работы с этими функциями показал существенные проблемы с их принятием и ошибками в использовании, поэтому предлагается удалить Приложение K для следующей редакции стандарта C. [130] Использование memset_sбыло предложено как способ избежать нежелательных оптимизаций компилятора. [131] [132]

Смотрите также

Примечания

  1. ^ На GitHub зарегистрировано 7 813 206 использований strlcpy, по сравнению с 38 644 использованиями strcpy_s(и 15 286 150 использованиями strcpy). [ необходима цитата ]

Ссылки

  1. ^ abc "Проект стандарта C99 + TC3" (PDF) . §7.1.1p1 . Получено 7 января 2011 г. .{{cite web}}: CS1 maint: местоположение ( ссылка )
  2. ^ "Проект стандарта C99 + TC3" (PDF) . §6.4.5p7 . Получено 7 января 2011 г.{{cite web}}: CS1 maint: местоположение ( ссылка )
  3. ^ "Проект стандарта C99 + TC3" (PDF) . Раздел 6.4.5 сноска 66. Получено 7 января 2011 г.{{cite web}}: CS1 maint: местоположение ( ссылка )
  4. ^ «Смягчить требования к wchar_t для соответствия существующей практике» (PDF) .
  5. ^ "Основные типы". en.cppreference.com .
  6. ^ "Проект стандарта C99 + TC3" (PDF) . §5.1.1.2 Фазы перевода , стр . 1. Получено 23 декабря 2011 г.{{cite web}}: CS1 maint: местоположение ( ссылка )
  7. ^ "строковые литералы". en.cppreference.com . Получено 23 декабря 2019 г. .
  8. ^ "c++ - Каково применение wchar_t в общем программировании?". Stack Overflow . Получено 1 августа 2022 г.
  9. ^ "stddef.h - стандартные определения типов". The Open Group . Получено 28 января 2017 г. .
  10. ^ Гиллам, Ричард (2003). Unicode Demystified: A Practical Programmer's Guide to the Encoding Standard. Addison-Wesley Professional. стр. 714. ISBN 9780201700527.
  11. ^ "char, wchar_t, char8_t, char16_t, char32_t". docs.microsoft.com . Получено 1 августа 2022 г. .
  12. ^ "char8_t".
  13. ^ ab "<cuchar> (uchar.h)".
  14. ^ "char16_t".
  15. ^ ab "Замена текстовых макросов".
  16. ^ ab "Основные типы".
  17. ^ "char32_t".
  18. ^ ab "strcpy - cppreference.com". En.cppreference.com. 2 января 2014 г. Получено 6 марта 2014 г.
  19. ^ "wcscpy - cppreference.com". En.cppreference.com . Получено 6 марта 2014 г. .
  20. ^ "strncpy - cppreference.com". En.cppreference.com. 4 октября 2013 г. Получено 6 марта 2014 г.
  21. ^ "wcsncpy - cppreference.com". En.cppreference.com . Получено 6 марта 2014 г. .
  22. ^ ab "strcat - cppreference.com". En.cppreference.com. 8 октября 2013 г. Получено 6 марта 2014 г.
  23. ^ "wcscat - cppreference.com". En.cppreference.com . Получено 6 марта 2014 г. .
  24. ^ "strncat - cppreference.com". En.cppreference.com. 1 июля 2013 г. Получено 6 марта 2014 г.
  25. ^ "wcsncat - cppreference.com". En.cppreference.com . Получено 6 марта 2014 г. .
  26. ^ "strxfrm - cppreference.com". En.cppreference.com . Получено 6 марта 2014 г. .
  27. ^ "wcsxfrm - cppreference.com". En.cppreference.com . Получено 6 марта 2014 г. .
  28. ^ "strlen - cppreference.com". En.cppreference.com. 27 декабря 2013 г. Получено 6 марта 2014 г.
  29. ^ "wcslen - cppreference.com". En.cppreference.com . Получено 6 марта 2014 г. .
  30. ^ "strcmp - cppreference.com". En.cppreference.com . Получено 6 марта 2014 г. .
  31. ^ "wcscmp - cppreference.com". En.cppreference.com . Получено 6 марта 2014 г. .
  32. ^ "strncmp - cppreference.com". En.cppreference.com . Получено 6 марта 2014 г. .
  33. ^ "wcsncmp - cppreference.com". En.cppreference.com . Получено 6 марта 2014 г. .
  34. ^ "strcoll - cppreference.com". En.cppreference.com . Получено 6 марта 2014 г. .
  35. ^ "wcscoll - cppreference.com". En.cppreference.com . Получено 6 марта 2014 г. .
  36. ^ "strchr - cppreference.com". En.cppreference.com. 23 февраля 2014 г. Получено 6 марта 2014 г.
  37. ^ "wcschr - cppreference.com". En.cppreference.com . Получено 6 марта 2014 г. .
  38. ^ "strrchr - cppreference.com". En.cppreference.com . Получено 6 марта 2014 г. .
  39. ^ "wcsrchr - cppreference.com". En.cppreference.com . Получено 6 марта 2014 г. .
  40. ^ "strspn - cppreference.com". En.cppreference.com . Получено 6 марта 2014 г. .
  41. ^ "wcsspn - cppreference.com". En.cppreference.com . Получено 6 марта 2014 г. .
  42. ^ "strcspn - cppreference.com". En.cppreference.com. 31 мая 2013 г. Получено 6 марта 2014 г.
  43. ^ "wcscspn - cppreference.com". En.cppreference.com . Получено 6 марта 2014 г. .
  44. ^ "strpbrk - cppreference.com". En.cppreference.com. 31 мая 2013 г. Получено 6 марта 2014 г.
  45. ^ "wcspbrk - cppreference.com". En.cppreference.com . Получено 6 марта 2014 г. .
  46. ^ "strstr - cppreference.com". En.cppreference.com. 16 октября 2013 г. Получено 6 марта 2014 г.
  47. ^ "wcsstr - cppreference.com". En.cppreference.com . Получено 6 марта 2014 г. .
  48. ^ "strtok - cppreference.com". En.cppreference.com. 3 сентября 2013 г. Получено 6 марта 2014 г.
  49. ^ "wcstok - cppreference.com". En.cppreference.com . Получено 6 марта 2014 г. .
  50. ^ "strerror - cppreference.com". En.cppreference.com. 31 мая 2013 г. Получено 6 марта 2014 г.
  51. ^ "memset - cppreference.com". En.cppreference.com . Получено 6 марта 2014 г. .
  52. ^ "wmemset - cppreference.com". En.cppreference.com . Получено 6 марта 2014 г. .
  53. ^ ab "memcpy - cppreference.com". En.cppreference.com . Получено 6 марта 2014 г. .
  54. ^ "wmemcpy - cppreference.com". En.cppreference.com . Получено 6 марта 2014 г. .
  55. ^ ab "memmove - cppreference.com". En.cppreference.com. 25 января 2014 г. Получено 6 марта 2014 г.
  56. ^ "wmemmove - cppreference.com". En.cppreference.com . Получено 6 марта 2014 г. .
  57. ^ "memcmp - cppreference.com". En.cppreference.com . Получено 6 марта 2014 г. .
  58. ^ "wmemcmp - cppreference.com". En.cppreference.com . Получено 6 марта 2014 г. .
  59. ^ "memchr - cppreference.com". En.cppreference.com . Получено 6 марта 2014 г. .
  60. ^ "wmemchr - cppreference.com". En.cppreference.com . Получено 6 марта 2014 г. .
  61. ^ "mblen - cppreference.com". En.cppreference.com . Получено 6 марта 2014 г. .
  62. ^ "mbtowc - cppreference.com". En.cppreference.com . Получено 6 марта 2014 г. .
  63. ^ "wctomb - cppreference.com". En.cppreference.com. 4 февраля 2014 г. Получено 6 марта 2014 г.
  64. ^ "mbstowcs - cppreference.com". En.cppreference.com . Получено 6 марта 2014 г. .
  65. ^ "wcstombs - cppreference.com". En.cppreference.com . Получено 6 марта 2014 г. .
  66. ^ "btowc - cppreference.com". En.cppreference.com . Получено 6 марта 2014 г. .
  67. ^ "wctob - cppreference.com". En.cppreference.com . Получено 6 марта 2014 г. .
  68. ^ "mbsinit - cppreference.com". En.cppreference.com . Получено 6 марта 2014 г. .
  69. ^ "mbrlen - cppreference.com". En.cppreference.com . Получено 6 марта 2014 г. .
  70. ^ "mbrtowc - cppreference.com". En.cppreference.com . Получено 6 марта 2014 г. .
  71. ^ "wcrtomb - cppreference.com". En.cppreference.com . Получено 6 марта 2014 г. .
  72. ^ "mbsrtowcs - cppreference.com". En.cppreference.com . Получено 6 марта 2014 г. .
  73. ^ "wcsrtombs - cppreference.com". En.cppreference.com . Получено 6 марта 2014 г. .
  74. ^ "mbrtoc8 - cppreference.com" . En.cppreference.com.
  75. ^ "c8rtomb - cppreference.com". Ru.cppreference.com.
  76. ^ "mbrtoc16 - cppreference.com". Ru.cppreference.com.
  77. ^ "c16rtomb - cppreference.com" . En.cppreference.com.
  78. ^ "mbrtoc32 - cppreference.com". Ru.cppreference.com.
  79. ^ "c23rtomb - cppreference.com" . En.cppreference.com.
  80. ^ "6.3.2 Представление состояния преобразования". Библиотека GNU C. Получено 31 января 2017 г.
  81. ^ "root/src/multibyte/c16rtomb.c" . Получено 31 января 2017 г. .
  82. ^ "Содержимое /stable/11/lib/libc/locale/c16rtomb.c" . Получено 31 января 2017 г.
  83. ^ "atof - cppreference.com". En.cppreference.com. 31 мая 2013 г. Получено 6 марта 2014 г.
  84. ^ "Атои, атолл, атолл - cppreference.com" . En.cppreference.com. 18 января 2014 года . Проверено 6 марта 2014 г.
  85. ^ "strtof, strtod, strtold - cppreference.com". En.cppreference.com. 4 февраля 2014 г. Получено 6 марта 2014 г.
  86. ^ "strtof, strtod, strtold - cppreference.com". En.cppreference.com. 4 февраля 2014 г. Получено 6 марта 2014 г.
  87. ^ "strtof, strtod, strtold - cppreference.com". En.cppreference.com. 4 февраля 2014 г. Получено 6 марта 2014 г.
  88. ^ "wcstof, wcstod, wcstold - cppreference.com". En.cppreference.com . Получено 6 марта 2014 г. .
  89. ^ "wcstof, wcstod, wcstold - cppreference.com". En.cppreference.com . Получено 6 марта 2014 г. .
  90. ^ "wcstof, wcstod, wcstold - cppreference.com". En.cppreference.com . Получено 6 марта 2014 г. .
  91. ^ "strtol, strtoll - cppreference.com". En.cppreference.com. 4 февраля 2014 г. Получено 6 марта 2014 г.
  92. ^ "wcstol, wcstoll - cppreference.com". En.cppreference.com . Получено 6 марта 2014 г. .
  93. ^ "strtoul, strtoull - cppreference.com". En.cppreference.com. 4 февраля 2014 г. Получено 6 марта 2014 г.
  94. ^ "wcstoul, wcstoull - cppreference.com". En.cppreference.com . Получено 6 марта 2014 г. .
  95. ^ "WG14-N3020: Стандартные библиотечные функции, сохраняющие квалификаторы, v4" (PDF) . open-std.org . 13 июня 2022 г.
  96. ^ Обоснование C99, 7.20.1.1
  97. ^ "bzero". The Open Group . Получено 27 ноября 2017 г.
  98. ^ "bzero(3)". OpenBSD . Получено 27 ноября 2017 .
  99. ^ "memccpy". Pubs.opengroup.org . Получено 6 марта 2014 г. .
  100. ^ "mempcpy(3) - страница руководства Linux". Kernel.org . Получено 6 марта 2014 г. .
  101. ^ "strcasecmp(3) - страница руководства Linux". Kernel.org . Получено 6 марта 2014 г. .
  102. ^ "strcat_s, wcscat_s, _mbscat_s". docs.microsoft.com . Получено 22 апреля 2022 г. .
  103. ^ "strcpy_s, wcscpy_s, _mbscpy_s, _mbscpy_s_l". docs.microsoft.com . Получено 22 апреля 2022 г. .
  104. ^ "strdup". Pubs.opengroup.org . Получено 6 марта 2014 г. .
  105. ^ "strerror(3) - Страница руководства Linux". man7.org . Получено 3 ноября 2019 г. .
  106. ^ "String | stricmp()". C Programming Expert.com . Получено 6 марта 2014 г. .
  107. ^ ab "strlcpy, strlcat — копирование и конкатенация строк с ограниченным размером". OpenBSD . Получено 26 мая 2016 .
  108. ^ abcd Тодд К. Миллер; Тео де Раадт (1999). "strlcpy и strlcat – согласованное, безопасное копирование и конкатенация строк". USENIX '99.
  109. ^ "strsignal". Pubs.opengroup.org . Получено 6 марта 2014 г. .
  110. Ссылки ​Pubs.opengroup.org . Проверено 6 марта 2014 г.
  111. ^ Тодд К. Миллер. "strlcpy.c". Перекрестная ссылка BSD .
  112. ^ Тодд К. Миллер. "strlcat.c". Перекрестная ссылка BSD .
  113. ^ Миллер, Дэмиен (октябрь 2005 г.). "Безопасная переносимость" (PDF) . Получено 26 июня 2016 г. Этот API [strlcpy и strlcat] принят большинством современных операционных систем и многими автономными программными пакетами [...]. Заметным исключением является стандартная библиотека GNU C, glibc, чей сопровождающий упорно отказывается включать эти улучшенные API, называя их "ужасно неэффективным дерьмом BSD", несмотря на предыдущие доказательства того, что в большинстве случаев они быстрее, чем API, которые они заменяют.
  114. ^ Список рассылки libc-alpha Архивировано 9 июня 2007 г. на Wayback Machine , избранные сообщения из ветки от 8 августа 2000 г.: 53, 60, 61
  115. ^ Взлеты и падения strlcpy(); LWN.net
  116. ^ "Добавление strlcpy() в glibc". lwn.net . Правильная обработка строк означает, что вы всегда знаете длину своих строк, и поэтому вы можете использовать memcpy (вместо strcpy).
  117. ^ strlcpy(3)  –  Руководство по функциям библиотеки Linux «Однако можно усомниться в обоснованности таких оптимизаций, поскольку они сводят на нет весь смысл strlcpy() и strlcat(). По сути, первая версия этой страницы руководства была неверной».
  118. ^ "libbsd" . Получено 21 ноября 2022 г. .
  119. ^ "root/src/string/strlcpy.c" . Получено 28 января 2017 г. .
  120. ^ "root/src/string/strlcat.c" . Получено 28 января 2017 г. .
  121. ^ strlc{py|at} коммит
  122. ^ https://news.ycombinator.com/item?id=36765747 [ пустой URL ]
  123. ^ "strlcat". Pubs.opengroup.org . Получено 5 сентября 2024 г. .
  124. ^ Ловелл, Мартин. «Отражайте атаки на свой код с помощью безопасных библиотек Visual Studio 2005 C и C++» . Получено 13 февраля 2015 г.
  125. ^ Библиотека Safe C. "Библиотека Safe C предоставляет функции проверки связи памяти и строк в соответствии с ISO/IEC TR24731". Sourceforge . Получено 6 марта 2013 г.
  126. ^ "Проект стандарта C11" (PDF) . §K.3.1.4p2 . Получено 13 февраля 2013 г.{{cite web}}: CS1 maint: местоположение ( ссылка )
  127. ^ "Проект стандарта C11" (PDF) . §K.3.6.1.1p4 . Получено 13 февраля 2013 г.{{cite web}}: CS1 maint: местоположение ( ссылка )
  128. ^ «Проверка параметров». 21 октября 2022 г.
  129. ^ Дэнни Калев. «Они снова взялись за дело». InformIT. Архивировано из оригинала 15 января 2012 года . Получено 10 ноября 2011 года .
  130. ^ "Опыт работы с Приложением K — Интерфейсы проверки границ" . Получено 5 ноября 2015 г.
  131. ^ "MSC06-C. Остерегайтесь оптимизаций компилятора". Стандарт кодирования SEI CERT C.
  132. ^ memset_s(3)  –  Руководство по функциям библиотеки FreeBSD

Внешние ссылки