C標準ライブラリ

ウィキペディアから、無料の百科事典
ナビゲーションにジャンプ 検索にジャンプ

C標準ライブラリlibcのは、ある標準ライブラリのためのCプログラミング言語で指定され、ISO Cの標準。[1]元のANSIC標準から始まり、そのスーパーセットであるCライブラリPOSIX仕様と同時に開発されました[2] [3] ANSI Cは国際標準化機構によって採用されたため[4] C標準ライブラリはISOCライ​​ブラリとも呼ばれます

C標準ライブラリは文字列処理、数学的計算、入出力処理、メモリ管理、およびその他のいくつかのオペレーティングシステムサービスなどのタスク用のマクロ定義、および関数を提供します。

アプリケーションプログラミングインターフェース

ヘッダーファイル

1999 ISO C.pdf

C標準ライブラリアプリケーションプログラミングインターフェイス(API)は、いくつかのヘッダーファイルで宣言されています各ヘッダーファイルには、1つ以上の関数宣言、データ型定義、およびマクロが含まれています。

安定性の長い期間の後、3つの新しいヘッダファイルは(iso646.hwchar.hおよびwctype.h)を添加した規範補遺1(NA1)、より多くのヘッダファイルは、(1995シックスに批准C標準に加えてcomplex.hfenv.hinttypes.hstdbool.hstdint.h、およびtgmath.h)を添加しましたC99、C規格の改正が1999年に出版され、そして5つのファイル(stdalign.hstdatomic.hstdnoreturn.hthreads.h、及びuchar.hで)C11、合計で2011年、29のヘッダファイルは、現在存在します。

名前 から 説明
<assert.h> プログラムのバージョンをデバッグする際の論理エラーやその他のタイプのバグの検出を支援するために使用されるassertマクロが含まれています
<complex.h> C99 複素数を操作するための関数セット
<ctype.h> 使用される文字セットに依存しない方法で、文字をタイプで分類したり、大文字と小文字を変換したりするために使用される関数のセットを定義します(通常、ASCIIまたはその拡張機能の1つですが、EBCDIC使用する実装も知られています)。
<errno.h> ライブラリ関数によって報告されたエラーコードをテストするため。
<fenv.h> C99 浮動小数点環境を制御するための一連の関数定義します。
<float.h> 浮動小数点ライブラリの実装固有のプロパティを指定するマクロ定数定義します。
<inttypes.h> C99 正確な幅の整数型を定義します
<iso646.h> NA1 いくつかの標準トークンを表現するための代替方法を実装するいくつかのマクロ定義しますISO646バリアント文字セットでのプログラミング用
<limits.h> 整数型の実装固有のプロパティを指定するマクロ定数定義します。
<locale.h> ローカリゼーション関数を定義します
<math.h> 一般的な数学関数を定義します
<setjmp.h> 非ローカル出口に使用されるマクロsetjmpとを宣言しますlongjmp
<signal.h> シグナル処理関数を定義します
<stdalign.h> C11 オブジェクト配置照会および指定するため
<stdarg.h> 関数に渡されるさまざまな数の引数にアクセスするため。
<stdatomic.h> C11 ためにアトミック操作データにスレッド間で共有されます。
<stdbool.h> C99 ブールデータ型を定義します
<stddef.h> いくつかの便利なタイプとマクロを定義します
<stdint.h> C99 正確な幅の整数型を定義します
<stdio.h> コア入力および出力機能を定義します
<stdlib.h> 数値変換関数疑似乱数生成関数メモリ割り当てプロセス制御関数を定義します
<stdnoreturn.h> C11 戻り値のない関数を指定する場合
<string.h> 文字列処理関数を定義します
<tgmath.h> C99 型ジェネリック数学関数を定義します
<threads.h> C11 複数のスレッドミューテックス、および条件変数を管理するための関数を定義します
<time.h> 日付と時刻の処理機能を定義します
<uchar.h> C11 Unicode文字 を操作するためのタイプと関数
<wchar.h> NA1 ワイドストリング処理関数を定義します
<wctype.h> NA1 ワイド文字をタイプで分類したり、大文字と小文字を変換したりするために使用される関数のセットを定義します

