Fuerte

strncpy es una  función de biblioteca estándar del lenguaje de programación C para copiar el contenido de una cadena terminada en nulo en un búfer de tamaño limitado.

La función strncpyes similar strcpya la protección contra desbordamiento de búfer , sin embargo, no es completamente segura.

La función es compatible con todos los compiladores de C.

Función

El prototipo descrito en el archivo de encabezado string.h:

char *strncpy (char *dst, const char *src, size_t len);

La función no copia más de caracteres (incluido el carácter nulo) de la cadena srcal búfer , sin garantizar que la cadena termine con un carácter nulo (si la longitud de la cadena es mayor o igual que ). Si la longitud de la cadena es menor que , el búfer empuja hasta los caracteres nulos. dstlensrclensrclenlen

Valor devuelto

La función devuelve un valor dst.

Ejemplo de uso

#incluir <cadena.h> #include <stdio.h> /* para printf() */ int principal () { char * str = "patrón de cadena" ; charbuf [ 10 ] = { 0 } ; // búfer más pequeño que una cadena printf ( "cadena: \" %s \"\n\n " , cadena ); printf ( "búfer antes de copiar: \" %s \"\n " , buf ); strncpy ( buf , str , sizeof ( buf ) - 1 ); // len es 1 menos que el tamaño del búfer printf ( "búfer después de la copia: \" %s \"\n " , buf ); devolver 0 ; }

Conclusión:

cadena: "patrón de cadena" búfer antes de copiar: "" búfer después de la copia: "muestra con"

(la cadena se truncó al tamaño del búfer durante la copia - 9 caracteres + cero)

Seguridad

La función strncpyestá diseñada para proteger los programas de los desbordamientos del búfer , pero también es insegura por diseño: la función estándar no garantiza establecer un carácter nulo al final del búfer, que, al intentar imprimir una línea del búfer (o trabajar con él), puede conducir a la lectura de datos fuera del búfer, lo que hará que el programa se bloquee, lo que puede usarse para realizar un ataque DoS en la red.

Cuando trabaje con la función correctamente, debe pasar un valor lenuno menos que el tamaño del búfer a la función, y también establecer el último byte en 0 usted mismo:

charbuf[BUFSIZE]; strncpy(buf, entrada, tamaño de(buf) - 1); buf[tamaño(buf) - 1] = '\0';

Los desarrolladores de OpenBSD strncpyhan creado una función no estándar para reemplazarla con una strlcpycadena terminada en nulo. En los sistemas que también lo implementan, se recomienda usarlo en lugar de strncpy. En otros sistemas, es posible realizar una implementación casera de esta función, a partir del código fuente distribuido bajo la licencia BSD .

Además strlcpy, también resuelve el problema de rendimiento strncpy(ver más abajo).

Problema de rendimiento

El comportamiento estándar strncpyno es óptimo: la función llena todo el resto del búfer [1] [2] con ceros cada vez , lo que conduce a un consumo excesivo del recurso del procesador cuando el búfer es grande y cuando se trabaja con cadenas cortas (un error común). situación en los servidores de la red).

El uso en lugar de una strncpyfunción no estándar o una función artesanal (como, por ejemplo, Apachestrlcpy se reescribió en un momento [1] ), puede proporcionar un aumento significativo del rendimiento (se mostró un aumento de cinco veces en una prueba sintética [2] ).

Enlaces externos

  • strncpy(1)  -  Descripción de la función strncpyen el sitio web de OpenBSD

Notas

  1. las implicaciones de rendimiento de strncpy | El blog de Nathan . Fecha de acceso: 17 de octubre de 2014. Archivado desde el original el 18 de octubre de 2014.
  2. 5.4 Copia y concatenación Archivado desde el original el 21 de octubre de 2014. // Manual GNU Libc: "Usar strncpy .. también puede hacer que su programa sea mucho más lento en un caso común: copiar una cadena que probablemente sea pequeña en un búfer potencialmente grande. En este caso, el tamaño puede ser grande, y cuando lo es, strncpy perderá una cantidad considerable de tiempo copiando caracteres nulos".