stringtranslate.com

Manejo de cuerdas C

El lenguaje de programación C tiene un conjunto de funciones que implementan operaciones sobre cadenas (cadenas de caracteres y cadenas de bytes) en su biblioteca estándar . Se admiten varias operaciones, como copia, concatenación , tokenización y búsqueda. Para las cadenas de caracteres, la biblioteca estándar utiliza la convención de que las cadenas terminan en nulo : una cadena de n caracteres se representa como una matriz de n + 1 elementos, el último de los cuales es un " carácter NUL " con valor numérico 0.

El único soporte para cadenas en el lenguaje de programación propiamente dicho es que el compilador traduce constantes de cadena entrecomilladas en cadenas terminadas en nulo.

Definiciones

Una cadena se define como una secuencia contigua de unidades de código terminada por la primera unidad de código cero (a menudo denominada unidad de código NUL ). [1] Esto significa que una cadena no puede contener la unidad de código cero, ya que la primera que se ve marca el final de la cadena. La longitud de una cadena es el número de unidades de código antes de la unidad de código cero. [1] La memoria ocupada por una cadena es siempre una unidad de código más que la longitud, ya que se necesita espacio para almacenar el terminador cero.

Generalmente, el término cadena significa una cadena donde la unidad de código es de tipo char, que es exactamente de 8 bits en todas las máquinas modernas. C90 define cadenas anchas [1] que utilizan una unidad de código de tipo wchar_t, que es de 16 o 32 bits en las máquinas modernas. Esto estaba pensado para Unicode , pero cada vez es más común utilizar UTF-8 en cadenas normales para Unicode.

Las cadenas se pasan a funciones pasando un puntero a la primera unidad de código. Dado que char*y wchar_t*son tipos diferentes, las funciones que procesan cadenas anchas son diferentes a las que procesan cadenas normales y tienen nombres diferentes.

Los literales de cadena ( "text"en el código fuente C) se convierten en matrices durante la compilación. [2] El resultado es una matriz de unidades de código que contiene todos los caracteres más una unidad de código de cero al final. En C90 L"text"produce una cuerda ancha. Un literal de cadena puede contener la unidad de código cero (una forma es colocarlo \0en la fuente), pero esto hará que la cadena termine en ese punto. El resto del literal se colocará en la memoria (con otra unidad de código cero agregada al final) pero es imposible saber que esas unidades de código fueron traducidas del literal de cadena, por lo tanto, dicho código fuente no es un literal de cadena. [3]

Codificaciones de caracteres

Cada cadena termina en la primera aparición de la unidad de código cero del tipo apropiado ( charo wchar_t). En consecuencia, una cadena de bytes ( char*) puede contener caracteres no NUL en ASCII o cualquier extensión ASCII , pero no caracteres en codificaciones como UTF-16 (aunque una unidad de código de 16 bits puede ser distinta de cero, su byte alto o bajo puede ser cero). Las codificaciones que se pueden almacenar en cadenas anchas están definidas por el ancho de wchar_t. En la mayoría de las implementaciones, es de al menos 16 bits, por lo que se pueden almacenar wchar_ttodas las codificaciones de 16 bits, como UCS-2 . Si es de 32 bits, se pueden almacenar wchar_tcodificaciones de 32 bits, como UTF-32 . (El estándar requiere un "tipo que contenga cualquier carácter ancho", lo cual en Windows ya no es válido desde el cambio de UCS-2 a UTF-16. Esto se reconoció como un defecto en el estándar y se corrigió en C++.) [4] C++11 y C11 agregan dos tipos con anchos explícitos char16_ty char32_t. [5]

