Standardní knihovna jazyka C

Standardní hlavičkové soubory
  • assert.h
  • complex.h
  • ctype.h
  • errno.h
  • fenv.h
  • float.h
  • inttypes.h
  • iso646.h
  • limits.h
  • locale.h
  • math.h
  • setjmp.h
  • signal.h
  • stdarg.h
  • stdbool.h
  • stddef.h
  • stdint.h
  • stdio.h
  • stdlib.h
  • string.h
  • tgmath.h
  • time.h
  • wchar.h
  • wctype.h

Standardní knihovna jazyka C je v informatice implementace standardní knihovny podle standardu ANSI C.[1] Je podmnožinou POSIX specifikace knihovny jazyka C, která byla vytvořena ve stejné době.[2][3] Od chvíle, kdy bylo ANSI C přijato jako ISO standard,[4] je také nazývána jako knihovna ISO C (anglicky ISO C library).

Standardní knihovna jazyka C poskytuje makra, definice datových typů a funkcí pro práci s textovými řetězci, matematické výpočty, práci se vstupy a výstupy, správu paměti a několik dalších služeb operačního systému. Zahrnuje hlavičkové soubory programovacího jazyka C.

Historie

Programovací jazyk C, na rozdíl od tehdy tradičních jazyků jako byl Cobol a Fortran, před svou standardizací neobsahoval vnořené funkce jako například vstupně/výstupní operace. Nedostatek postupem času napravovala uživatelská komunita, vytvářející myšlenku implementace chybějících funkcí a později i jejich stmelení do sady, která se nyní nazývá Standardní knihovna jazyka C. Mnoho z těchto myšlenek se zároveň stalo přímo součástí definice standardu programovacího jazyka C.

Unix a programovací jazyk C vznikaly v Bellových laboratořích firmy AT&T na konci šedesátých a počátku sedmdesátých let. Během sedmdesátých let nabral programovací jazyk C na popularitě a mnoho universit a vládních i nevládních organizací začalo používat ve svých projektech své vlastní variace jazyka, což na počátku osmdesátých let vyústilo ve zřejmé problémy vzájemné kompatibility rozdílných implementací. V roce 1983 sestavil institut ANSI komisi za účelem vytvoření specifikace standardu dnes známého jako ANSI C, která v roce 1989 vyvrcholila vznikem standardu C89. Součástí nově vzniklého standardu je i sada softwarových knihoven nazvaná ANSI C standard library (Standardní knihovna ANSI C).

Následující verze standardu jazyka C přinášely do vzniklé knihovny další požadované hlavičkové soubory, ale podpora těchto nových rozšíření se liší v závislosti na jednotlivých implementacích. Hlavičkové soubory <iso646.h>, <wchar.h> a <wctype.h> byly přidány s prvním rozšířením normy (označovaným NA1) v roce 1995. Následující aktualizace byla provedena v roce 1999 v souvislosti s vydáním standardu C99 a přibyly hlavičkové soubory s názvy: <complex.h>, <fenv.h>, <inttypes.h>, <stdbool.h>, <stdint.h> a <tgmath.h>.

Standard ISO

Knihovna standardu ISO C obsahuje 24 hlavičkových souborů jazyka C, pomocí kterých je možné vytvořit program nezávislý na svém okolí. Každý hlavičkový soubor obsahuje jednu či více deklarací funkcí a definice typů a maker. Hlavičkové soubory standardu ISO C jsou uvedeny v tabulce níže.

V porovnání s jinými jazyky (například Java) je velikost standardní knihovny nepatrná. Knihovna poskytuje základní sadu matematických funkcí, funkce pro práci s řetězci a funkce pro souborový a konzolový vstup a výstup. Nezahrnuje ale standardní sadu pro práci s kontejnery, která je obsažena ve standardu knihovny C++, také se nezabývá specifikací grafického uživatelského rozhraní, síťových nástrojů a dalších, které jsou obsaženy například ve standardu programovacího jazyka JAVA. Hlavní výhodou plynoucí z kompaktnosti malé standardní knihovny je její jednoduchost a následná snadná přenositelnost na nové platformy.

