stringtranslate.com

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

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

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

Определения

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

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

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

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

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

Каждая строка заканчивается при первом появлении нулевой кодовой единицы соответствующего типа ( charили wchar_t). Следовательно, строка байтов ( char*) может содержать символы, отличные от NUL, в ASCII или любом расширении ASCII , но не может содержать символы в таких кодировках, как UTF-16 (даже если 16-битная кодовая единица может быть ненулевой, ее старший или младший байт может быть нуль). Кодировки, которые можно хранить в широких строках, определяются шириной wchar_t. В большинстве реализаций wchar_tэто не менее 16 бит, поэтому можно хранить все 16-битные кодировки, такие как UCS-2 . Если 32-бит, то можно хранить wchar_t32-битные кодировки, например 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, что приводит к тому, что многие [ who? ] полагать, что эти функции как-то не работают для UTF-8 . Фактически, все длины определяются как байты, и это верно для всех реализаций, и эти функции работают как с UTF-8, так и с однобайтовыми кодировками. Документация BSD была исправлена, чтобы прояснить это, но документация POSIX, Linux и Windows по-прежнему использует «символ» во многих местах, где правильным термином является «байт» или «wchar_t».

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

Заголовки

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

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

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

Функции

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

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

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

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

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

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

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

Замены

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

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

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

