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.3.8 код был зафиксирован [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] Отсутствие поддержки библиотеки GNU C имело Это не помешало различным авторам программного обеспечения использовать его и включать замену, среди прочего, в 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.

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