Las codificaciones de ancho variable se pueden utilizar tanto en cadenas de bytes como en cadenas anchas. La longitud de la cadena y los desplazamientos se miden en bytes o wchar_t, no en "caracteres", lo que puede resultar confuso para los programadores principiantes. UTF-8 y Shift JIS se usan a menudo en cadenas de bytes C, mientras que UTF-16 se usa a menudo en cadenas anchas de C cuando wchar_tson de 16 bits. Truncar cadenas con caracteres de ancho variable usando funciones como strncpypuede producir secuencias no válidas al final de la cadena. Esto puede resultar peligroso si las partes truncadas se interpretan mediante un código que asume que la entrada es válida.

El soporte para literales Unicode como (UTF-8) o (UTF-16 o UTF-32, depende de ) está definido por la implementación, [6] y puede requerir que el código fuente esté en la misma codificación, especialmente cuando los compiladores simplemente Copie lo que esté entre las comillas. Algunos compiladores o editores requerirán ingresar todos los caracteres que no sean ASCII como secuencias para cada byte de UTF-8 y/o para cada palabra de UTF-16. Desde C11 (y C++11), hay disponible un nuevo prefijo literal que garantiza UTF-8 para un literal de cadena de bytes, como en . [7] Desde C++20 y C23 , se agregó un tipo destinado a almacenar caracteres UTF-8 y los tipos de caracteres con prefijo u8 y literales de cadena se cambiaron a y respectivamente.char foo[512] = "φωωβαρ";wchar_t foo[512] = L"φωωβαρ";wchar_tchar\xNN\uNNNNu8char foo[512] = u8"φωωβαρ";char8_tchar8_tchar8_t[]

Características

Terminología

En la documentación histórica, el término "carácter" se usaba a menudo en lugar de "byte" para cadenas C, lo que lleva a muchos [ ¿ quién? ] creer que estas funciones de alguna manera no funcionan para UTF-8 . De hecho, todas las longitudes se definen en bytes y esto es cierto en todas las implementaciones, y estas funciones funcionan tan bien con codificaciones UTF-8 como con codificaciones de un solo byte. La documentación de BSD se ha corregido para dejar esto claro, pero la documentación de POSIX, Linux y Windows todavía usa "carácter" en muchos lugares donde "byte" o "wchar_t" es el término correcto.

Las funciones para manejar buffers de memoria pueden procesar secuencias de bytes que incluyen bytes nulos como parte de los datos. Los nombres de estas funciones suelen comenzar con mem, a diferencia del strprefijo.

Encabezados

La mayoría de las funciones que operan en cadenas C se declaran en el string.hencabezado ( cstringen C++), mientras que las funciones que operan en cadenas amplias de C se declaran en el wchar.hencabezado ( cwcharen C++). Estos encabezados también contienen declaraciones de funciones utilizadas para manejar los buffers de memoria; Por tanto, el nombre es algo inapropiado.

Las funciones declaradas en string.hson extremadamente populares ya que, como parte de la biblioteca estándar de C , se garantiza que funcionan en cualquier plataforma que admita C. Sin embargo, existen algunos problemas de seguridad con estas funciones, como posibles desbordamientos del búfer cuando no se usan cuidadosa y adecuadamente. , lo que hace que los programadores prefieran variantes más seguras y posiblemente menos portátiles, de las cuales algunas populares se enumeran a continuación. Algunas de estas funciones también violan la corrección constante al aceptar un constpuntero de cadena y devolver un no constpuntero dentro de la cadena. Para corregir esto, algunas se han separado en dos funciones sobrecargadas en la versión C++ de la biblioteca estándar.

Constantes y tipos

Funciones

Funciones multibyte

Todas estas funciones necesitan unmbstate_tobjeto, originalmente en la memoria estática (lo que hace que las funciones no sean seguras para subprocesos) y en adiciones posteriores la persona que llama debe mantener. Originalmente, esto estaba destinado a rastrear los estados de cambio en elmegabytecodificaciones, pero las modernas como UTF-8 no lo necesitan. Sin embargo, estas funciones fueron diseñadas bajo el supuesto de que elWCLa codificación no es una codificación de ancho variable y, por lo tanto, está diseñada para tratar exactamente unawchar_ta la vez, pasándolo por valor en lugar de usar un puntero de cadena. Como UTF-16 es una codificación de ancho variable, elmbstate_tse ha reutilizado para realizar un seguimiento de los pares sustitutos en la codificación amplia, aunque la persona que llama aún debe detectar y llamarmbtowcdos veces para un solo carácter. [80] [81] [82] Adiciones posteriores al estándar admiten que la única conversión que interesa a los programadores es entre UTF-8 y UTF-16 y la proporcionan directamente.

