stringtranslate.com

Стандартная библиотека C

Стандартная библиотека C или libc — это стандартная библиотека для языка программирования C , как указано в стандарте ISO C. [1] Начиная с исходного стандарта ANSI C , он был разработан одновременно со спецификацией POSIX библиотеки C , которая является его расширенной версией. [2] [3] Поскольку ANSI C был принят Международной организацией по стандартизации , [4] стандартная библиотека C также называется библиотекой ISO C.

Стандартная библиотека C предоставляет макросы , определения типов и функции для таких задач, как обработка строк , математические вычисления, обработка ввода/вывода, управление памятью и ряд других служб операционной системы .

Интерфейс прикладного программирования (API)

Заголовочные файлы

Интерфейс прикладного программирования (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) с C11 в 2011 году. Всего теперь существует 29 файлов заголовков:

Три файла заголовков ( complex.h, stdatomic.hи threads.h) являются условными функциями, поддержка которых реализациями не требуется.

В стандарт POSIX добавлено несколько нестандартных заголовков C для специфичных для Unix функций. Многие нашли свой путь к другим архитектурам. Примеры включают fcntl.hи unistd.h. Ряд других групп используют другие нестандартные заголовки — в библиотеке GNU C есть alloca.h, а в OpenVMS есть такая va_count()функция.

Документация

В Unix-подобных системах авторитетная документация API предоставляется в виде страниц руководства . В большинстве систем страницы руководства по функциям стандартной библиотеки находятся в разделе 3; раздел 7 может содержать несколько более общих страниц, посвященных основным концепциям (например, man 7 math_errorв Linux ).

Реализации

Unix-подобные системы обычно имеют библиотеку C в форме общей библиотеки , но файлы заголовков (и набор инструментов компилятора) могут отсутствовать в установке, поэтому разработка C может быть невозможна. Библиотека C считается частью операционной системы Unix-подобных систем; Помимо функций, определенных стандартом C, он включает в себя другие функции, являющиеся частью API операционной системы, например функции, указанные в стандарте POSIX . Функции библиотеки 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, поставляемых как с различными операционными системами, так и с компиляторами C. Вот некоторые из популярных реализаций:

Встроенные функции компилятора

Некоторые компиляторы (например, 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] Наиболее критикуемым пунктам являются:

За исключением крайнего случая с 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-е годы язык C становился все более популярным. Многие университеты и организации начали создавать собственные варианты языка для собственных проектов. К началу 1980-х годов стали очевидны проблемы совместимости между различными реализациями языка C. В 1983 году Американский национальный институт стандартов (ANSI) сформировал комитет для установления стандартной спецификации C, известной как « ANSI C ». Кульминацией этой работы стало создание в 1989 году так называемого стандарта C89. Частью полученного стандарта стал набор программных библиотек , названный стандартной библиотекой ANSI C.

Стандартная библиотека POSIX

POSIX , как и SUS , определяют ряд подпрограмм, которые должны быть доступны помимо тех, которые есть в базовой стандартной библиотеке C. Спецификация POSIX включает файлы заголовков, среди прочего, для многопоточности , работы в сети и регулярных выражений . Они часто реализуются вместе с функциональностью стандартной библиотеки C с различной степенью близости. Например, glibc реализует такие функции, как forkWithin libc.so, но до того, как NPTL был объединен с glibc, он представлял собой отдельную библиотеку с собственным аргументом флага компоновщика. Часто эта функциональность, определенная POSIX, рассматривается как часть библиотеки; базовая библиотека C может быть идентифицирована как библиотека C ANSI или ISO .

БСД libc

BSD libc — это расширенная версия стандартной библиотеки POSIX, поддерживаемая библиотеками C, включенными в операционные системы BSD, такие как FreeBSD , NetBSD , OpenBSD и macOS . BSD libc имеет некоторые расширения, которые не определены в исходном стандарте, многие из которых впервые появились в версии 4.4BSD 1994 года (первая, которая получила широкое развитие после выхода первого стандарта в 1989 году). Вот некоторые расширения BSD libc:

Стандартная библиотека C на других языках

