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.
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
La función devuelve un valor dst.
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)
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).
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] ).