Conversiones numéricas

La biblioteca estándar de C contiene varias funciones para conversiones numéricas. Las funciones que tratan con cadenas de bytes se definen en el stdlib.hencabezado ( cstdlibencabezado en C++). Las funciones que tratan con cadenas anchas se definen en el wchar.hencabezado ( cwcharencabezado en C++).

Las funciones strchr, bsearch, strpbrk, strrchr, y sus contrapartes amplias no son constantes correctas , ya que aceptan un strstrpuntero de cadena y devuelven un no puntero dentro de la cadena. Esto se ha solucionado en C23 . [95]memchrconstconst

Además, desde la Enmienda Normativa 1 (C95), atoxxlas funciones se consideran subsumidas por strtoxxxfunciones, por lo que ni C95 ni ninguna norma posterior proporciona versiones de caracteres amplios de estas funciones. El argumento en contra atoxxes que no diferencian entre un error y un 0. [96]

Extensiones populares

Reemplazos

A pesar de la necesidad bien establecida de reemplazar strcat[22] y strcpy[18] con funciones que no permitan desbordamientos del buffer, no ha surgido ningún estándar aceptado. Esto se debe en parte a la creencia errónea de muchos programadores de C de que strncaty strncpytienen el comportamiento deseado; sin embargo, ninguna función fue diseñada para esto (estaban destinadas a manipular buffers de cadena de tamaño fijo con relleno nulo, un formato de datos menos comúnmente usado en el software moderno), y el comportamiento y los argumentos no son intuitivos y a menudo están escritos incorrectamente incluso por expertos. programadores. [108]

El reemplazo [a] más popular son las funciones strlcaty strlcpy, que aparecieron en OpenBSD 2.4 en diciembre de 1998. [108] Estas funciones siempre escriben un NUL en el búfer de destino, truncando el resultado si es necesario, y devuelven el tamaño del búfer que será necesario, lo que permite la detección del truncamiento y proporciona un tamaño para crear un nuevo búfer que no se truncará. Han sido criticados por supuestamente ser ineficientes, [111] alentar el uso de cadenas C (en lugar de alguna forma alternativa superior de cadena), [112] [113] y ocultar otros errores potenciales. [114] [115] En consecuencia, durante años, no se han incluido en la biblioteca GNU C (utilizada por el software en Linux), aunque eso sí se cambió. Las preguntas frecuentes de glibc Wiki sobre la inclusión de strlc{py|at} señalan que a partir de glibc 2.3.8, el código se confirmó [116] y, por lo tanto, se agregó. [117] El anuncio de disponibilidad de glibc 2.38 citó que las funciones "se espera que se agreguen a una futura versión POSIX". (El Austin Group Defect Tracker, ID 986 rastreó algunas discusiones sobre dichos planes para POSIX). Incluso si glibc no había agregado soporte, strlcat y strlcpy se han implementado en varias otras bibliotecas C, incluidas las de OpenBSD, FreeBSD , NetBSD , Solaris , OS X y QNX , así como en bibliotecas C alternativas para Linux, como libbsd, introducida en 2008, [118] y musl , introducida en 2011. [119] [120] La falta de soporte para la biblioteca GNU C había no impidió que varios autores de software lo usaran y empaquetaran un reemplazo, entre otros SDL , GLib , ffmpeg , rsync e incluso internamente en el kernel de Linux . Hay disponibles implementaciones de código abierto para estas funciones. [121] [122]

