stringtranslate.com

biblioteca estándar C

La biblioteca estándar C o libc es la biblioteca estándar para el lenguaje de programación C , tal y como se especifica en el estándar ISO C. [1] A partir del estándar ANSI C original , se desarrolló al mismo tiempo que la especificación POSIX de la biblioteca C , que es un superconjunto del mismo. [2] [3] Dado que ANSI C fue adoptado por la Organización Internacional de Normalización , [4] la biblioteca estándar C también se llama biblioteca ISO C.

La biblioteca estándar C proporciona macros , definiciones de tipos y funciones para tareas como manejo de cadenas , cálculos matemáticos, procesamiento de entrada/salida, administración de memoria y varios otros servicios del sistema operativo .

Interfaz de programación de aplicaciones (API)

Archivos de encabezado

La interfaz de programación de aplicaciones (API) de la biblioteca estándar C se declara en varios archivos de encabezado . Cada archivo de encabezado contiene una o más declaraciones de funciones, definiciones de tipos de datos y macros.

Después de un largo período de estabilidad, se agregaron tres nuevos archivos de encabezado ( , y ) con iso646.hel wchar.hAnexo Normativo 1 (NA1), una adición al Estándar C ratificado en 1995. Se agregaron seis archivos de encabezado más ( ,,,,, y ) con C99 , una revisión del estándar C publicada en 1999, y cinco archivos más ( ,,, y ) con C11 en 2011. En total, ahora hay 29 archivos de encabezado:wctype.hcomplex.hfenv.hinttypes.hstdbool.hstdint.htgmath.hstdalign.hstdatomic.hstdnoreturn.hthreads.huchar.h

Tres de los archivos de encabezado ( complex.h, stdatomic.hy threads.h) son características condicionales que no es necesario que las implementaciones admitan.

El estándar POSIX agregó varios encabezados C no estándar para funciones específicas de Unix. Muchos han encontrado su camino hacia otras arquitecturas. Los ejemplos incluyen fcntl.hy unistd.h. Varios otros grupos están utilizando otros encabezados no estándar: la biblioteca GNU C tiene alloca.hy OpenVMS tiene la va_count()función.

Documentación

En sistemas tipo Unix, la documentación autorizada de la API se proporciona en forma de páginas de manual . En la mayoría de los sistemas, las páginas de manual sobre funciones de biblioteca estándar se encuentran en la sección 3; La sección 7 puede contener algunas páginas más genéricas sobre conceptos subyacentes (por ejemplo, man 7 math_erroren Linux ).

Implementaciones

Los sistemas tipo Unix normalmente tienen una biblioteca C en forma de biblioteca compartida , pero los archivos de encabezado (y la cadena de herramientas del compilador) pueden estar ausentes en una instalación, por lo que el desarrollo en C puede no ser posible. La biblioteca C se considera parte del sistema operativo en sistemas tipo Unix; Además de las funciones especificadas por el estándar C, incluye otras funciones que forman parte de la API del sistema operativo, como las funciones especificadas en el estándar POSIX . Las funciones de la biblioteca C, incluidas las del estándar ISO C, son ampliamente utilizadas por los programas y se consideran como si no sólo fueran una implementación de algo en el lenguaje C, sino también parte de facto de la interfaz del sistema operativo. Los sistemas operativos tipo Unix generalmente no pueden funcionar si se borra la biblioteca C. Esto es cierto para aplicaciones que están vinculadas dinámicamente en lugar de estáticamente. Además, el propio núcleo (al menos en el caso de Linux) funciona independientemente de cualquier biblioteca.

En Microsoft Windows, las bibliotecas dinámicas del sistema central ( DLL ) proporcionan una implementación de la biblioteca estándar C para el compilador Microsoft Visual C++ v6.0; La biblioteca estándar C para las versiones más recientes del compilador Microsoft Visual C++ la proporciona cada compilador individualmente, así como paquetes redistribuibles . Las aplicaciones compiladas escritas en C están vinculadas estáticamente a una biblioteca de C o a una versión dinámica de la biblioteca que se envía con estas aplicaciones, en lugar de depender de su presencia en los sistemas de destino. Las funciones de la biblioteca C de un compilador no se consideran interfaces para Microsoft Windows.

Existen muchas implementaciones de bibliotecas de C, provistas de varios sistemas operativos y compiladores de C. Algunas de las implementaciones populares son las siguientes:

Funciones integradas del compilador

