C 표준 라이브러리

C standard library

C 표준 라이브러리 또는 libcISO C [1]표준에 명시된 C 프로그래밍 언어의 표준 라이브러리입니다.원래의 ANSI C 표준에서 시작하여 C 라이브러리 POSIX 규격과 동시에 개발되었으며,[2][3] 이 규격의 슈퍼셋이다.ANSI C가 국제 표준화 [4]기구에 의해 채택되었기 때문에 C 표준 라이브러리는 ISO C 라이브러리라고도 불립니다.

C 표준 라이브러리는 문자열 처리, 수학적 계산, 입출력 처리, 메모리 관리 및 기타 운영 체제 서비스 등의 작업을 위한 매크로, 유형 정의 및 함수를 제공합니다.

응용 프로그램 프로그래밍 인터페이스

헤더 파일

1999 ISO C.pdf

C 표준 라이브러리의 Application Programming Interface(API; 응용 프로그램프로그래밍 인터페이스)는 다수의 헤더 파일로 선언되어 있습니다.각 헤더 파일에는 하나 이상의 함수 선언, 데이터 유형 정의 및 매크로가 포함됩니다.

장기간 안정된 후 3개의 새로운 헤더 파일(iso646.h,wchar.h,그리고.wctype.h)는 1995년에 비준된 C 표준에 추가된 표준 부록 1(NA1)과 함께 추가되었다.헤더 파일 6개 추가 (complex.h,fenv.h,inttypes.h,stdbool.h,stdint.h,그리고.tgmath.h1999년에 발표된 C Standard 개정판 C99 및 5개의 파일( )이 추가되었습니다.stdalign.h,stdatomic.h,stdnoreturn.h,threads.h,그리고.uchar.h2011년에 C11을 도입했습니다.총 29개의 헤더 파일이 있습니다.

이름. 부터 묘사
<assert.h> 프로그램 디버깅에서 논리적 오류 및 기타 유형의 버그를 탐지하는 데 사용되는 아사트 매크로를 포함합니다.
<complex.h> C99 복소수를 조작하기 위한 함수 세트입니다.
<ctype.h> 문자를 유형별로 분류하거나 사용된 문자 집합과 독립적인 방식으로 대소문자를 변환하는 데 사용되는 함수 집합을 정의합니다(일반적으로 ASCII 또는 EBCDIC을 사용하는 구현도 알려져 있지만 확장자 중 하나).
<errno.h> 라이브러리 기능에 의해 보고된 에러 코드 테스트용.
<fenv.h> C99 부동소수점 환경을 제어하기 위한 함수 집합을 정의합니다.
<float.h> 부동소수점 라이브러리의 구현별 속성을 지정하는 매크로 상수를 정의합니다.
<inttypes.h> C99 정확한 폭의 정수 유형을 정의합니다.
<iso646.h> NA1 여러 표준 토큰을 표현하는 대체 방법을 구현하는 여러 매크로를 정의합니다.ISO 646 변형 문자 집합 프로그래밍용.
<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 유니코드 문자를 조작하기 위한 유형 및 함수
<wchar.h> NA1 와이드 문자열 처리 함수를 정의합니다.
<wctype.h> NA1 와이드 문자를 유형별로 분류하거나 대소문자를 변환하는 데 사용되는 함수 집합을 정의합니다.

3개의 헤더 파일(complex.h,stdatomic.h,그리고.threads.h)는, 실장에서는 서포트할 필요가 없는 조건부 기능입니다.

POSIX 표준은 Unix 고유의 기능을 위해 몇 가지 비표준 C 헤더를 추가했습니다.많은 것들이 다른 아키텍처로 옮겨가고 있습니다.예를 들면 다음과 같습니다.fcntl.h그리고.unistd.h다른 많은 그룹이 다른 비표준 헤더를 사용하고 있습니다.GNU C 라이브러리에는alloca.hHP OpenVMS에는va_count()기능.

문서

Unix와 유사한 시스템에서는 실제로 구현된 API의 권위 있는 문서가 man page 형태로 제공됩니다.대부분의 시스템에서 표준 라이브러리 기능에 대한 man 페이지는 섹션 3에 있습니다. 섹션 7은 기본 개념에 대한 몇 가지 일반적인 페이지를 포함할 수 있습니다(예:man 7 math_error를 참조해 주세요).

실장

Unix와 같은 시스템은 일반적으로 공유 라이브러리 형식의 C 라이브러리를 가지고 있지만 헤더 파일(및 컴파일러 툴 체인)이 설치에 존재하지 않기 때문에 C 개발이 불가능할 수 있습니다.C 라이브러리는 Unix 계열 시스템에서 운영 체제의 일부로 간주됩니다.ISO C 표준 기능을 포함한 C 기능은 프로그램에 의해 널리 사용되고 있으며, C 언어로 구현되었을 뿐만 아니라 운영 체제인터페이스의 사실상의 일부인 것으로 간주됩니다.일반적으로 Unix와 유사한 운영체제는 C 라이브러리가 지워지면 작동하지 않습니다.이는 정적으로 링크되는 애플리케이션이 아니라 동적으로 링크되는 애플리케이션에 적용됩니다.게다가 커널 자체는 (최소한 Linux의 경우) 라이브러리와는 독립적으로 동작합니다.

Microsoft Windows 에서는, 코어 시스템 동적 라이브러리(DLL)에 의해서 Microsoft Visual C++ 컴파일러 v6.0 용 C 표준 라이브러리가 실장됩니다.Microsoft Visual C++ 컴파일러의 새로운 버전의 C 표준 라이브러리는 각 컴파일러에 의해서 개별적으로 제공되며 재배포 가능한 패키지도 제공됩니다.C로 작성된 컴파일된 어플리케이션은 타깃시스템에 존재하는 것이 아니라 C 라이브러리와 정적으로 링크되거나 이들 어플리케이션과 함께 출하되는 라이브러리의 동적 버전에 링크됩니다.컴파일러의 C 라이브러리의 함수는 Microsoft Windows에 대한 인터페이스로 간주되지 않습니다.

그 밖에도 다양한 운영 체제와 C 컴파일러가 탑재되어 있는 실장이 있습니다.일반적인 실장은 다음과 같습니다.

컴파일러 내장 함수

일부 컴파일러([7] 들어 GCC)는 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()입력 길이 체크(임의 또는 쉬운)가 없는 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 표준 라이브러리의 함수 오류 처리는 일관성이 없고 혼란스러울 수 있습니다.리눅스 설명서 페이지에 따라math_error"glibc의 현재 (버전 2.8) 상황은 엉망입니다.대부분의 (전부는 아니지만) 함수는 오류에 대한 예외를 발생시킵니다.errno를 설정하는 것도 있습니다.몇 가지 함수가 errno를 설정하지만 예외를 발생시키지 않습니다.어느 쪽도 [16]할 수 없는 기능은 극히 적습니다.

표준화

원래 C 언어COBOL이나 [citation needed]Fortran과 같은 기존 언어와 달리 I/O 작업과 같은 내장 기능을 제공하지 않았습니다.시간이 지남에 따라 C의 사용자 커뮤니티는 현재 C 표준 라이브러리로 불리는 아이디어와 구현을 공유했습니다.이 아이디어들 중 많은 것들이 결국 표준화된 C 언어의 정의에 통합되었다.

Unix와 C는 모두 1960년대 후반과 1970년대 초에 AT&T의 Bell Laboratories에서 만들어졌습니다.1970년대에 C언어는 점점 더 대중화 되었다.많은 대학과 단체들은 자신들의 프로젝트를 위해 그들만의 언어 변형을 만들기 시작했습니다.1980년대 초에 다양한 C 구현 간의 호환성 문제가 명백해졌다.1983년 미국 국립 표준 협회(ANSI)는 "ANSI C"로 알려진 C의 표준 규격을 제정하기 위한 위원회를 구성했습니다.이 작업은 1989년에 소위 C89 표준이 만들어지게 되었습니다.결과적으로 만들어진 표준의 일부는 ANSI C 표준 라이브러리라고 불리는 소프트웨어 라이브러리 세트였다.

POSIX 표준 라이브러리

POSIXSUS는 기본 C 표준 라이브러리의 루틴 이상에서 사용할 수 있는 루틴의 수를 지정합니다.POSIX 사양에는 멀티스레딩, 네트워킹정규 표현용 헤더 파일이 포함되어 있습니다.이것들은, C표준 라이브러리 기능과 함께 실장되는 경우가 많아, 근접도가 다릅니다.예를 들어 glibc는 다음과 같은 기능을 구현합니다.fork이내에libc.so단, NPTL이 glibc로 Marge되기 에는 독자적인 링커플래그 인수를 사용하여 별도의 라이브러리를 구성했습니다.이 POSIX 지정 기능은 라이브러리의 일부로 간주되는 경우가 많습니다.기본 C 라이브러리는 ANSI 또는 ISO C 라이브러리로 식별될 수 있습니다.

BSD libc

BSD libcFreeBSD, NetBSD, OpenBSD, macOS 등의 BSD 운영체제포함된 C 라이브러리에서 지원되는 POSIX 표준 라이브러리의 슈퍼셋입니다.BSD libc에는 최초 표준에서 정의되지 않은 일부 확장이 있으며, 그 중 많은 부분이 1994년 4.4에 처음 등장했다.BSD 릴리스(1989년 첫 번째 표준이 발표된 후 주로 개발된 최초의 릴리스).BSD libc의 확장 기능에는 다음과 같은 것이 있습니다.

다른 언어의 C 표준 라이브러리

일부 언어에는 표준 C 라이브러리의 기능이 자체 라이브러리에 포함되어 있습니다.라이브러리는 언어 구조에 더 잘 맞게 조정될 수 있지만, 운영 의미론은 비슷하게 유지됩니다.를 들어 C++ 언어는 네임스페이스에 C 표준 라이브러리의 기능을 포함합니다. std(예:std::printf,std::atoi,std::feofC와 유사한 이름의 헤더 파일(cstdio,cmath,cstdlib등).비슷한 접근방식을 취하는 다른 언어로는 D, Perl, Ruby와 CPython으로 알려진 Python의 주요 구현이 있다.예를 들어 Python 2에서는 내장 파일 오브젝트는 "C를 사용하여 구현됨"으로 정의됩니다.stdio패키지"[38]를 사용하여 사용 가능한 작업(열림, 읽기, 쓰기 등)이 대응하는 C 기능과 동일한 동작을 가질 것으로 예상됩니다.에는 libc라는 상자가 있어 여러 C 함수, 구조 및 기타 유형 정의를 사용할 [39]수 있습니다.

다른 언어의 표준 라이브러리와의 비교

C 표준 라이브러리는 일부 다른 언어의 표준 라이브러리에 비해 작습니다.C 라이브러리는 수학 함수, 문자열 조작, 유형 변환 및 파일 및 콘솔 기반 I/O의 기본 세트를 제공합니다.C++ Standard Template Library와 같은 표준 "컨테이너 타입"은 포함되어 있지 않습니다.GUI 툴킷, 네트워킹툴, Java 및 기타 풍부한 기능은 말할 것도 없습니다.NET Framework는 표준으로 제공됩니다.스몰 스탠다드 라이브러리의 주된 장점은 동작하는 ISO C 환경을 다른 언어보다 훨씬 쉽게 제공할 수 있으며, 그 결과 C를 새로운 플랫폼으로 이식하는 것이 비교적 용이하다는 것입니다.

「 」를 참조해 주세요.

메모들

  1. ^ 잘 알려진 취약점을 이용하는 모리스 웜gets()이미 1988년에 만들어졌습니다.
  2. ^ C 표준 라이브러리에서 문자열 길이 계산과 문자열 끝을 찾는 것은 선형적인 시간 복잡성을 가지며 동일하거나 관련된 문자열에 반복적으로 사용될 때 비효율적이다.

레퍼런스

  1. ^ ISO/IEC (2018)ISO/IEC 9899: 2018 (E): 프로그래밍 언어 - C 7 7
  2. ^ "The GNU C Library – Introduction". gnu.org. Retrieved 2013-12-05.
  3. ^ "Difference between C standard library and C POSIX library". stackoverflow.com. 2012. Retrieved 2015-03-04.
  4. ^ "C Standards". Keil. Retrieved 24 November 2011.
  5. ^ "Re: Does Newlib support mmu-less CPUs?". Cygwin.com. 23 March 2006. Archived from the original on 22 November 2008. Retrieved 28 October 2011.
  6. ^ "musl libc". Etalabs.net. Retrieved 28 October 2011.
  7. ^ GCC, GCC 매뉴얼에서 제공하는 기타 내장 기능
  8. ^ "Compiling with cc". Retrieved 2013-03-02.
  9. ^ Weimer, Florian. "c - What functions is the libm intended for?". Stack Overflow. Retrieved 24 February 2021.
  10. ^ "c99 - compile standard C programs". The Open Group Base Specifications Issue 7, 2018 edition. The Open Group. Retrieved 24 February 2021.
  11. ^ "musl FAQ". www.musl-libc.org. Retrieved 24 February 2021.
  12. ^ "ISO/IEC TR 24731-1: Extensions to the C Library, Part I: Bounds-checking interfaces" (PDF). open-std.org. 2007-03-28. Retrieved 2014-03-13.
  13. ^ "ISO/IEC WDTR 24731-2: Extensions to the C Library, Part II: Dynamic Allocation Functions" (PDF). open-std.org. 2008-08-10. Retrieved 2014-03-13.
  14. ^ C 코드에서 TR 24731 '안전' 기능을 사용합니까? - 스택 오버플로
  15. ^ "Austin Group Review of ISO/IEC WDTR 24731". Retrieved 28 October 2011.
  16. ^ "math_error - detecting errors from mathematical functions". man7.org. 2008-08-11. Retrieved 2014-03-13.
  17. ^ "tree". Man.freebsd.org. 2007-12-27. Retrieved 2013-08-25.
  18. ^ "Super User's BSD Cross Reference: /OpenBSD/sys/sys/tree.h". bxr.su.
  19. ^ "queue". Man.freebsd.org. 2011-05-13. Retrieved 2013-08-25.
  20. ^ "Super User's BSD Cross Reference: /OpenBSD/sys/sys/queue.h". bxr.su.
  21. ^ "fgetln". Man.freebsd.org. 1994-04-19. Retrieved 2013-08-25.
  22. ^ "Super User's BSD Cross Reference: /OpenBSD/lib/libc/stdio/fgetln.c". bxr.su.
  23. ^ "Super User's BSD Cross Reference: /OpenBSD/include/stdio.h". bxr.su.
  24. ^ "fts". Man.freebsd.org. 2012-03-18. Retrieved 2013-08-25.
  25. ^ "Super User's BSD Cross Reference: /OpenBSD/include/fts.h". bxr.su.
  26. ^ "db". Man.freebsd.org. 2010-09-10. Retrieved 2013-08-25.
  27. ^ "Super User's BSD Cross Reference: /OpenBSD/include/db.h". bxr.su.
  28. ^ Miller, Todd C. 및 Theo de Raadt. strlcpystrlcat - 일관성 있고 안전하며 스트링 복사연결.1999 USENIX 연차 기술 회의의 진행, 1999년 6월 6일-11일, 페이지 175-178.
  29. ^ "Super User's BSD Cross Reference: /OpenBSD/lib/libc/string/strlcat.c". bxr.su.
  30. ^ "Super User's BSD Cross Reference: /OpenBSD/lib/libc/string/strlcpy.c". bxr.su.
  31. ^ "Super User's BSD Cross Reference: /OpenBSD/lib/libc/string/strncat.c". bxr.su.
  32. ^ "Super User's BSD Cross Reference: /OpenBSD/lib/libc/string/strncpy.c". bxr.su.
  33. ^ "err". Man.freebsd.org. 2012-03-29. Retrieved 2013-08-25.
  34. ^ "Super User's BSD Cross Reference: /OpenBSD/include/err.h". bxr.su.
  35. ^ "vis(3)". Man.FreeBSD.org. Retrieved 14 September 2013.
  36. ^ "Super User's BSD Cross Reference: /OpenBSD/lib/libc/gen/vis.c". bxr.su.
  37. ^ "Super User's BSD Cross Reference: /OpenBSD/include/vis.h". bxr.su.
  38. ^ "The Python Standard Library: 6.9. File Objects". Docs.python.org. Retrieved 28 October 2011.
  39. ^ "libc". Rust Crates. Archived from the original on 18 August 2016. Retrieved 31 July 2016.

추가 정보

외부 링크