ヘッダファイル(のうちの3つはcomplex.hstdatomic.h、およびthreads.h)実装がサポートする必要がないことを条件特徴です。

POSIX標準は、UNIX固有の機能のために、いくつかの非標準のCヘッダを追加しました。多くの人が他のアーキテクチャへの道を見つけました。例にはとが含まfcntl.hunistd.hます。他の多くのグループが他の非標準ヘッダーを使用していますGNU Cライブラリにはがありalloca.hHPOpenVMSにはva_count()機能があります。

ドキュメント

Unixライクなシステムでは、実際に実装されたAPIの信頼できるドキュメントがmanページの形式で提供されますほとんどのシステムでは、標準ライブラリ関数のマニュアルページはセクション3にあります。セクション7は、(例えば基礎となる概念上のいくつかのより一般的なページが含まれていてもよいman 7 math_errorのLinux)。

実装

Unixライクなシステムには通常、共有ライブラリ形式のCライブラリがありますが、ヘッダーファイル(およびコンパイラツールチェーン)がインストールに含まれていない可能性があるため、C開発が不可能な場合があります。 Cライブラリは、Unixライクなシステムのオペレーティングシステムの一部と見なされます。 ISO C標準関数を含むC関数は、プログラムによって広く使用されており、C言語で何かを実装しただけでなく、オペレーティングシステムインターフェイスの事実上の一部であるかのように見なされます。 Unixライクなオペレーティングシステムは、通常、Cライブラリが消去されると機能しません。これは、静的にリンクされているのではなく、動的にリンクされているアプリケーションに当てはまります。さらに、カーネル自体(少なくともLinuxの場合)は、ライブラリとは独立して動作します。

Microsoft Windowsでは、コアシステムダイナミックライブラリ(DLL)は、Microsoft Visual C ++コンパイラv6.0用のC標準ライブラリの実装を提供します。新しいバージョンのMicrosoftVisual C ++コンパイラ用のC標準ライブラリは、各コンパイラによって個別に提供され、再配布可能なパッケージも提供されます。 Cで記述されたコンパイル済みアプリケーションは、ターゲットシステムに存在することに依存するのではなく、Cライブラリに静的にリンクされるか、これらのアプリケーションに付属するライブラリの動的バージョンにリンクされます。コンパイラのCライブラリ内の関数は、MicrosoftWindowsへのインターフェイスとは見なされません。

さまざまなオペレーティングシステムとCコンパイラの両方で提供される、他の多くの実装が存在します。一般的な実装のいくつかは次のとおりです。

コンパイラ組み込み関数

一部のコンパイラ(GCC [7]など)は、C標準ライブラリの多くの関数の組み込みバージョンを提供します。つまり、関数の実装はコンパイルされたオブジェクトファイルに書き込まれ、プログラムはCライブラリ共有オブジェクトファイルの関数の代わりに組み込みバージョンを呼び出します。これにより、特に関数呼び出しがインラインバリアントに置き換えられた場合に、関数呼び出しのオーバーヘッドが削減され、他の形式の最適化が可能になります(コンパイラは組み込みバリアント制御フロー特性を認識しているため)が、デバッグ時に混乱が生じる可能性があります(たとえば、組み込みバージョンをインストルメント化されたバージョンに置き換えることはできません バリアント)。

ただし、組み込み関数はISO Cに準拠した通常の関数のように動作する必要があります。主な意味は、プログラムがアドレスを取得してこれらの関数へのポインタを作成し、そのポインタを使用して関数を呼び出すことができる必要があるということです。同じ関数への2つのポインターが、プログラム内の2つの異なる変換単位で派生している場合、これら2つのポインターは等しく比較する必要があります。つまり、アドレスは、外部(プログラム全体)のリンクを持つ関数の名前を解決することによって取得されます。

