Из Википедии, бесплатной энциклопедии
  (Перенаправлено из Strcmp )
Перейти к навигации Перейти к поиску

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

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

Определения [ править ]

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

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

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

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

Кодировки символов [ править ]

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

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

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

Обзор функций [ править ]

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

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

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

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

Константы и типы [ править ]

Функции [ править ]

Многобайтовые функции [ править ]

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

Числовые преобразования [ править ]

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

Эти strtoxxxфункции не сопзИте-правильно , так как они принимают constуказатель на строку и возвращают не- constуказателя в строке.

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

Популярные расширения [ править ]

Замены [ править ]

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

Самые популярные [а] замены являются strlcatи strlcpyфункцией, которые появились в OpenBSD 2.4 в декабре 1998 года [91] Эти функции всегда пишут одну NUL в буфер назначения, усечение результата , если это необходимо, и возвращают размер буфера , который будет быть необходимо, что позволяет обнаруживать усечение и обеспечивает размер для создания нового буфера, который не будет усекаться. Их критиковали на основании якобы неэффективности [94], поощрения использования строк C (вместо какой-то более совершенной альтернативной формы строк), [95] [96] и сокрытия других потенциальных ошибок. [97] [98] Следовательно, они не были включены вБиблиотека GNU C (используется программным обеспечением в Linux), хотя они реализованы в библиотеках C для OpenBSD, FreeBSD , NetBSD , Solaris , OS X и QNX , а также в альтернативных библиотеках C для Linux, таких как musl, представленный в 2011 году. . [99] [100] Отсутствие поддержки библиотеки GNU C не помешало различным авторам программного обеспечения использовать ее и комплектовать замену, среди прочего, SDL , GLib , ffmpeg , rsync и даже внутри ядра Linux . Доступны реализации с открытым исходным кодом для этих функций.[101] [102]

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

В рамках своего жизненного цикла разработки системы безопасности 2004 года Microsoft представила семейство «безопасных» функций, включая strcpy_sи strcat_s(наряду со многими другими). [103] Эти функции были стандартизированы с некоторыми незначительными изменениями как часть необязательного C11 (Приложение K), предложенного ISO / IEC WDTR 24731. Эти функции выполняют различные проверки, в том числе, является ли строка слишком длинной для размещения в буфере. Если проверка завершается неудачно, вызывается заданная пользователем функция «обработчик ограничений времени выполнения» [104], которая обычно прерывает выполнение программы. [105] [106] Некоторые функции выполняют деструктивные операции перед вызовом обработчика ограничения времени выполнения; например, strcat_sустанавливает в качестве места назначения пустую строку,[107], что может затруднить восстановление после ошибок или их отладку. Эти функции вызвали значительную критику, поскольку изначально они были реализованы только в Windows, и в то же время Microsoft Visual C ++ начал выдавать предупреждающие сообщения,предлагающие программистам использовать эти функции вместо стандартных. Некоторые предполагают, что это попытка Microsoft заблокировать разработчиков своей платформой. [108] Несмотря на то, что реализации этих функций с открытым исходным кодом доступны, эти функции отсутствуют в общих библиотеках C для Unix. [109]Опыт работы с этими функциями показал значительные проблемы с их внедрением и ошибки в использовании, поэтому предлагается исключить Приложение K в следующей редакции стандарта C. [110] Использование memset_sбыло также предложено как способ избежать нежелательной оптимизации компилятора. [111] [112]

См. Также [ править ]

  • Синтаксис C § Строки  - синтаксис исходного кода, включая escape-последовательности с обратной косой чертой
  • Строковые функции

Заметки [ править ]

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