A veces se utilizan memcpy[53] o memmove[55] , ya que pueden ser más eficientes que strcpysi no verifican repetidamente NUL (esto es menos cierto en los procesadores modernos). Dado que necesitan una longitud de búfer como parámetro, la configuración correcta de este parámetro puede evitar desbordamientos de búfer.

Como parte de su Ciclo de vida de desarrollo de seguridad de 2004 , Microsoft introdujo una familia de funciones "seguras" que incluyen strcpy_sy strcat_s(junto con muchas otras). [123] Estas funciones se estandarizaron con algunos cambios menores como parte del C11 opcional (Anexo K) propuesto por ISO/IEC WDTR 24731. Estas funciones realizan varias comprobaciones, incluso si la cadena es demasiado larga para caber en el búfer. Si las comprobaciones fallan, se llama a una función de "controlador de restricciones de tiempo de ejecución" especificada por el usuario, [124] que generalmente aborta el programa. [125] [126] Algunas funciones realizan operaciones destructivas antes de llamar al controlador de restricciones de tiempo de ejecución; por ejemplo, strcat_sestablece el destino en la cadena vacía, [127] lo que puede dificultar la recuperación de condiciones de error o su depuración. Estas funciones generaron muchas críticas porque al principio sólo se implementaron en Windows y al mismo tiempo Microsoft Visual C++ comenzó a generar mensajes de advertencia sugiriendo el uso de estas funciones en lugar de las estándar. Algunos han especulado que esto es un intento de Microsoft de encerrar a los desarrolladores en su plataforma. [128] Aunque hay implementaciones de código abierto disponibles de estas funciones, estas funciones no están presentes en las bibliotecas comunes de Unix C. [129] La experiencia con estas funciones ha demostrado problemas importantes con su adopción y errores en el uso, por lo que se propone la eliminación del Anexo K para la próxima revisión del estándar C. [130]memset_s También se ha sugerido el uso de como una forma de evitar optimizaciones no deseadas del compilador. [131] [132]

Ver también

Notas

  1. ^ En GitHub, hay 7.813.206 usos de strlcpy, frente a 38.644 usos strcpy_s(y 15.286.150 usos de strcpy). [ cita necesaria ]

