Стандартная библиотека C или Libc является стандартной библиотекой для языка программирования C , как указана в ISO C стандарте. [1] Начиная с исходного стандарта ANSI C , он был разработан одновременно со спецификацией POSIX библиотеки C , которая является его надмножеством. [2] [3] Так как ANSI C был принят Международной организацией по стандартизации , [4] С стандартная библиотека также называется библиотека ISO C .
Стандартная библиотека C предоставляет макросы , определения типов и функции для таких задач, как обработка строк , математические вычисления, обработка ввода / вывода, управление памятью и некоторые другие службы операционной системы .
Интерфейс прикладного программирования
Заголовочные файлы
Интерфейс прикладного программирования (API) стандартной библиотеки C объявлен в ряде файлов заголовков . Каждый файл заголовка содержит одно или несколько объявлений функций, определений типов данных и макросов.
После длительного периода стабильности, три новых файлы заголовки ( iso646.h
, wchar.h
и wctype.h
) были добавлены с Нормативным Добавлением 1 (NA1), в дополнении к C стандарту ратифицированного в 1995 году еще шесть заголовков файлы ( complex.h
, fenv.h
, inttypes.h
, stdbool.h
, stdint.h
, и tgmath.h
) были добавлены с C99 , пересмотром в C стандарт , опубликованный в 1999 году, и более пяти файлов ( stdalign.h
, stdatomic.h
, stdnoreturn.h
, threads.h
, и uchar.h
) с С11 в 2011 г. в общей сложности, в настоящее время существует 29 файлов заголовки:
Имя | Из | Описание |
---|---|---|
| Содержит макрос assert , используемый для помощи в обнаружении логических ошибок и других типов ошибок при отладке версий программы. | |
| C99 | Набор функций для работы с комплексными числами . |
| Определяет набор функций, используемых для классификации символов по их типам или для преобразования между верхним и нижним регистром способом, который не зависит от используемого набора символов (обычно ASCII или одно из его расширений, хотя также известны реализации, использующие EBCDIC ). | |
| Для тестирования кодов ошибок, сообщаемых библиотечными функциями. | |
| C99 | Определяет набор функций для управления средой с плавающей запятой . |
| Определяет макроконстанты, определяющие зависящие от реализации свойства библиотеки с плавающей запятой . | |
| C99 | Определяет целочисленные типы точной ширины . |
| NA1 | Определяет несколько макросов , реализующих альтернативные способы выражения нескольких стандартных токенов. Для программирования в наборах символов варианта ISO 646 . |
| Определяет макроконстанты, определяющие зависящие от реализации свойства целочисленных типов. | |
| Определяет функции локализации . | |
| Определяет общие математические функции . | |
| Объявляет макросы setjmp и longjmp , которые используются для нелокальных выходов. | |
| Определяет функции обработки сигналов . | |
| C11 | Для запроса и указания выравнивания объектов. |
| Для доступа к разному количеству аргументов, передаваемых функциям. | |
| C11 | Для атомарных операций с данными, совместно используемыми потоками. |
| C99 | Определяет логический тип данных . |
| Определяет несколько полезных типов и макросов . | |
| C99 | Определяет целочисленные типы точной ширины . |
| Определяет основные функции ввода и вывода | |
| Определяет функции числового преобразования , функции числа генерации псевдослучайных , распределение памяти , функции управления процессом | |
| C11 | Для указания невозвратных функций |
| Определяет функции обработки строк | |
| C99 | Определяет универсальные математические функции типа . |
| C11 | Определяет функции для управления несколькими потоками , мьютексами и условными переменными |
| Определяет функции обработки даты и времени | |
| C11 | Типы и функции для манипулирования Unicode символов |
| NA1 | Определяет функции обработки широких строк |
| NA1 | Определяет набор функций, используемых для классификации широких символов по их типам или для преобразования между верхним и нижним регистром. |
Три файла заголовков ( complex.h
, stdatomic.h
и threads.h
) являются условными функциями, поддержка которых не требуется.
Стандарт POSIX добавил несколько нестандартных заголовков C для специфичных для Unix функций. Многие нашли свой путь к другим архитектурам. Примеры включают unistd.h
и signal.h
. Ряд других групп используют другие нестандартные заголовки - это есть в библиотеке GNU Calloca.h
, а в HP OpenVMS есть va_count()
функция.
Документация
В Unix-подобных системах авторитетная документация фактически реализованного API предоставляется в виде страниц руководства . В большинстве систем справочные страницы стандартных библиотечных функций находятся в разделе 3; Раздел 7 может содержать несколько общих страниц, посвященных базовым концепциям (например, man 7 math_error
в Linux ).
Реализации
Unix-подобные системы обычно имеют библиотеку C в форме общей библиотеки , но файлы заголовков (и набор инструментов компилятора) могут отсутствовать при установке, поэтому разработка на C может быть невозможна. Библиотека C считается частью операционной системы в Unix-подобных системах. Функции C, включая стандартные функции ISO C, широко используются программами и считаются не только реализацией чего-то на языке C, но и де-факто частью интерфейса операционной системы. Unix-подобные операционные системы обычно не могут работать, если библиотека C. Это верно для приложений, которые связаны динамически, а не статически. Кроме того, само ядро (по крайней мере, в случае Linux) работает независимо от каких-либо библиотек.
В Microsoft Windows основные системные динамические библиотеки ( DLL ) обеспечивают реализацию стандартной библиотеки C для компилятора Microsoft Visual C ++ v6.0; стандартная библиотека C для новых версий компилятора Microsoft Visual C ++ предоставляется каждым компилятором индивидуально, а также распространяемыми пакетами. Скомпилированные приложения, написанные на C, либо статически связаны с библиотекой C, либо связаны с динамической версией библиотеки, которая поставляется с этими приложениями, вместо того, чтобы полагаться на присутствие в целевых системах. Функции библиотеки C компилятора не рассматриваются как интерфейсы для Microsoft Windows.
Существует множество других реализаций, поставляемых как с различными операционными системами, так и с компиляторами C. Вот некоторые из популярных реализаций:
- BSD Libc , различные реализации распределенных с BSD -derived операционные системы
- Библиотека GNU C (glibc), используемая в GNU Hurd , GNU / kFreeBSD и Linux
- Библиотека времени выполнения Microsoft C , часть Microsoft Visual C ++
- dielibc , альтернативная небольшая реализация стандартной библиотеки C (без MMU)
- μClibc , стандартная библиотека C для встроенных систем μClinux (без MMU)
- uclibc-ng , встроенная библиотека C, форк μClibc, все еще поддерживается, с поддержкой блока управления памятью (MMU)
- Newlib , стандартная библиотека C для встраиваемых систем (без MMU) [5], используемая в дистрибутиве Cygwin GNU для Windows.
- klibc , в первую очередь для загрузки систем Linux
- musl , еще одна облегченная реализация стандартной библиотеки C для систем Linux [6]
- Bionic , первоначально разработанный Google для операционной системы встраиваемой системы Android, производный от BSD libc.
Встроенные функции компилятора
Некоторые компиляторы (например, GCC [7] ) предоставляют встроенные версии многих функций стандартной библиотеки C; то есть реализации функций записываются в скомпилированный объектный файл , и программа вызывает встроенные версии вместо функций из общего объектного файла библиотеки C. Это снижает накладные расходы на вызов функций, особенно если вызовы функций заменяются встроенными вариантами, и позволяет использовать другие формы оптимизации (поскольку компилятор знает характеристики потока управления встроенных вариантов), но может вызвать путаницу при отладке (например, , встроенные версии нельзя заменить инструментальными вариантами).
Однако встроенные функции должны вести себя как обычные функции в соответствии с ISO C. Основное значение состоит в том, что программа должна иметь возможность создавать указатель на эти функции, принимая их адрес, и вызывать функцию с помощью этого указателя. Если два указателя на одну и ту же функцию получены в двух разных единицах трансляции в программе, эти два указателя должны сравниваться одинаково; то есть адрес приходит путем разрешения имени функции, которая имеет внешнюю (программную) связь.
Связывание, libm
В FreeBSD [8] и glibc, [9] некоторые функции, такие как sin (), не связаны по умолчанию и вместо этого включены в математическую библиотеку libm . Если какой-либо из них используется, компоновщику должна быть предоставлена директива -lm
. POSIX требует, чтобы компилятор c99 поддерживал -lm
и чтобы функции, объявленные в заголовках math.h
, complex.h
и fenv.h
были доступны для связывания, если -lm
указано, но не указывает, связаны ли функции по умолчанию. [10] musl удовлетворяет этому требованию, помещая все в одну библиотеку libc и предоставляя пустую библиотеку libm. [11]
Обнаружение
Согласно стандарту C макрос __STDC_HOSTED__
должен иметь значение 1, если реализация размещена. Размещенная реализация имеет все заголовки, указанные в стандарте C. Реализация также может быть автономной, что означает, что эти заголовки не будут присутствовать. Если реализация отдельно стоящая , она должна определить __STDC_HOSTED__
до 0 .
Концепции, проблемы и обходные пути
Уязвимости переполнения буфера
Некоторые функции в стандартной библиотеке C были печально известны уязвимостью переполнения буфера и в целом поощряли ошибочное программирование с момента их принятия. [a] Наиболее критикуемыми объектами являются:
- подпрограммы обработки строк , включая
strcpy()
иstrcat()
, из-за отсутствия проверки границ и возможных переполнений буфера, если границы не проверяются вручную; - строковые подпрограммы в целом, для побочных эффектов , поощряющие безответственное использование буфера, не всегда гарантирующие корректный вывод с завершающим нулем , вычисление линейной длины; [b]
printf()
семейство подпрограмм для испорчения стека выполнения, когда строка формата не соответствует заданным аргументам. Этот фундаментальный недостаток создал целый класс атак: атаки на строку формата ;gets()
иscanf()
семейство подпрограмм ввода-вывода из-за отсутствия (любой или простой) проверки длины ввода.
За исключением крайнего случая gets()
, всех уязвимостей безопасности можно избежать, введя вспомогательный код для управления памятью, проверки границ, проверки ввода и т. Д. Это часто делается в форме оболочек, которые делают стандартные библиотечные функции более безопасными и простыми в использовании. Это восходит к книге Б. Кернигана и Р. Пайка «Практика программирования», авторы которой обычно используют оболочки, которые выводят сообщения об ошибках и закрывают программу в случае возникновения ошибки.
Комитет ISO C опубликовал технические отчеты TR 24731-1 [12] и работает над TR 24731-2 [13], чтобы предложить принятие некоторых функций с проверкой границ и автоматическим распределением буфера, соответственно. Первый был встречен резкой критикой и некоторой похвалой [14] [15], второй получил неоднозначную реакцию. Несмотря на это, TR 24731-1 был реализован в стандартной библиотеке Microsoft C, и ее компилятор выдает предупреждения при использовании старых «небезопасных» функций.
Проблемы с потоками, уязвимость к условиям гонки
strerror()
Рутина критикуют за то , что поток небезопасным и иначе уязвимы для условий гонки .
Обработка ошибок
Обработка ошибок функций в стандартной библиотеке C непоследовательна и иногда сбивает с толку. Согласно странице руководства Linux math_error
: «Текущая (версия 2.8) ситуация с glibc запутана. Большинство (но не все) функций вызывают исключения при ошибках. Некоторые также устанавливают errno . Некоторые функции устанавливают errno , но не вызывают исключения. . Очень немногие функции не делают ни того, ни другого. " [16]
Стандартизация
Исходный язык C не предоставлял встроенных функций, таких как операции ввода-вывода, в отличие от традиционных языков, таких как COBOL и Fortran . [ необходима цитата ] Со временем сообщества пользователей C делились идеями и реализациями того, что сейчас называется стандартными библиотеками C. Многие из этих идей со временем были включены в определение стандартизованного языка C.
И Unix, и C были созданы в Bell Laboratories AT&T в конце 1960-х - начале 1970-х годов. В течение 1970-х годов язык Си становился все более популярным. Многие университеты и организации начали создавать свои собственные варианты языка для своих собственных проектов. К началу 80-х годов прошлого века проблемы совместимости между различными реализациями языка Си стали очевидны. В 1983 году Американский национальный институт стандартов (ANSI) сформировал комитет, чтобы установить стандартную спецификацию языка C, известную как « ANSI C ». Эта работа завершилась созданием так называемого стандарта C89 в 1989 году. Частью полученного стандарта стал набор программных библиотек, названный стандартной библиотекой ANSI C.
Стандартная библиотека POSIX
POSIX , а также SUS , определяют ряд подпрограмм, которые должны быть доступны помимо подпрограмм в базовой стандартной библиотеке C. Спецификация POSIX включает файлы заголовков, среди прочего, для многопоточности , работы в сети и регулярных выражений . Они часто реализуются вместе с функциональными возможностями стандартной библиотеки C с разной степенью близости. Например, в glibc реализованы такие функции, как fork
внутри libc.so
, но до того, как NPTL был объединен с glibc, он составлял отдельную библиотеку со своим собственным аргументом флага компоновщика. Часто эта функциональность, указанная в POSIX, рассматривается как часть библиотеки; базовая библиотека C может быть идентифицирована как библиотека C ANSI или ISO .
BSD libc
BSD libc - это расширенный набор стандартной библиотеки POSIX, поддерживаемой библиотеками C, включенными в операционные системы BSD, такие как FreeBSD , NetBSD , OpenBSD и macOS . BSD libc имеет некоторые расширения, которые не определены в исходном стандарте, многие из которых впервые появились в выпуске 4.4BSD 1994 года (первое, которое в значительной степени было разработано после того, как первый стандарт был выпущен в 1989 году). Некоторые из расширений BSD libc:
sys/tree.h
- содержит реализацию красно-черного дерева и расширенного дерева [17] [18]sys/queue.h
- реализации связанного списка , очередей , хвостовой очереди и т. Д. [19] [20]fgetln()
- определено вstdio.h
. Это можно использовать для чтения файла построчно. [21] [22] [23]fts.h
- содержит некоторые функции для обхода файловой иерархии [24] [25]db.h
- некоторые функции для подключения к Berkeley DB [26] [27]strlcat()
иstrlcpy()
- безопасные альтернативы дляstrncat()
иstrncpy()
[28] [29] [30] [31] [32]err.h
- содержит некоторые функции для печати форматированных сообщений об ошибках [33] [34]vis.h
- содержитvis()
функцию. Эта функция используется для отображения непечатаемых символов в визуальном формате. [35] [36] [37]
Стандартная библиотека C на других языках
Некоторые языки включают функциональные возможности стандартной библиотеки C в свои собственные библиотеки. Библиотека может быть адаптирована для лучшего соответствия структуре языка, но операционная семантика остается аналогичной. В C ++ язык, например, включает в себя функциональность стандартной библиотеки C в пространстве имен std
(например, std::printf
, std::atoi
, std::feof
), в заголовочных файлах с похожими именами тех , С ( cstdio
, cmath
, cstdlib
и т.д.). Другие языки, использующие аналогичные подходы, - это D , Perl , Ruby и основная реализация Python, известная как CPython . В Python 2, например, встроенные файловые объекты определены как «реализованные с использованием stdio
пакета C » [38], поэтому ожидается, что доступные операции (открытие, чтение, запись и т. Д.) Будут иметь такое же поведение, как и соответствующие функции C. У Rust есть ящик под названием libc, которая позволяет использовать несколько функций C, структур и других определений типов. [39]
Сравнение со стандартными библиотеками других языков
Стандартная библиотека C мала по сравнению со стандартными библиотеками некоторых других языков. Библиотека C предоставляет базовый набор математических функций, операций со строками, преобразования типов, а также файлового и консольного ввода-вывода. Он не включает стандартный набор « типов контейнеров », таких как Стандартная библиотека шаблонов C ++ , не говоря уже о полных наборах инструментов графического пользовательского интерфейса (GUI), сетевых инструментах и множестве других функций, которые Java и .NET Framework предоставляют в качестве стандартных. Основное преимущество небольшой стандартной библиотеки заключается в том, что создание рабочей среды ISO C намного проще, чем с другими языками, и, следовательно, перенос C на новую платформу сравнительно прост.
Смотрите также
- Стандартная библиотека C ++
Заметки
- ^ Червь Морриса , использующий хорошо известную уязвимость в
gets()
, был создан еще в 1988 году. - ^ в стандартной библиотеке C вычисление длины строки и поиск конца строки имеют линейную сложность по времени и неэффективны при многократном использовании в одной и той же или связанных строках.
Рекомендации
- ^ ISO / IEC (2018). ISO / IEC 9899: 2018 (E): Языки программирования - C §7
- ^ «Библиотека GNU C - Введение» . gnu.org . Проверено 5 декабря 2013 .
- ^ «Разница между стандартной библиотекой C и библиотекой C POSIX» . stackoverflow.com . 2012 . Проверено 4 марта 2015 .
- ^ «Стандарты карт» . Кейл . Проверено 24 ноября 2011 года .
- ^ "Re: Поддерживает ли Newlib процессоры без MMU?" . Cygwin.com. 23 марта 2006 Архивировано из оригинала 22 ноября 2008 года . Проверено 28 октября 2011 года .
- ^ "мусл-библиотека" . Etalabs.net . Проверено 28 октября 2011 года .
- ^ Другие встроенные функции, предоставляемые GCC , GCC Manual
- ^ "Компиляция с cc" . Проверено 2 марта 2013 .
- ^ Веймер, Флориан. "c - Для каких функций предназначена libm?" . Переполнение стека . Проверено 24 февраля 2021 года .
- ^ "c99 - компилировать стандартные программы на C" . Открытая группа Базовые характеристики Выпуск 7, 2018 издание . Открытая группа . Проверено 24 февраля 2021 года .
- ^ "мусл FAQ" . www.musl-libc.org . Проверено 24 февраля 2021 года .
- ^ «ISO / IEC TR 24731-1: Расширения библиотеки C, Часть I: Интерфейсы проверки границ» (PDF) . open-std.org. 2007-03-28 . Проверено 13 марта 2014 .
- ^ «ISO / IEC WDTR 24731-2: Расширения библиотеки C, Часть II: Функции динамического размещения» (PDF) . open-std.org. 2008-08-10 . Проверено 13 марта 2014 .
- ^ Используете ли вы «безопасные» функции TR 24731 в своем коде на языке C? - Переполнение стека
- ^ «Обзор группы Остина ISO / IEC WDTR 24731» . Проверено 28 октября 2011 года .
- ^ «math_error - обнаружение ошибок в математических функциях» . man7.org . 2008-08-11 . Проверено 13 марта 2014 .
- ^ "дерево" . Man.freebsd.org . 2007-12-27 . Проверено 25 августа 2013 .
- ^ «Перекрестная ссылка BSD суперпользователя: /OpenBSD/sys/sys/tree.h» . bxr.su .
- ^ «очередь» . Man.freebsd.org . 2011-05-13 . Проверено 25 августа 2013 .
- ^ «Перекрестная ссылка BSD суперпользователя: /OpenBSD/sys/sys/queue.h» . bxr.su .
- ^ "fgetln" . Man.freebsd.org . 1994-04-19 . Проверено 25 августа 2013 .
- ^ "Перекрестная ссылка BSD суперпользователя: /OpenBSD/lib/libc/stdio/fgetln.c" . bxr.su .
- ^ «Перекрестная ссылка BSD суперпользователя: /OpenBSD/include/stdio.h» . bxr.su .
- ^ "фтс" . Man.freebsd.org . 2012-03-18 . Проверено 25 августа 2013 .
- ^ «Перекрестная ссылка BSD суперпользователя: /OpenBSD/include/fts.h» . bxr.su .
- ^ "дб" . Man.freebsd.org . 2010-09-10 . Проверено 25 августа 2013 .
- ^ «Перекрестная ссылка BSD суперпользователя: /OpenBSD/include/db.h» . bxr.su .
- ^ Миллер, Тодд С. и Тео де Раадт. strlcpy и strlcat - согласованные, безопасные, копирование и объединение строк . Труды Ежегодной технической конференции USENIX 1999 г., 6–11 июня 1999 г., стр. 175–178.
- ^ «Перекрестная ссылка BSD суперпользователя: /OpenBSD/lib/libc/string/strlcat.c» . bxr.su .
- ^ «Перекрестная ссылка BSD суперпользователя: /OpenBSD/lib/libc/string/strlcpy.c» . bxr.su .
- ^ «Перекрестная ссылка BSD суперпользователя: /OpenBSD/lib/libc/string/strncat.c» . bxr.su .
- ^ «Перекрестная ссылка BSD суперпользователя: /OpenBSD/lib/libc/string/strncpy.c» . bxr.su .
- ^ "ошибка" . Man.freebsd.org . 2012-03-29 . Проверено 25 августа 2013 .
- ^ «Перекрестная ссылка BSD суперпользователя: /OpenBSD/include/err.h» . bxr.su .
- ^ "vis (3)" . Man.FreeBSD.org . Проверено 14 сентября 2013 года .
- ^ «Перекрестная ссылка BSD суперпользователя: /OpenBSD/lib/libc/gen/vis.c» . bxr.su .
- ^ «Перекрестная ссылка BSD суперпользователя: /OpenBSD/include/vis.h» . bxr.su .
- ^ «Стандартная библиотека Python: 6.9. Файловые объекты» . Docs.python.org . Проверено 28 октября 2011 года .
- ^ "libc" . Ящики из ржавчины . Архивировано из оригинального 18 августа 2016 года . Проверено 31 июля 2016 года .
дальнейшее чтение
- Plauger, PJ (1992). Стандартная библиотека C (1-е изд.). Прентис Холл. ISBN 978-0131315099.
Внешние ссылки
- Справочное руководство библиотеки C
- Удобный список заголовков в каком стандарте
- Подпрограммы времени выполнения Microsoft Universal C по категориям в MSDN
- Руководство по библиотекам NetBSD C и полный исходный код библиотеки C.
- Страницы руководства для исходных стандартных библиотек C в Unix