リンク、libm

FreeBSD [8]およびglibc [9]では、sin()などの一部の関数はデフォルトではリンクされておらず、代わりに数学ライブラリlibmにバンドルされています。それらのいずれかを使用する場合は、リンカにディレクティブを指定する必要があります-lmPOSIXはC99コンパイラがサポートすることを要求-lmし、関数がヘッダで宣言されているmath.hcomplex.hfenv.hあればリンクするための利用可能な-lm指定されていますが、機能がデフォルトでリンクされている場合は指定されていません。[10] muslは、すべてを単一のlibcライブラリに入れ、空のlibmを提供することで、この要件を満たします。[11]

検出

C標準によれば、実装がホストされている場合、マクロ__STDC_HOSTED__1に定義されます。ホストされた実装には、C標準で指定されたすべてのヘッダーがあります。実装は独立しいる場合もあります。これは、これらのヘッダーが存在しないことを意味します。実装が独立している場合、0に定義する__STDC_HOSTED__必要があります

問題と回避策

バッファオーバーフローの脆弱性

C標準ライブラリの一部の関数は、バッファオーバーフローの脆弱性があり、採用以来、バグのあるプログラミングを一般的に奨励していることで有名です[a]最も批判されている項目は次のとおりです。

  • 境界チェックの欠如と、境界が手動でチェックされていない場合に発生する可能性のあるバッファオーバーフローのためのstrcpy()およびを含む文字列操作ルーチンstrcat()
  • 一般に、副作用のための文字列ルーチンは、無責任なバッファの使用を奨励しますが、有効なnullで終了する出力、線形長の計算を常に保証するわけではありません[NS]
  • printf()フォーマット文字列が指定された引数と一致しない場合に実行スタックを台無しにするためのルーチンのファミリこの根本的な欠陥により、攻撃のクラス全体が作成されました。フォーマット文字列攻撃
  • gets()そして、scanf()の欠如のためのI / Oルーチンの家族、(どちらかのいずれか、または簡単な)入力長チェック。

の極端な場合を除いて、gets()メモリ管理、境界チェック、入力チェックなどを実行する補助コードを導入すること、すべてのセキュリティの脆弱性を回避できます。これは、標準ライブラリ関数をより安全で使いやすくするラッパーの形式で行われることがよくあります。これは、B。KernighanとR. Pikeによるプログラミング作法の本にまでさかのぼります。著者は通常、エラーメッセージを出力し、エラーが発生した場合にプログラムを終了するラッパーを使用します。

ISO C委員会は、テクニカルレポートTR 24731-1 [12]公開し、TR 24731-2 [13]取り組んでおり、それに応じて、境界チェックと自動バッファ割り当てを備えたいくつかの機能の採用を提案しています。前者はいくつかの賞賛をもって厳しい批判に直面しており[14] [15]、後者はさまざまな反応を受けた。それにもかかわらず、TR 24731-1はMicrosoftのC標準ライブラリに実装されており、そのコンパイラは古い「安全でない」関数を使用すると警告を発行します。

スレッドの問題、競合状態に対する脆弱性

このstrerror()ルーチンは、スレッドセーフではなく競合状態に対して脆弱であると批判されています

エラー処理

C標準ライブラリの関数のエラー処理は一貫しておらず、混乱を招くことがあります。Linuxのマニュアルページによるとmath_error、「glibcでの現在の(バージョン2.8)状況は厄介です。ほとんどの(すべてではない)関数はエラー時に例外を発生させます。一部の関数はerrnoを設定します。一部の関数はerrnoを設定しますが、例外は発生しません。 。非常に少数の機能がどちらも実行しません。」[16]

標準化