Algunos compiladores (por ejemplo, GCC [7] ) proporcionan versiones integradas de muchas de las funciones de la biblioteca estándar de C; es decir, las implementaciones de las funciones se escriben en el archivo objeto compilado y el programa llama a las versiones integradas en lugar de a las funciones en el archivo objeto compartido de la biblioteca C. Esto reduce la sobrecarga de llamadas a funciones, especialmente si las llamadas a funciones se reemplazan con variantes en línea , y permite otras formas de optimización (ya que el compilador conoce las características de flujo de control de las variantes integradas), pero puede causar confusión al depurar (por ejemplo , las versiones integradas no se pueden sustituir por variantes instrumentadas ).

Sin embargo, las funciones integradas deben comportarse como funciones ordinarias de acuerdo con ISO C. La principal implicación es que el programa debe poder crear un puntero a estas funciones tomando su dirección e invocar la función mediante ese puntero. Si dos punteros a la misma función se derivan en dos unidades de traducción diferentes en el programa, estos dos punteros deben compararse iguales; es decir, la dirección se obtiene resolviendo el nombre de la función, que tiene un vínculo externo (para todo el programa).

Enlace, libm

En FreeBSD [8] y glibc, [9] algunas funciones como sin() no están vinculadas de forma predeterminada y, en cambio, están incluidas en la biblioteca matemática libm . Si se utiliza alguno de ellos, se debe dar la directiva al enlazador -lm. POSIX requiere que el compilador c99 admita -lmy que las funciones declaradas en los encabezados math.h, complex.hy fenv.hestén disponibles para vincularse si -lmse especifica, pero no especifica si las funciones están vinculadas de forma predeterminada. [10] musl satisface este requisito poniendo todo en una única biblioteca libc y proporcionando una libm vacía. [11]

Detección

Según el estándar C, la macro __STDC_HOSTED__se definirá en 1 si la implementación está alojada. Una implementación alojada tiene todos los encabezados especificados por el estándar C. Una implementación también puede ser independiente, lo que significa que estos encabezados no estarán presentes. Si una implementación es independiente , se definirá __STDC_HOSTED__en 0 .

Problemas y soluciones

Vulnerabilidades de desbordamiento de búfer

Algunas funciones de la biblioteca estándar de C han sido conocidas por tener vulnerabilidades de desbordamiento del búfer y, en general, fomentar la programación con errores desde su adopción. [a] Los ítems más criticados son:

Excepto en el caso extremo de gets(), todas las vulnerabilidades de seguridad se pueden evitar introduciendo código auxiliar para realizar gestión de memoria, verificación de límites, verificación de entradas, etc. Esto a menudo se hace en forma de contenedores que hacen que las funciones de biblioteca estándar sean más seguras y fáciles de usar. Esto se remonta al libro The Practice of Programming de B. Kernighan y R. Pike, donde los autores suelen utilizar envoltorios que imprimen mensajes de error y cierran el programa si se produce un error.

El comité ISO C publicó los informes técnicos TR 24731-1 [12] y está trabajando en TR 24731-2 [13] para proponer la adopción de algunas funciones con verificación de límites y asignación automática de buffer, respectivamente. El primero ha recibido severas críticas y algunos elogios, [14] [15] el segundo recibió respuestas mixtas. A pesar de esto, TR 24731-1 se ha implementado en la biblioteca estándar C de Microsoft y su compilador emite advertencias cuando se utilizan funciones antiguas "inseguras".

Problemas de subprocesos, vulnerabilidad a las condiciones de carrera.

La strerror()rutina es criticada por ser insegura y vulnerable a las condiciones de carrera .

Manejo de errores

El tratamiento de errores de las funciones de la biblioteca estándar de C no es coherente y, a veces, confuso. Según la página del manual de Linux math_error, "La situación actual (versión 2.8) bajo glibc es complicada. La mayoría de las funciones (pero no todas) generan excepciones en caso de errores. Algunas también configuran errno . Algunas funciones configuran errno , pero no generan una excepción. Muy pocas funciones no hacen ninguna de las dos cosas." [dieciséis]

Estandarización

El lenguaje C original no proporcionaba funciones integradas como operaciones de E/S, a diferencia de los lenguajes tradicionales como COBOL y Fortran . [ cita necesaria ] Con el tiempo, las comunidades de usuarios de C compartieron ideas e implementaciones de lo que ahora se llama bibliotecas estándar de C. Muchas de estas ideas finalmente se incorporaron a la definición del lenguaje C estandarizado.

Tanto Unix como C fueron creados en los Laboratorios Bell de AT&T a finales de los años 1960 y principios de los 1970. Durante la década de 1970, el lenguaje C se hizo cada vez más popular. Muchas universidades y organizaciones comenzaron a crear sus propias variantes del idioma para sus propios proyectos. A principios de la década de 1980 se hicieron evidentes los problemas de compatibilidad entre las distintas implementaciones de C. En 1983, el Instituto Nacional Estadounidense de Estándares (ANSI) formó un comité para establecer una especificación estándar de C conocida como " ANSI C ". Este trabajo culminó con la creación del llamado estándar C89 en 1989. Parte del estándar resultante fue un conjunto de bibliotecas de software llamado biblioteca estándar ANSI C.