V průběhu času bylo vydáno několik knihoven, které přidávají stejné funkce jako standardní knihovny jiných jazyků. Mezi nejznámější knihovny paří projekt GNOME, který vytvořil soubor grafických nástrojů GTK+ a GLib. Jejich nevýhoda samozřejmě spočívá v tom, že spolu jednotlivé nestandardní knihovny vzájemně nespolupracují a programátoři se většinou musí učit pracovat s novými sadami funkcí.

Standard ISO C hlaviček knihoven

<assert.h> Obsahuje makra pro práci s chybami, která se používají při detekci a odlaďování chyb.
<complex.h> Soubor funkcí, určený pro práci s komplexními čísly (nově v C99).
<ctype.h> Obsahuje funkce pro rozlišení velkých a malých písmen a jejich vzájemným převodem bez závislosti na použité znakové sadě (většinou se využívá sady ASCII, či jejích nástaveb, i když je možné i použití sady EBCDIC.
<errno.h> Testování chybových kódů hlášených funkcemi knihoven.
<fenv.h> Práce v prostředí s pohyblivou řádovou čárkou (nově v C99).
<float.h> Obsahuje definici konstant určených pro práci s knihovnou pro výpočty s plovoucí desetinnou čárkou. Mezi tyto funkce patří například výpočet minimální vzdálenosti dvou čísel s plovoucí desetinnou čárkou (_EPSILON), výpočet maximální přesnosti s použitou desetinnou přesností (_DIG) a funkce pracující s rozsahem použitých číslic (_MIN, _MAX).
<inttypes.h> Pro přesné převody mezi typy integer (nově v C99).
<iso646.h> Pro programování pomocí znakové sady ISO 646 (nově v NA1).
<limits.h> Obsahuje předdefinované konstanty a vlastnosti typů integer, jako je rozsah čísel, který se může zobrazit (_MIN, _MAX).
<locale.h> Pro setlocale() a konstanty s ní související. Tato funkce se používá pro výběr potřebné lokalizace.
<math.h> Výpočty s běžnými matematickými funkcemi.
<setjmp.h> Deklaruje makra setjmp a longjmp, která se používají pro práci s vnějšími proměnnými.
<signal.h> Knihovna pro reakci při různých výjimečných situacích (výjimky, signály).
<stdarg.h> Přístup k argumentům předaným funkcím.
<stdbool.h> Datový typ boolean (nově v C99).
<stdint.h> Definice dalších typů integer (nově v C99).
<stddef.h> Několik užitečných datových typů a maker.
<stdio.h> Podpora vstupů a výstupů jádra programovacího jazyka C. Tento soubor obsahuje „posvátnou“ funkci printf.
<stdlib.h> Pro práci s rozličnými operacemi mezi které patří: generátor pseudonáhodných čísel, rozdělování paměti, kontrola procesů, vyhledávání a třídění.
<string.h> Pro práci s různými druhy řetězců.
<tgmath.h> Pro matematické funkce pro práci s obecnými datovými typy (nově v C99).
<time.h> Pro konverzi mezi různými formáty data a času.
<wchar.h> Pro práci s různými druhy znaků, je potřebná pro programy v jiných jazycích (nově v NA1).
<wctype.h> Pro klasifikaci širokého spektra znaků (nově v NA1).

Problémy a jejich provizorní nápravy

Zranitelnosti způsobené přetečením bufferu

Některé funkce ve standardní knihovně jazyka C byly od svého uvedení nechvalně známé svými zranitelnostmi způsobenými přetečením bufferu a obecně podporou špatného stylu programování.[pozn. 1] Nejkritizovanějšími problémy jsou:

  • Práce s řetězci v jazyce C, především funkce strcpy() a strcat(), kvůli nedostatečné kontrole mezí a možným přetečením bufferu, pokud kontrola mezí není provedena zvláštním kódem;
  • Funkce pro práci s řetězci obecně kvůli vedlejším účinkům, podpoře nezodpovědného používání vyrovnávacích pamětí a nezaručení platného výstupu nulou ukončených řetězců, lineární složitosti zjištění délky řetězce;[pozn. 2]
  • Funkce skupiny printf() pro formátovaný výstup kvůli přepisování zásobníku, když formátovací řetězec nesouhlasí se zadanými argumenty. Tento základní nedostatek vedl k vytvoření celé třídy útoků na formátovací řetězec;
  • Skupina vstupně-výstupních funkcí gets() a scanf(), pro nepoužívání (buď naprosté nebo snadno použitelné) kontroly délky vstupu.

Kromě extrémního případu s funkcí gets() se lze všem bezpečnostním zranitelnostem vyhnout použitím pomocných fragmentů kódu, které provádějí správu paměti, kontrolují meze, provádějí kontroly vstupů, atd. Tyto kontroly mohou mít podobu obalujícího kódu, který činí funkce standardní knihovny bezpečnějšími a snáze použitelnými. Obalující funkce jsou použity již v knize The Practice of Programming Kernighana a Pikeho, v níž takové funkce vypisují chybové zprávy a ukončují program, pokud dojde k chybě.

Výbor ISO C publikoval technickou zprávu TR 24731-1[5] a pracuje na TR 24731-2,[6] které navrhují přijetí některých funkcí s kontrolou mezí a automatickým přidělováním paměti. První zpráva se setkala s ostrou kritikou a nečetnými pochvalami,[7][8] druhá se setkala se smíšenými reakcemi. Bez ohledu na to Microsoft implementoval TR 24731-1 do své standardní knihovny jazyka C a jeho překladač vypisuje varování při použití starých „nebezpečných“ funkcí.

Problémy s vlákny, zranitelnost při souběhu

Funkce strerror() je kritizována pro svoji vláknovou nebezpečnost a zranitelnost vlivem souběhu.

Zpracovávání chyb

Zpracovávání chyb není ve funkcích ze standardní knihovny jazyka C konzistentní a je někdy matoucí. Podle manuálové stránky Linuxu math_error je „aktuální (verze 2.8) situace v glibc je nepřehledná. Většina (ale ne všechny) funkce vyhazují při chybách výjimky. Některé také nastavují proměnnou errno. Několik funkcí nastavuje errno, ale nevyhazuje výjimku. A velmi málo funkcí nedělá ani jedno ani druhé.“[9]

Standardní knihovna jazyka C v jiných jazycích

Některé programovací jazyky zahrnují funkce standardní knihovny jazyka C ve svých vlastních knihovnách. Knihovny v jiných programovacích jazycích jsou většinou přizpůsobené, aby více vyhovovaly struktuře daného programovacího jazyka, ale funkce a sémantika je zachována. Programovací jazyk C++ například zahrnuje funkce standardu knihovny ANSI C, co se týče jména funkcí std (jako std::printf, std::atoi, std::feof, etc.) a podobná jména hlavičkových souborů (cstdio, cmath, cstdlib atd.). Dalšími jazyky s podobným přístupem k programování, jako má jazyk C jsou: programovací jazyk D a převládající implementace jazyka Python známá jako CPython.

Knihovny v kompilátoru

Některé kompilátory (například GCC)[10] přikládají vlastní verze některých funkcí ze standardní knihovny jazyka C. To znamená, že funkce jsou zapsány přímo v kompilovaném objektovém souboru a program je volá namísto funkcí ve sdílené knihovně jazyka C. Vestavěné (anglicky builtin) funkce musí svým chováním respektovat standard ISO C.

Implementace

Unixové systémy mají většinou zabudovanou sdílenou knihovnu jazyka C, ale ne vždy jsou v instalaci obsaženy hlavičkové soubory, takže je znemožněna tvorba aplikací v jazyce C. Knihovna jazyka C je v unixových systémech považována za součást operačního systému. Funkce jazyka C, včetně těch ze standardu ISO C, jsou často používány programy i operačním systémem, tím pádem by systémy s unixovým jádrem při absenci knihovny jazyka C nefungovaly.

Na systémech Microsoft Windows jádro dynamických knihoven (DLL) neobsahuje standardní knihovnu jazyka C – ta je obsažena zvlášť v jednotlivých kompilátorech. Programy vytvořené v programovacím jazyce C jsou buď staticky propojené s knihovnou jazyka C nebo jsou propojené s dynamickou verzí knihovny distribuovanou přímo s programem.

Seznam dalších nejznámějších implementací:

  • BSD libc – implementace pro operační systémy BSD
  • GNU C Library – nejběžnější implementace používaná unixovými systémy, jako je například Linux
  • dietlibc – alternativní implementace glibc zaměřená na malou velikost
  • uClibc – implementace pro Linuxové vestavěné systémy (bez MMU)
  • Dinkum C99 Library od Dinkumware – implementace od Dinkumware
  • Microsoft C Run-time Library – nejvíce komerčně licencovaná knihovna
  • Newlib – implementace pro vestavěné systémy (bez MMU)[11]
  • klibc – implementace primárně určená pro použití v jádře Linuxu (kernel-libc)
  • EGLIBC – varianta glibc pro vestavěné systémy

Odkazy

Poznámky

  1. Morrisův červ, který zneužíval dobře známou zranitelnost funkce gets() byl vytvořen již v roce 1988.
  2. Ve standardní knihovně jazyka C má výpočet délky řetězce a hledání konce řetězce lineární časovou složitost a je neefektivní, když se používá pro stejný nebo podobné řetězce opakovaně

Reference

V tomto článku byl použit překlad textu z článku C standard library na anglické Wikipedii.

  1. ISO/IEC (1999). ISO/IEC 9899:1999(E): Programming Languages - C §7.19.1 para 1
  2. The GNU C Library – Introduction [online]. [cit. 2013-12-05]. Dostupné online. Je zde použita šablona {{Cite web}} označená jako k „pouze dočasnému použití“.
  3. Difference between C standard library and C POSIX library [online]. 2012 [cit. 2015-03-04]. Dostupné online. Je zde použita šablona {{Cite web}} označená jako k „pouze dočasnému použití“.
  4. C Standards [online]. Keil [cit. 2011-11-24]. Dostupné online. Je zde použita šablona {{Cite web}} označená jako k „pouze dočasnému použití“.
  5. ISO/IEC TR 24731-1: Extensions to the C Library, Part I: Bounds-checking interfaces [online]. open-std.org, 2007-03-28 [cit. 2014-03-13]. Dostupné online. 
  6. ISO/IEC WDTR 24731-2: Extensions to the C Library, Part II: Dynamic Allocation Functions [online]. open-std.org, 2008-08-10 [cit. 2014-03-13]. Dostupné online. 
  7. Do you use the TR 24731 'safe' functions in your C code? - Stack overflow
  8. Austin Group Review of ISO/IEC WDTR 24731 [online]. [cit. 2011-10-28]. Dostupné online. 
  9. math_error - detecting errors from mathematical functions [online]. man7.org, 2008-08-11 [cit. 2014-03-13]. Dostupné online. 
  10. Other built-in functions provided by GCC, GCC Manual
  11. Re: Does Newlib support mmu-less CPUs?. www.cygwin.com [online]. [cit. 2009-06-11]. Dostupné v archivu pořízeném dne 2008-11-22. 

Literatura

  • PLAUGER, P.J., 1992. The Standard C library. 1. vyd. [s.l.]: Prentice Hall. ISBN 978-0131315099. 

Související články

Externí odkazy

  • The C Library Reference Guide
  • Handy list of which headers are in which standard
  • Microsoft Universal C runtime routines by category na MSDN
  • NetBSD C libraries manual Archivováno 18. 5. 2024 na Wayback Machine. a full C library source
  • Manual pages for the original C standard libraries in Unix