Некоторые языки включают функциональность стандартной библиотеки C в свои собственные библиотеки. Библиотеку можно адаптировать, чтобы она лучше соответствовала структуре языка, но операционная семантика остается неизменной. Язык C++ , например, включает в себя функциональность стандартной библиотеки C в пространстве имен std (например, std::printf, std::atoi, std::feof), в заголовочных файлах с именами, похожими на имена C ( 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 на новую платформу сравнительно легко.

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

Примечания

  1. ^ Червь Морриса , использующий известную уязвимость, gets()был создан еще в 1988 году.
  2. ^ в стандартной библиотеке C вычисление длины строки и поиск конца строки имеют линейную сложность по времени и неэффективны при многократном использовании с одной и той же или связанными строками.

Рекомендации

  1. ^ ИСО / МЭК (2018). ISO/IEC 9899:2018(E): Языки программирования – C §7
  2. ^ «Библиотека GNU C – Введение». gnu.org . Проверено 5 декабря 2013 г.
  3. ^ «Разница между стандартной библиотекой C и библиотекой C POSIX» . stackoverflow.com . 2012 . Проверено 4 марта 2015 г.
  4. ^ «Стандарты C». C: Стандарты C. Кейл . Проверено 24 ноября 2011 г.
  5. ^ «Re: Поддерживает ли Newlib процессоры без mmu?». Cygwin.com. 23 марта 2006 г. Архивировано из оригинала 22 ноября 2008 г. Проверено 28 октября 2011 г.
  6. ^ "musl libc" . Эталабс.нет . Проверено 28 октября 2011 г.
  7. ^ Другие встроенные функции, предоставляемые GCC, Руководство GCC.
  8. ^ «Компиляция с помощью cc» . Проверено 2 марта 2013 г.
  9. ^ Веймер, Флориан. «c — Для каких функций предназначена libm?». Переполнение стека . Проверено 24 февраля 2021 г.
  10. ^ «c99 — компилировать стандартные программы на C» . Базовые спецификации открытой группы, выпуск 7, издание 2018 г. Открытая группа . Проверено 24 февраля 2021 г.
  11. ^ "Часто задаваемые вопросы по музл" . www.musl-libc.org . Проверено 24 февраля 2021 г.
  12. ^ «ISO/IEC TR 24731-1: Расширения библиотеки C, Часть I: Интерфейсы проверки границ» (PDF) . open-std.org. 28 марта 2007 г. Проверено 13 марта 2014 г.
  13. ^ «ISO/IEC WDTR 24731-2: Расширения библиотеки C, Часть II: Функции динамического распределения» (PDF) . open-std.org. 10 августа 2008 г. Проверено 13 марта 2014 г.
  14. ^ Используете ли вы «безопасные» функции TR 24731 в своем коде на C? - Переполнение стека
  15. ^ "Обзор Austin Group ISO/IEC WDTR 24731" . Проверено 28 октября 2011 г.
  16. ^ «math_error — обнаружение ошибок математических функций» . man7.org . 11 августа 2008 г. Проверено 13 марта 2014 г.
  17. ^ "дерево". Man.freebsd.org . 27 декабря 2007 г. Проверено 25 августа 2013 г.
  18. ^ «Перекрестная ссылка BSD суперпользователя: /OpenBSD/sys/sys/tree.h» . bxr.su.
  19. ^ "очередь". Man.freebsd.org . 13 мая 2011 г. Проверено 25 августа 2013 г.
  20. ^ «Перекрестная ссылка BSD суперпользователя: /OpenBSD/sys/sys/queue.h» . bxr.su.
  21. Ссылки Man.freebsd.org . 19 апреля 1994 г. Проверено 25 августа 2013 г.
  22. ^ «Перекрестная ссылка BSD суперпользователя: /OpenBSD/lib/libc/stdio/fgetln.c» . bxr.su.
  23. ^ «Перекрестная ссылка BSD суперпользователя: /OpenBSD/include/stdio.h» . bxr.su.
  24. Ссылки Man.freebsd.org . 18 марта 2012 г. Проверено 25 августа 2013 г.
  25. ^ «Перекрестная ссылка BSD суперпользователя: /OpenBSD/include/fts.h» . bxr.su.
  26. ^ "БД". Man.freebsd.org . 10 сентября 2010 г. Проверено 25 августа 2013 г.
  27. ^ «Перекрестная ссылка BSD суперпользователя: /OpenBSD/include/db.h» . bxr.su.
  28. ^ Миллер, Тодд К. и Тео де Раадт. strlcpy и strlcat — согласованное, безопасное копирование и конкатенация строк. Материалы ежегодной технической конференции USENIX 1999 г., 6–11 июня 1999 г., стр. 175–178.
  29. ^ «Перекрестная ссылка BSD суперпользователя: /OpenBSD/lib/libc/string/strlcat.c» . bxr.su.
  30. ^ «Перекрестная ссылка BSD суперпользователя: /OpenBSD/lib/libc/string/strlcpy.c» . bxr.su.
  31. ^ «Перекрестная ссылка BSD суперпользователя: /OpenBSD/lib/libc/string/strncat.c» . bxr.su.
  32. ^ «Перекрестная ссылка BSD суперпользователя: /OpenBSD/lib/libc/string/strncpy.c» . bxr.su.
  33. ^ "ошибка". Man.freebsd.org . 29 марта 2012 г. Проверено 25 августа 2013 г.
  34. ^ «Перекрестная ссылка BSD суперпользователя: /OpenBSD/include/err.h» . bxr.su.
  35. ^ "vis(3)" . Man.FreeBSD.org . Проверено 14 сентября 2013 г.
  36. ^ «Перекрестная ссылка BSD суперпользователя: /OpenBSD/lib/libc/gen/vis.c» . bxr.su.
  37. ^ «Перекрестная ссылка BSD суперпользователя: /OpenBSD/include/vis.h» . bxr.su.
  38. ^ «Стандартная библиотека Python: 6.9. Объекты файлов» . Docs.python.org . Проверено 28 октября 2011 г.
  39. Ссылки Ржавые ящики . Архивировано из оригинала 18 августа 2016 года . Проверено 31 июля 2016 г.

дальнейшее чтение

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