Ссылки [ править ]

  1. ^ a b c "Проект стандарта C99 + TC3" (PDF) . §7.1.1p1 . Проверено 7 января 2011 года .CS1 maint: location ( ссылка )
  2. ^ "Стандартный проект C99 + TC3" (PDF) . §6.4.5p7 . Проверено 7 января 2011 года . CS1 maint: location ( ссылка )
  3. ^ "Стандартный проект C99 + TC3" (PDF) . Сноска 66 к разделу 6.4.5 . Проверено 7 января 2011 года . CS1 maint: location ( ссылка )
  4. ^ «Основные типы» . en.cppreference.com .
  5. ^ "Стандартный проект C99 + TC3" (PDF) . §5.1.1.2 Фазы перевода, стр. 1 . Проверено 23 декабря 2011 года . CS1 maint: location ( ссылка )
  6. ^ "строковые литералы" . en.cppreference.com . Проверено 23 декабря 2019 .
  7. ^ "stddef.h - стандартные определения типов" . Открытая группа . Проверено 28 января 2017 года .
  8. ^ Гиллам, Ричард (2003). Unicode Demystified: Практическое руководство программиста по стандарту кодирования . Эддисон-Уэсли Профессионал. п. 714. ISBN 9780201700527.
  9. ^ a b "strcpy - cppreference.com" . En.cppreference.com. 2 января 2014 . Проверено 6 марта 2014 .
  10. ^ "wcscpy - cppreference.com" . En.cppreference.com . Проверено 6 марта 2014 .
  11. ^ "strncpy - cppreference.com" . En.cppreference.com. 4 октября 2013 . Проверено 6 марта 2014 .
  12. ^ "wcsncpy - cppreference.com" . En.cppreference.com . Проверено 6 марта 2014 .
  13. ^ a b "strcat - cppreference.com" . En.cppreference.com. 8 октября 2013 . Проверено 6 марта 2014 .
  14. ^ "wcscat - cppreference.com" . En.cppreference.com . Проверено 6 марта 2014 .
  15. ^ "strncat - cppreference.com" . En.cppreference.com. 1 июля 2013 . Проверено 6 марта 2014 .
  16. ^ "wcsncat - cppreference.com" . En.cppreference.com . Проверено 6 марта 2014 .
  17. ^ "strxfrm - cppreference.com" . En.cppreference.com . Проверено 6 марта 2014 .
  18. ^ "wcsxfrm - cppreference.com" . En.cppreference.com . Проверено 6 марта 2014 .
  19. ^ "strlen - cppreference.com" . En.cppreference.com. 27 декабря 2013 . Проверено 6 марта 2014 .
  20. ^ "wcslen - cppreference.com" . En.cppreference.com . Проверено 6 марта 2014 .
  21. ^ "strcmp - cppreference.com" . En.cppreference.com . Проверено 6 марта 2014 .
  22. ^ "wcscmp - cppreference.com" . En.cppreference.com . Проверено 6 марта 2014 .
  23. ^ "strncmp - cppreference.com" . En.cppreference.com . Проверено 6 марта 2014 .
  24. ^ "wcsncmp - cppreference.com" . En.cppreference.com . Проверено 6 марта 2014 .
  25. ^ "strcoll - cppreference.com" . En.cppreference.com . Проверено 6 марта 2014 .
  26. ^ "wcscoll - cppreference.com" . En.cppreference.com . Проверено 6 марта 2014 .
  27. ^ "strchr - cppreference.com" . En.cppreference.com. 23 февраля 2014 . Проверено 6 марта 2014 .
  28. ^ "wcschr - cppreference.com" . En.cppreference.com . Проверено 6 марта 2014 .
  29. ^ "strrchr - cppreference.com" . En.cppreference.com . Проверено 6 марта 2014 .
  30. ^ "wcsrchr - cppreference.com" . En.cppreference.com . Проверено 6 марта 2014 .
  31. ^ "strspn - cppreference.com" . En.cppreference.com . Проверено 6 марта 2014 .
  32. ^ "wcsspn - cppreference.com" . En.cppreference.com . Проверено 6 марта 2014 .
  33. ^ "strcspn - cppreference.com" . En.cppreference.com. 31 мая 2013 . Проверено 6 марта 2014 .
  34. ^ "wcscspn - cppreference.com" . En.cppreference.com . Проверено 6 марта 2014 .
  35. ^ "strpbrk - cppreference.com" . En.cppreference.com. 31 мая 2013 . Проверено 6 марта 2014 .
  36. ^ "wcspbrk - cppreference.com" . En.cppreference.com . Проверено 6 марта 2014 .
  37. ^ "strstr - cppreference.com" . En.cppreference.com. 16 октября 2013 . Проверено 6 марта 2014 .
  38. ^ "wcsstr - cppreference.com" . En.cppreference.com . Проверено 6 марта 2014 .
  39. ^ "strtok - cppreference.com" . En.cppreference.com. 3 сентября 2013 . Проверено 6 марта 2014 .
  40. ^ "wcstok - cppreference.com" . En.cppreference.com . Проверено 6 марта 2014 .
  41. ^ "strerror - cppreference.com" . En.cppreference.com. 31 мая 2013 . Проверено 6 марта 2014 .
  42. ^ "memset - cppreference.com" . En.cppreference.com . Проверено 6 марта 2014 .
  43. ^ "wmemset - cppreference.com" . En.cppreference.com . Проверено 6 марта 2014 .
  44. ^ a b "memcpy - cppreference.com" . En.cppreference.com . Проверено 6 марта 2014 .
  45. ^ "wmemcpy - cppreference.com" . En.cppreference.com . Проверено 6 марта 2014 .
  46. ^ a b "memmove - cppreference.com" . En.cppreference.com. 25 января 2014 . Проверено 6 марта 2014 .
  47. ^ "wmemmove - cppreference.com" . En.cppreference.com . Проверено 6 марта 2014 .
  48. ^ "memcmp - cppreference.com" . En.cppreference.com . Проверено 6 марта 2014 .
  49. ^ "wmemcmp - cppreference.com" . En.cppreference.com . Проверено 6 марта 2014 .
  50. ^ "memchr - cppreference.com" . En.cppreference.com . Проверено 6 марта 2014 .
  51. ^ "wmemchr - cppreference.com" . En.cppreference.com . Проверено 6 марта 2014 .
  52. ^ "mblen - cppreference.com" . En.cppreference.com . Проверено 6 марта 2014 .
  53. ^ "mbtowc - cppreference.com" . En.cppreference.com . Проверено 6 марта 2014 .
  54. ^ "wctomb - cppreference.com" . En.cppreference.com. 4 февраля 2014 . Проверено 6 марта 2014 .
  55. ^ "mbstowcs - cppreference.com" . En.cppreference.com . Проверено 6 марта 2014 .
  56. ^ "wcstombs - cppreference.com" . En.cppreference.com . Проверено 6 марта 2014 .
  57. ^ "btowc - cppreference.com" . En.cppreference.com . Проверено 6 марта 2014 .
  58. ^ "wctob - cppreference.com" . En.cppreference.com . Проверено 6 марта 2014 .
  59. ^ "mbsinit - cppreference.com" . En.cppreference.com . Проверено 6 марта 2014 .
  60. ^ "mbrlen - cppreference.com" . En.cppreference.com . Проверено 6 марта 2014 .
  61. ^ "mbrtowc - cppreference.com" . En.cppreference.com . Проверено 6 марта 2014 .
  62. ^ "wcrtomb - cppreference.com" . En.cppreference.com . Проверено 6 марта 2014 .
  63. ^ "mbsrtowcs - cppreference.com" . En.cppreference.com . Проверено 6 марта 2014 .
  64. ^ "wcsrtombs - cppreference.com" . En.cppreference.com . Проверено 6 марта 2014 .
  65. ^ «6.3.2 Отображение состояния преобразования» . GNU C Library . Проверено 31 января 2017 года .
  66. ^ "корень / src / multibyte / c16rtomb.c" . Проверено 31 января 2017 года .
  67. ^ «Содержимое /stable/11/lib/libc/locale/c16rtomb.c» . Проверено 31 января 2017 года .
  68. ^ "atof - cppreference.com" . En.cppreference.com. 31 мая 2013 . Проверено 6 марта 2014 .
  69. ^ "атой, атол, атолл - cppreference.com" . En.cppreference.com. 18 января 2014 . Проверено 6 марта 2014 .
  70. ^ "strtof, strtod, strtold - cppreference.com" . En.cppreference.com. 4 февраля 2014 . Проверено 6 марта 2014 .
  71. ^ "strtof, strtod, strtold - cppreference.com" . En.cppreference.com. 4 февраля 2014 . Проверено 6 марта 2014 .
  72. ^ "strtof, strtod, strtold - cppreference.com" . En.cppreference.com. 4 февраля 2014 . Проверено 6 марта 2014 .
  73. ^ "wcstof, wcstod, wcstold - cppreference.com" . En.cppreference.com . Проверено 6 марта 2014 .
  74. ^ "wcstof, wcstod, wcstold - cppreference.com" . En.cppreference.com . Проверено 6 марта 2014 .
  75. ^ "wcstof, wcstod, wcstold - cppreference.com" . En.cppreference.com . Проверено 6 марта 2014 .
  76. ^ "strtol, strtoll - cppreference.com" . En.cppreference.com. 4 февраля 2014 . Проверено 6 марта 2014 .
  77. ^ "wcstol, wcstoll - cppreference.com" . En.cppreference.com . Проверено 6 марта 2014 .
  78. ^ "strtoul, strtoull - cppreference.com" . En.cppreference.com. 4 февраля 2014 . Проверено 6 марта 2014 .
  79. ^ "wcstoul, wcstoull - cppreference.com" . En.cppreference.com . Проверено 6 марта 2014 .
  80. ^ C99 Обоснование, 7.20.1.1
  81. ^ "бзеро" . Открытая группа . Проверено 27 ноября 2017 года .
  82. ^ "bzero (3)" . OpenBSD . Проверено 27 ноября 2017 года .
  83. ^ "memccpy" . Pubs.opengroup.org . Проверено 6 марта 2014 .
  84. ^ «mempcpy (3) - справочная страница Linux» . Kernel.org . Проверено 6 марта 2014 .
  85. ^ "strcasecmp (3) - страница руководства Linux" . Kernel.org . Проверено 6 марта 2014 .
  86. ^ a b "strcat_s, wcscat_s, _mbscat_s" . Msdn.microsoft.com . Проверено 6 марта 2014 .
  87. ^ "strdup" . Pubs.opengroup.org . Проверено 6 марта 2014 .
  88. ^ "strerror (3) - страница руководства Linux" . man7.org . Дата обращения 3 ноября 2019 .
  89. ^ "Строка | stricmp ()" . Программирование на C Expert.com . Проверено 6 марта 2014 .
  90. ^ a b "strlcpy, strlcat - копирование и объединение строк с ограниченным размером" . OpenBSD . Проверено 26 мая 2016 .
  91. ^ a b c d Тодд С. Миллер; Тео де Раадт (1999). «strlcpy и strlcat - согласованное, безопасное, строковое копирование и конкатенация» . USENIX '99.
  92. ^ "Стрсигнал" . Pubs.opengroup.org . Проверено 6 марта 2014 .
  93. ^ "стрток" . Pubs.opengroup.org . Проверено 6 марта 2014 .
  94. Миллер, Дэмиен (октябрь 2005 г.). «Безопасная переносимость» (PDF) . Проверено 26 июня +2016 . Этот API [strlcpy и strlcat] принят в большинстве современных операционных систем и во многих [...] автономных программных пакетах. Заметным исключением является стандартная библиотека C GNU, glibc, сопровождающая которой категорически отказывается включать эти улучшенные API, называя их «ужасно неэффективной чушью BSD», несмотря на предыдущие доказательства того, что они в большинстве случаев быстрее, чем API, которые они заменяют.
  95. Список рассылки ^ libc-alpha , избранные сообщения из ветки 8 августа 2000: 53 , 60 , 61
  96. ^ Взлеты и падения strlcpy (); LWN.net
  97. ^ "Добавление strlcpy () в glibc" . lwn.net . Правильная обработка строк означает, что вы всегда знаете, какова длина ваших строк, и поэтому вы можете использовать memcpy (вместо strcpy).
  98. ^ strlcpy(3)  -  Руководство по функциям библиотеки Linux "Однако можно сомневаться в правильности таких оптимизаций, поскольку они сводят на нет всю цель strlcpy () и strlcat (). Фактически, первая версия этой справочной страницы ошибалась. "
  99. ^ "корень / SRC / строка / strlcpy.c" . Проверено 28 января 2017 года .
  100. ^ "корень / SRC / строка / strlcat.c" . Проверено 28 января 2017 года .
  101. ^ Тодд С. Миллер. "strlcpy.c" . Перекрестная ссылка BSD .
  102. ^ Тодд С. Миллер. "strlcat.c" . Перекрестная ссылка BSD .
  103. ^ Ловелл, Мартин. «Отразите атаки на ваш код с помощью безопасных библиотек C и C ++ Visual Studio 2005» . Проверено 13 февраля 2015 года .
  104. ^ "Стандартный проект C11" (PDF) . §K.3.1.4p2 . Проверено 13 февраля 2013 года . CS1 maint: location ( ссылка )
  105. ^ "Стандартный проект C11" (PDF) . §K.3.6.1.1p4 . Проверено 13 февраля 2013 года . CS1 maint: location ( ссылка )
  106. ^ «Проверка параметров» .
  107. ^ "Стандартный проект C11" (PDF) . §K.3.7.2.1p4 . Проверено 13 февраля 2013 года . CS1 maint: location ( ссылка )
  108. ^ Дэнни Калев. «Они снова за это» . InformIT. Архивировано из оригинального 15 января 2012 года . Проверено 10 ноября 2011 года .
  109. ^ Безопасная библиотека C. «Библиотека Safe C обеспечивает память для проверки границ и строковые функции в соответствии с ISO / IEC TR24731» . Sourceforge . Проверено 6 марта 2013 года .
  110. ^ «Практический опыт работы с Приложением K - Интерфейсы для проверки границ» . Дата обращения 5 ноября 2015 .
  111. ^ «MSC06-C. Остерегайтесь оптимизации компилятора» . ДИР СЕРТ C Стандарт кодирования .
  112. ^ memset_s(3)  -  Руководство по функциям библиотеки FreeBSD

Внешние ссылки [ править ]

  • Быстрый memcpy на C , несколько примеров кодирования C для разных типов архитектур команд ЦП