В рамках своего жизненного цикла разработки безопасности в 2004 году Microsoft представила семейство «безопасных» функций, включая strcpy_sи strcat_s(наряду со многими другими). [123] Эти функции были стандартизированы с некоторыми незначительными изменениями как часть дополнительного C11 (Приложение K), предложенного стандартом ISO/IEC WDTR 24731. Эти функции выполняют различные проверки, включая проверку того, не является ли строка слишком длинной для размещения в буфере. Если проверки не пройдены, вызывается определяемая пользователем функция «обработчик ограничений времени выполнения», [124] которая обычно прерывает выполнение программы. [125] [126] Некоторые функции выполняют разрушительные операции перед вызовом обработчика ограничений времени выполнения; например, strcat_sустанавливает в качестве места назначения пустую строку, [127] что может затруднить восстановление после ошибок или их отладку. Эти функции вызвали серьезную критику, поскольку изначально они были реализованы только в Windows, и в то же время Microsoft Visual C++ начал выдавать предупреждающие сообщения, предлагающие использовать эти функции вместо стандартных. Некоторые полагают, что это попытка Microsoft привязать разработчиков к своей платформе. [128] Хотя реализации этих функций с открытым исходным кодом доступны, эти функции не присутствуют в обычных библиотеках C для Unix. [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. ^ «Фундаментальные типы». ru.cppreference.com .
  6. ^ «Черновик стандарта C99 + TC3» (PDF) . §5.1.1.2 Фазы трансляции , п1 . Проверено 23 декабря 2011 г.{{cite web}}: CS1 maint: местоположение ( ссылка )
  7. ^ «строковые литералы». ru.cppreference.com . Проверено 23 декабря 2019 г.
  8. ^ «С++ — Каково использование wchar_t в общем программировании?». Переполнение стека . Проверено 1 августа 2022 г.
  9. ^ «stddef.h — определения стандартных типов». Открытая группа . Проверено 28 января 2017 г.
  10. ^ Гиллам, Ричард (2003). Демистификация Unicode: Практическое руководство программиста по стандарту кодирования. Аддисон-Уэсли Профессионал. п. 714. ИСБН 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" . En.cppreference.com.
  76. ^ "mbrtoc16 - cppreference.com" . En.cppreference.com.
  77. ^ "c16rtomb - cppreference.com" . En.cppreference.com.
  78. ^ "mbrtoc32 - cppreference.com" . En.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. ^ "Бзеро". Открытая группа . Проверено 27 ноября 2017 г.
  98. ^ "bzero(3)". OpenBSD . Проверено 27 ноября 2017 г.
  99. Ссылки ​Pubs.opengroup.org . Проверено 6 марта 2014 г.
  100. ^ «mempcpy(3) — страница руководства Linux» . Кернел.орг . Проверено 6 марта 2014 г.
  101. ^ «strcasecmp(3) — страница руководства Linux» . Кернел.орг . Проверено 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. Ссылки ​Pubs.opengroup.org . Проверено 6 марта 2014 г.
  105. ^ «strerror(3) — страница руководства Linux» . man7.org . Проверено 3 ноября 2019 г.
  106. ^ "Строка | stricmp()". Programming Expert.com . Проверено 6 марта 2014 г.
  107. ^ ab "strlcpy, strlcat — копирование и объединение строк с ограничением по размеру". OpenBSD . Проверено 26 мая 2016 г.
  108. ^ abcd Тодд С. Миллер; Тео де Раадт (1999). «strlcpy и strlcat — согласованное, безопасное копирование и конкатенация строк». УСЕНИКС '99.
  109. Ссылки ​Pubs.opengroup.org . Проверено 6 марта 2014 г.
  110. Ссылки ​Pubs.opengroup.org . Проверено 6 марта 2014 г.
  111. ^ Миллер, Дэмиен (октябрь 2005 г.). «Безопасная переносимость» (PDF) . Проверено 26 июня 2016 г. Этот API [strlcpy и strlcat] принят большинством современных операционных систем и многими автономными программными пакетами [...]. Заметным исключением является стандартная библиотека C GNU, glibc, чей сопровождающий упорно отказывается включать эти улучшенные API, называя их «ужасно неэффективной чушью BSD», несмотря на предварительные доказательства того, что в большинстве случаев они быстрее, чем API, которые они заменяют.
  112. ^ Список рассылки libc-alpha. Архивировано 9 июня 2007 г. на Wayback Machine , избранные сообщения из ветки от 8 августа 2000 г.: 53, 60, 61.
  113. ^ Взлёты и падения strlcpy(); LWN.net
  114. ^ «Добавление strlcpy() в glibc». lwn.net . Правильная обработка строк означает, что вы всегда знаете длину ваших строк и, следовательно, можете использовать memcpy (вместо strcpy).
  115. ^ strlcpy(3)  -  Руководство по библиотечным функциям Linux «Однако можно усомниться в обоснованности такой оптимизации, поскольку она противоречит всей цели strlcpy() и strlcat(). На самом деле, первая версия этой страницы руководства содержала ошибки. "
  116. ^ strlc{py|at} совершить коммит
  117. ^ [1]
  118. Ссылки ​Проверено 21 ноября 2022 г.
  119. ^ "root/src/string/strlcpy.c" . Проверено 28 января 2017 г.
  120. ^ "root/src/string/strlcat.c" . Проверено 28 января 2017 г.
  121. ^ Тодд С. Миллер. "strlcpy.c". Перекрестная ссылка BSD .
  122. ^ Тодд С. Миллер. "strlcat.c". Перекрестная ссылка BSD .
  123. ^ Ловелл, Мартин. «Отражение атак на ваш код с помощью безопасных библиотек Visual Studio 2005 C и C++» . Проверено 13 февраля 2015 г.
  124. ^ «Черновик стандарта C11» (PDF) . §К.3.1.4п2 . Проверено 13 февраля 2013 г.{{cite web}}: CS1 maint: местоположение ( ссылка )
  125. ^ «Черновик стандарта C11» (PDF) . §К.3.6.1.1п4 . Проверено 13 февраля 2013 г.{{cite web}}: CS1 maint: местоположение ( ссылка )
  126. ^ «Проверка параметров».
  127. ^ «Черновик стандарта C11» (PDF) . §К.3.7.2.1п4 . Проверено 13 февраля 2013 г.{{cite web}}: CS1 maint: местоположение ( ссылка )
  128. ^ Дэнни Калев. «Они снова в деле». ИнформИТ. Архивировано из оригинала 15 января 2012 года . Проверено 10 ноября 2011 г.
  129. ^ Безопасная библиотека C. «Библиотека Safe C обеспечивает связанную проверку памяти и строковые функции в соответствии с ISO/IEC TR24731». Сорсфордж . Проверено 6 марта 2013 г.
  130. ^ «Опыт работы с Приложением K — Интерфейсы проверки границ» . Проверено 5 ноября 2015 г.
  131. ^ «MSC06-C. Остерегайтесь оптимизации компилятора» . SEI CERT Стандарт кодирования C.
  132. ^ memset_s(3)  -  Руководство по функциям библиотеки FreeBSD.

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