元のC言語は、COBOLFortranなどの従来の言語とは異なり、I / O操作などの組み込み関数を提供していませんでした[要出典]時間の経過とともに、Cのユーザーコミュニティは、現在C標準ライブラリと呼ばれているもののアイデアと実装を共有しました。これらのアイデアの多くは、最終的に標準化されたC言語の定義に組み込まれました。

UnixとCはどちらも、1960年代後半から1970年代初頭にAT&Tのベル研究所作成されました。 1970年代に、C言語はますます人気が高まりました。多くの大学や組織は、独自のプロジェクトのために独自の言語のバリエーションを作成し始めました。 1980年代の初めまでに、さまざまなC実装間の互換性の問題が明らかになりました。 1983年に、米国規格協会(ANSI)は、「ANSICとして知られるCの標準仕様を確立するための委員会を設立しました。この作業は、1989年にいわゆるC89標準の作成に至りました。結果として得られた標準の一部は、ANSIC標準ライブラリと呼ばれるソフトウェアライブラリのセットでした

POSIX標準ライブラリ

POSIXおよびSUSは、基本的なC標準ライブラリのルーチンに加えて使用できるルーチンの数を指定します。POSIX仕様には、マルチスレッドネットワーキング正規表現などの用途のヘッダーファイルが含まれていますこれらは多くの場合、C標準ライブラリ機能と一緒に実装され、さまざまな程度の近さで実装されます。たとえば、glibcforklibc.soNPTLの前にあるなどの関数を実装します。glibcにマージされ、独自のリンカーフラグ引数を持つ別個のライブラリを構成しました。多くの場合、このPOSIX指定の機能はライブラリの一部と見なされます。基本Cライブラリは、ANSIまたはISOCライブラリとして識別できます

BSD libc

BSD libcは、FreeBSDNetBSDOpenBSDmacOSなどのBSD オペレーティングシステムに含まれているCライブラリでサポートされているPOSIX標準ライブラリのスーパーセットですBSD libcには、元の標準で定義されていない拡張機能がいくつかあり、その多くは1994年の4.4BSDリリース(1989年に最初の標準が発行された後に主に開発されたもの)で最初に登場しましたBSDlibcの拡張機能のいくつかは次のとおりです。

他の言語のC標準ライブラリ

一部の言語では、独自のライブラリに標準Cライブラリの機能が含まれています。ライブラリは、言語の構造により適したものに適合させることができますが、操作的意味論は同様に保たれます。C ++言語は、例えば、C標準ライブラリの機能が含まれる名前空間 std(例えば、std::printfstd::atoistd::feof)、Cのものに似た名前のヘッダファイルで(cstdiocmathcstdlib、など)。同様のアプローチをとる他の言語は、DPerlRuby、およびCPythonとして知られるPythonの主な実装です。たとえば、Python 2では、組み込みファイルオブジェクトは「Cのstdioパッケージを使用して実装[38]として定義されているため、使用可能な操作(開く、読み取り、書き込みなど)は、対応するC関数。Rustにlibc呼ばれるクレートがあり、いくつかのC関数、構造体、およびその他の型定義を使用できます。[39]

他の言語の標準ライブラリとの比較

C標準ライブラリは、他のいくつかの言語の標準ライブラリと比較して小さいです。Cライブラリは、数学関数、文字列操作、型変換、ファイルおよびコンソールベースのI / Oの基本セットを提供します。完全なグラフィカルユーザーインターフェイス(GUI)ツールキット、ネットワーキングツール、およびJava.NET Frameworkの他の豊富な機能は言うまでもなくC ++標準テンプレートライブラリのようなコンテナタイプ」の標準セットは含まれていません。 標準で提供します。小さな標準ライブラリの主な利点は、動作するISO C環境を提供することが他の言語よりもはるかに簡単であり、その結果、Cを新しいプラットフォームに移植するのが比較的簡単なことです。

も参照してください

注意事項

  1. ^で よく知られている脆弱性を利用するモリスワームは、gets()早くも1988年に作成されました。
  2. ^ C標準ライブラリでは、文字列の長さの計算と文字列の終わりの検索には線形の時間計算量があり、同じ文字列または関連する文字列で繰り返し使用すると非効率的です。