Referencias

  1. ^ abc "El borrador del estándar C99 + TC3" (PDF) . §7.1.1p1 . Consultado el 7 de enero de 2011 .{{cite web}}: Mantenimiento CS1: ubicación ( enlace )
  2. ^ "El borrador del estándar C99 + TC3" (PDF) . §6.4.5p7 . Consultado el 7 de enero de 2011 .{{cite web}}: Mantenimiento CS1: ubicación ( enlace )
  3. ^ "El borrador del estándar C99 + TC3" (PDF) . Sección 6.4.5 nota a pie de página 66 . Consultado el 7 de enero de 2011 .{{cite web}}: Mantenimiento CS1: ubicación ( enlace )
  4. ^ "Relajar los requisitos de wchar_t para que coincidan con las prácticas existentes" (PDF) .
  5. ^ "Tipos fundamentales". es.cppreference.com .
  6. ^ "El borrador del estándar C99 + TC3" (PDF) . §5.1.1.2 Fases de traducción , p1 . Consultado el 23 de diciembre de 2011 .{{cite web}}: Mantenimiento CS1: ubicación ( enlace )
  7. ^ "literales de cadena". es.cppreference.com . Consultado el 23 de diciembre de 2019 .
  8. ^ "c++: ¿para qué sirve wchar_t en la programación general?". Desbordamiento de pila . Consultado el 1 de agosto de 2022 .
  9. ^ "stddef.h - definiciones de tipos estándar". El grupo abierto . Consultado el 28 de enero de 2017 .
  10. ^ Gillam, Richard (2003). Unicode desmitificado: una guía práctica para programadores sobre el estándar de codificación. Profesional de Addison-Wesley. pag. 714.ISBN _ 9780201700527.
  11. ^ "char, wchar_t, char8_t, char16_t, char32_t". docs.microsoft.com . Consultado el 1 de agosto de 2022 .
  12. ^ "char8_t".
  13. ^ ab "<cuchar> (uchar.h)".
  14. ^ "char16_t".
  15. ^ ab "Reemplazo de macros de texto".
  16. ^ ab "Tipos fundamentales".
  17. ^ "char32_t".
  18. ^ ab "strcpy - cppreference.com". En.cppreference.com. 2 de enero de 2014 . Consultado el 6 de marzo de 2014 .
  19. ^ "wcscpy - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  20. ^ "strncpy - cppreference.com". En.cppreference.com. 4 de octubre de 2013 . Consultado el 6 de marzo de 2014 .
  21. ^ "wcsncpy - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  22. ^ ab "strcat - cppreference.com". En.cppreference.com. 8 de octubre de 2013 . Consultado el 6 de marzo de 2014 .
  23. ^ "wcscat - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  24. ^ "strncat - cppreference.com". En.cppreference.com. 1 de julio de 2013 . Consultado el 6 de marzo de 2014 .
  25. ^ "wcsncat - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  26. ^ "strxfrm - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  27. ^ "wcsxfrm - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  28. ^ "strlen - cppreference.com". En.cppreference.com. 27 de diciembre de 2013 . Consultado el 6 de marzo de 2014 .
  29. ^ "wcslen - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  30. ^ "strcmp - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  31. ^ "wcscmp - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  32. ^ "strncmp - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  33. ^ "wcsncmp - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  34. ^ "strcoll - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  35. ^ "wcscoll - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  36. ^ "strchr-cppreference.com". En.cppreference.com. 23 de febrero de 2014 . Consultado el 6 de marzo de 2014 .
  37. ^ "wcschr - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  38. ^ "strrchr-cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  39. ^ "wcsrchr - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  40. ^ "strspn-cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  41. ^ "wcsspn - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  42. ^ "strcspn - cppreference.com". En.cppreference.com. 31 de mayo de 2013 . Consultado el 6 de marzo de 2014 .
  43. ^ "wcscspn - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  44. ^ "strpbrk - cppreference.com". En.cppreference.com. 31 de mayo de 2013 . Consultado el 6 de marzo de 2014 .
  45. ^ "wcspbrk - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  46. ^ "strstr-cppreference.com". En.cppreference.com. 16 de octubre de 2013 . Consultado el 6 de marzo de 2014 .
  47. ^ "wcsstr - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  48. ^ "strtok - cppreference.com". En.cppreference.com. 3 de septiembre de 2013 . Consultado el 6 de marzo de 2014 .
  49. ^ "wcstok - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  50. ^ "strerror - cppreference.com". En.cppreference.com. 31 de mayo de 2013 . Consultado el 6 de marzo de 2014 .
  51. ^ "memset-cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  52. ^ "wmemset-cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  53. ^ ab "memcpy - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  54. ^ "wmemcpy - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  55. ^ ab "memmove - cppreference.com". En.cppreference.com. 25 de enero de 2014 . Consultado el 6 de marzo de 2014 .
  56. ^ "wmemmove - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  57. ^ "memcmp - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  58. ^ "wmemcmp - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  59. ^ "memchr-cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  60. ^ "wmemchr-cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  61. ^ "mblen - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  62. ^ "mbtowc - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  63. ^ "wctomb - cppreference.com". En.cppreference.com. 4 de febrero de 2014 . Consultado el 6 de marzo de 2014 .
  64. ^ "mbstowcs - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  65. ^ "wcstombs - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  66. ^ "btowc - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  67. ^ "wctob-cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  68. ^ "mbsinit-cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  69. ^ "mbrlen - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  70. ^ "mbrtowc - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  71. ^ "wcrtomb - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  72. ^ "mbsrtowcs - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  73. ^ "wcsrtombs - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  74. ^ "mbrtoc8 - cppreference.com". En.cppreference.com.
  75. ^ "c8rtomb - cppreference.com". En.cppreference.com.
  76. ^ "mbrtoc16 - cppreference.com". En.cppreference.com.
  77. ^ "c16rtomb - cppreference.com". En.cppreference.com.
  78. ^ "mbrtoc32 - cppreference.com". En.cppreference.com.
  79. ^ "c23rtomb - cppreference.com". En.cppreference.com.
  80. ^ "6.3.2 Representando el estado de la conversión". La biblioteca GNU C. Consultado el 31 de enero de 2017 .
  81. ^ "raíz/src/multibyte/c16rtomb.c" . Consultado el 31 de enero de 2017 .
  82. ^ "Contenido de /stable/11/lib/libc/locale/c16rtomb.c" . Consultado el 31 de enero de 2017 .
  83. ^ "atof-cppreference.com". En.cppreference.com. 31 de mayo de 2013 . Consultado el 6 de marzo de 2014 .
  84. ^ "atoi, atolón, atolón - cppreference.com". En.cppreference.com. 18 de enero de 2014 . Consultado el 6 de marzo de 2014 .
  85. ^ "strtof, strtod, strtold - cppreference.com". En.cppreference.com. 4 de febrero de 2014 . Consultado el 6 de marzo de 2014 .
  86. ^ "strtof, strtod, strtold - cppreference.com". En.cppreference.com. 4 de febrero de 2014 . Consultado el 6 de marzo de 2014 .
  87. ^ "strtof, strtod, strtold - cppreference.com". En.cppreference.com. 4 de febrero de 2014 . Consultado el 6 de marzo de 2014 .
  88. ^ "wcstof, wcstod, wcstold - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  89. ^ "wcstof, wcstod, wcstold - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  90. ^ "wcstof, wcstod, wcstold - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  91. ^ "strtol, strtoll - cppreference.com". En.cppreference.com. 4 de febrero de 2014 . Consultado el 6 de marzo de 2014 .
  92. ^ "wcstol, wcstoll - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  93. ^ "strtoul, strtoull - cppreference.com". En.cppreference.com. 4 de febrero de 2014 . Consultado el 6 de marzo de 2014 .
  94. ^ "wcstoul, wcstoull - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  95. ^ "WG14-N3020: Funciones de biblioteca estándar que preservan el calificador, v4" (PDF) . open-std.org . 13 de junio de 2022.
  96. ^ Justificación de C99, 7.20.1.1
  97. ^ "bcero". El grupo abierto . Consultado el 27 de noviembre de 2017 .
  98. ^ "bcero(3)". OpenBSD . Consultado el 27 de noviembre de 2017 .
  99. ^ "memccpy". Pubs.opengroup.org . Consultado el 6 de marzo de 2014 .
  100. ^ "mempcpy(3) - página del manual de Linux". Kernel.org . Consultado el 6 de marzo de 2014 .
  101. ^ "strcasecmp(3) - página del manual de Linux". Kernel.org . Consultado el 6 de marzo de 2014 .
  102. ^ "strcat_s, wcscat_s, _mbscat_s". docs.microsoft.com . Consultado el 22 de abril de 2022 .
  103. ^ "strcpy_s, wcscpy_s, _mbscpy_s, _mbscpy_s_l". docs.microsoft.com . Consultado el 22 de abril de 2022 .
  104. ^ "estrdup". Pubs.opengroup.org . Consultado el 6 de marzo de 2014 .
  105. ^ "strerror(3) - página del manual de Linux". man7.org . Consultado el 3 de noviembre de 2019 .
  106. ^ "Cadena | stricmp()". Experto en programación en C.com . Consultado el 6 de marzo de 2014 .
  107. ^ ab "strlcpy, strlcat: copia y concatenación de cadenas de tamaño limitado". OpenBSD . Consultado el 26 de mayo de 2016 .
  108. ^ abcd Todd C. Miller; Theo de Raadt (1999). "strlcpy y strlcat: concatenación y copia de cadenas consistentes y seguras". USENIX '99.
  109. ^ "señal de cadena". Pubs.opengroup.org . Consultado el 6 de marzo de 2014 .
  110. ^ "strok". Pubs.opengroup.org . Consultado el 6 de marzo de 2014 .
  111. ^ Miller, Damien (octubre de 2005). "Portabilidad segura" (PDF) . Consultado el 26 de junio de 2016 . Esta API [strlcpy y strlcat] ha sido adoptada por la mayoría de los sistemas operativos modernos y muchos paquetes de software independientes [...]. La excepción notable es la biblioteca C estándar de GNU, glibc, cuyo mantenedor se niega rotundamente a incluir estas API mejoradas, etiquetándolas como "basura BSD terriblemente ineficiente", a pesar de la evidencia previa de que son más rápidas en la mayoría de los casos que las API que reemplazan.
  112. ^ Lista de correo libc-alpha Archivado el 9 de junio de 2007 en Wayback Machine , mensajes seleccionados del hilo del 8 de agosto de 2000: 53, 60, 61
  113. ^ Los altibajos de strlcpy(); LWN.net
  114. ^ "Agregar strlcpy() a glibc". lwn.net . El manejo correcto de cadenas significa que siempre sabrá cuánto tiempo son sus cadenas y, por lo tanto, puede usar memcpy (en lugar de strcpy).
  115. ^ strlcpy(3)  -  Manual de funciones de la biblioteca de Linux "Sin embargo, uno puede cuestionar la validez de tales optimizaciones, ya que anulan el propósito de strlcpy() y strlcat(). De hecho, la primera versión de esta página del manual se equivocó. "
  116. ^ strlc{py|at} confirmar
  117. ^ [1]
  118. ^ "libbsd" . Consultado el 21 de noviembre de 2022 .
  119. ^ "raíz/src/string/strlcpy.c" . Consultado el 28 de enero de 2017 .
  120. ^ "raíz/src/string/strlcat.c" . Consultado el 28 de enero de 2017 .
  121. ^ Todd C. Miller. "strlcpy.c". Referencia cruzada de BSD .
  122. ^ Todd C. Miller. "strlcat.c". Referencia cruzada de BSD .
  123. ^ Lovell, Martyn. "Rechace los ataques a su código con las bibliotecas Safe C y C++ de Visual Studio 2005" . Consultado el 13 de febrero de 2015 .
  124. ^ "El borrador del estándar C11" (PDF) . §K.3.1.4p2 . Consultado el 13 de febrero de 2013 .{{cite web}}: Mantenimiento CS1: ubicación ( enlace )
  125. ^ "El borrador del estándar C11" (PDF) . §K.3.6.1.1p4 . Consultado el 13 de febrero de 2013 .{{cite web}}: Mantenimiento CS1: ubicación ( enlace )
  126. ^ "Validación de parámetros".
  127. ^ "El borrador del estándar C11" (PDF) . §K.3.7.2.1p4 . Consultado el 13 de febrero de 2013 .{{cite web}}: Mantenimiento CS1: ubicación ( enlace )
  128. ^ Danny Kalev. "Están en eso de nuevo". Informar a TI. Archivado desde el original el 15 de enero de 2012 . Consultado el 10 de noviembre de 2011 .
  129. ^ Biblioteca C segura. "La biblioteca Safe C proporciona memoria de verificación vinculada y funciones de cadena según ISO/IEC TR24731". Fuenteforja . Consultado el 6 de marzo de 2013 .
  130. ^ "Experiencia de campo con el anexo K: interfaces de verificación de límites" . Consultado el 5 de noviembre de 2015 .
  131. ^ "MSC06-C. Cuidado con las optimizaciones del compilador". Estándar de codificación SEI CERT C.
  132. ^ memset_s(3)  -  Manual de funciones de la biblioteca FreeBSD

enlaces externos