Biblioteca estándar POSIX

POSIX , así como SUS , especifican una serie de rutinas que deberían estar disponibles además de las de la biblioteca estándar básica de C. La especificación POSIX incluye archivos de encabezado para, entre otros usos, subprocesos múltiples , redes y expresiones regulares . A menudo se implementan junto con la funcionalidad de la biblioteca estándar de C, con distintos grados de similitud. Por ejemplo, glibc implementa funciones como forkinside libc.so, pero antes de que NPTL se fusionara con glibc, constituía una biblioteca separada con su propio argumento de indicador de enlazador. A menudo, esta funcionalidad especificada por POSIX se considerará parte de la biblioteca; la biblioteca C básica puede identificarse como biblioteca ANSI o ISO C.

biblioteca BSD

BSD libc es un superconjunto de la biblioteca estándar POSIX compatible con las bibliotecas C incluidas con los sistemas operativos BSD como FreeBSD , NetBSD , OpenBSD y macOS . BSD libc tiene algunas extensiones que no están definidas en el estándar original, muchas de las cuales aparecieron por primera vez en la versión 4.4BSD de 1994 (la primera que se desarrolló en gran medida después de que se publicara el primer estándar en 1989). Algunas de las extensiones de BSD libc son:

La biblioteca estándar C en otros idiomas

Algunos lenguajes incluyen la funcionalidad de la biblioteca C estándar en sus propias bibliotecas. La biblioteca puede adaptarse para adaptarse mejor a la estructura del lenguaje, pero la semántica operativa se mantiene similar. El lenguaje C++ , por ejemplo, incluye la funcionalidad de la biblioteca estándar de C en el espacio de nombres std (p. ej., std::printf, std::atoi, std::feof), en archivos de cabecera con nombres similares a los de C ( cstdio, cmath, cstdlib, etc.). Otros lenguajes que adoptan enfoques similares son D , Perl , Ruby y la implementación principal de Python conocida como CPython . En Python 2, por ejemplo, los objetos de archivo integrados se definen como "implementados usando el stdiopaquete C", [38] de modo que se espera que las operaciones disponibles (abrir, leer, escribir, etc.) tengan el mismo comportamiento que las operaciones disponibles (abrir, leer, escribir, etc.). funciones C correspondientes. Rust tiene una caja llamada libc que permite utilizar varias funciones, estructuras y otras definiciones de tipos de C. [39]

Comparación con bibliotecas estándar de otros idiomas

La biblioteca estándar de C es pequeña en comparación con las bibliotecas estándar de otros lenguajes. La biblioteca C proporciona un conjunto básico de funciones matemáticas, manipulación de cadenas, conversiones de tipos y E/S basadas en archivos y consola. No incluye un conjunto estándar de " tipos de contenedores " como la Biblioteca de plantillas estándar de C++ , y mucho menos los kits completos de herramientas de interfaz gráfica de usuario (GUI), herramientas de red y la profusión de otras funciones que Java y .NET Framework proporcionan como estándar. La principal ventaja de la pequeña biblioteca estándar es que proporcionar un entorno ISO C funcional es mucho más fácil que con otros lenguajes y, en consecuencia, portar C a una nueva plataforma es comparativamente fácil.

Ver también

Notas

  1. ^ El gusano Morris que aprovecha la conocida vulnerabilidad se gets()creó ya en 1988.
  2. ^ en la biblioteca estándar de C, el cálculo de la longitud de una cadena y la búsqueda del final de una cadena tienen complejidades de tiempo lineal y son ineficientes cuando se usan repetidamente en la misma cadena o en cadenas relacionadas