参考文献

  1. ^ ISO / IEC(2018)。ISO / IEC 9899:2018(E):プログラミング言語-C§7
  2. ^ 「GNUCライブラリ–はじめに」gnu.org 2013年12月5日取得
  3. ^ 「C標準ライブラリとCPOSIXライブラリの違い」stackoverflow.com2012 取得した2015年3月4日に
  4. ^ 「C標準」キール取得した24年11月2011
  5. ^ 「Re:NewlibはmmuレスCPUをサポートしていますか?」Cygwin.com。2006年3月23日。2008年11月22日のオリジナルからアーカイブ取得した28年10月2011
  6. ^ 「musllibc」Etalabs.net 取得した28年10月2011
  7. ^ GCCが提供するその他の組み込み関数、GCCマニュアル
  8. ^ 「ccでコンパイルする」取得した2013年3月2日に
  9. ^ ワイマー、フロリアン。「c-libmはどのような機能を対象としていますか?」スタックオーバーフロー2021年2月24日取得
  10. ^ 「c99-標準のCプログラムをコンパイルする」Open Group Base Specification Issue 7、2018エディションオープングループ2021年2月24日取得
  11. ^ 「muslFAQ」www.musl-libc.org 2021年2月24日取得
  12. ^ 「ISO / IECTR 24731-1:Cライブラリの拡張、パートI:境界チェックインターフェイス」(PDF)open-std.org。2007-03-28 2014年3月13取得
  13. ^ 「ISO / IECWDTR 24731-2:Cライブラリの拡張、パートII:動的割り当て関数」(PDF)open-std.org。2008-08-10 2014年3月13取得
  14. ^ CコードでTR24731の「安全な」関数を使用していますか?- スタックオーバーフロー
  15. ^ 「ISO / IECWDTR24731のオースティングループレビュー」取得した28年10月2011
  16. ^ 「math_error-数学関数からのエラーの検出」man7.org2008-08-11 2014年3月13取得
  17. ^ 「ツリー」Man.freebsd.org2007-12-27 2013年825日取得
  18. ^ 「スーパーユーザーのBSD相互参照:/OpenBSD/sys/sys/tree.h」bxr.su
  19. ^ 「キュー」Man.freebsd.org2011-05-13 2013年825日取得
  20. ^ 「スーパーユーザーのBSD相互参照:/OpenBSD/sys/sys/queue.h」bxr.su
  21. ^ "fgetln"Man.freebsd.org1994-04-19 2013年825日取得
  22. ^ 「スーパーユーザーのBSD相互参照:/OpenBSD/lib/libc/stdio/fgetln.c」bxr.su
  23. ^ 「スーパーユーザーのBSD相互参照:/OpenBSD/include/stdio.h」bxr.su
  24. ^ "fts"Man.freebsd.org2012-03-18 2013年825日取得
  25. ^ 「スーパーユーザーのBSD相互参照:/OpenBSD/include/fts.h」bxr.su
  26. ^ "db"Man.freebsd.org2010-09-10 2013年825日取得
  27. ^ 「スーパーユーザーのBSD相互参照:/OpenBSD/include/db.h」bxr.su
  28. ^ Miller、Todd C.、Theo deRaadt。strlcpyとstrlcat-一貫性があり、安全で、文字列のコピーと連結1999年USENIX年次技術会議の議事録、1999年6月6〜11日、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.org2012-03-29 2013年825日取得
  34. ^ 「スーパーユーザーのBSD相互参照:/OpenBSD/include/err.h」bxr.su
  35. ^ "vis(3)"Man.FreeBSD.org 取得した14年9月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年10月2011
  39. ^ 「libc」錆びた木枠2016年8月18日にオリジナルからアーカイブされまし検索された31年7月2016

さらに読む

外部リンク