Referencias

  1. ^ ISO / IEC (2018). ISO/IEC 9899:2018(E): Lenguajes de programación - C §7
  2. ^ "La biblioteca GNU C - Introducción". gnu.org . Consultado el 5 de diciembre de 2013 .
  3. ^ "Diferencia entre la biblioteca estándar C y la biblioteca C POSIX". stackoverflow.com . 2012 . Consultado el 4 de marzo de 2015 .
  4. ^ "Estándares C". C : Estándares C. Keil . Consultado el 24 de noviembre de 2011 .
  5. ^ "Re: ¿Newlib admite CPU sin mmu?". Cygwin.com. 23 de marzo de 2006. Archivado desde el original el 22 de noviembre de 2008 . Consultado el 28 de octubre de 2011 .
  6. ^ "libc mus". Etalabs.net . Consultado el 28 de octubre de 2011 .
  7. ^ Otras funciones integradas proporcionadas por GCC, Manual de GCC
  8. ^ "Compilando con cc" . Consultado el 2 de marzo de 2013 .
  9. ^ Weimer, Florián. "c - ¿Para qué funciones está destinado el libm?". Desbordamiento de pila . Consultado el 24 de febrero de 2021 .
  10. ^ "c99: compila programas C estándar". Especificaciones básicas de Open Group Número 7, edición de 2018 . El grupo abierto . Consultado el 24 de febrero de 2021 .
  11. ^ "Preguntas frecuentes sobre musl". www.musl-libc.org . Consultado el 24 de febrero de 2021 .
  12. ^ "ISO/IEC TR 24731-1: Extensiones de la biblioteca C, Parte I: Interfaces de verificación de límites" (PDF) . open-std.org. 2007-03-28 . Consultado el 13 de marzo de 2014 .
  13. ^ "ISO/IEC WDTR 24731-2: Extensiones de la biblioteca C, Parte II: Funciones de asignación dinámica" (PDF) . open-std.org. 2008-08-10 . Consultado el 13 de marzo de 2014 .
  14. ^ ¿ Utiliza las funciones 'seguras' TR 24731 en su código C? - Desbordamiento de pila
  15. ^ "Revisión del Grupo Austin de ISO/IEC WDTR 24731" . Consultado el 28 de octubre de 2011 .
  16. ^ "math_error: detección de errores en funciones matemáticas". man7.org . 2008-08-11 . Consultado el 13 de marzo de 2014 .
  17. ^ "árbol". Man.freebsd.org . 2007-12-27 . Consultado el 25 de agosto de 2013 .
  18. ^ "Referencia cruzada BSD del superusuario: /OpenBSD/sys/sys/tree.h". bxr.su.
  19. ^ "cola". Man.freebsd.org . 2011-05-13 . Consultado el 25 de agosto de 2013 .
  20. ^ "Referencia cruzada BSD del superusuario: /OpenBSD/sys/sys/queue.h". bxr.su.
  21. ^ "fgetln". Man.freebsd.org . 1994-04-19 . Consultado el 25 de agosto de 2013 .
  22. ^ "Referencia cruzada de BSD del superusuario: /OpenBSD/lib/libc/stdio/fgetln.c". bxr.su.
  23. ^ "Referencia cruzada de BSD del superusuario: /OpenBSD/include/stdio.h". bxr.su.
  24. ^ "pies". Man.freebsd.org . 2012-03-18 . Consultado el 25 de agosto de 2013 .
  25. ^ "Referencia cruzada BSD del superusuario: /OpenBSD/include/fts.h". bxr.su.
  26. ^ "base de datos". Man.freebsd.org . 2010-09-10 . Consultado el 25 de agosto de 2013 .
  27. ^ "Referencia cruzada BSD del superusuario: /OpenBSD/include/db.h". bxr.su.
  28. ^ Miller, Todd C. y Theo de Raadt. strlcpy y strlcat: copia y concatenación de cadenas consistentes y seguras. Actas de la Conferencia técnica anual de USENIX de 1999, 6 al 11 de junio de 1999, págs. 175-178.
  29. ^ "Referencia cruzada de BSD del superusuario: /OpenBSD/lib/libc/string/strlcat.c". bxr.su.
  30. ^ "Referencia cruzada de BSD del superusuario: /OpenBSD/lib/libc/string/strlcpy.c". bxr.su.
  31. ^ "Referencia cruzada de BSD del superusuario: /OpenBSD/lib/libc/string/strncat.c". bxr.su.
  32. ^ "Referencia cruzada de BSD del superusuario: /OpenBSD/lib/libc/string/strncpy.c". bxr.su.
  33. ^ "errar". Man.freebsd.org . 29 de marzo de 2012 . Consultado el 25 de agosto de 2013 .
  34. ^ "Referencia cruzada de BSD del superusuario: /OpenBSD/include/err.h". bxr.su.
  35. ^ "vis(3)". Man.FreeBSD.org . Consultado el 14 de septiembre de 2013 .
  36. ^ "Referencia cruzada de BSD del superusuario: /OpenBSD/lib/libc/gen/vis.c". bxr.su.
  37. ^ "Referencia cruzada BSD del superusuario: /OpenBSD/include/vis.h". bxr.su.
  38. ^ "La biblioteca estándar de Python: 6.9. Objetos de archivo". Docs.python.org . Consultado el 28 de octubre de 2011 .
  39. ^ "libc". Cajas de óxido . Archivado desde el original el 18 de agosto de 2016 . Consultado el 31 de julio de 2016 .

Otras lecturas

enlaces externos