Cuando la gente dice " strcpy()
es peligroso, utilícelo strncpy()
en su lugar" (o declaraciones similares sobre strcat()
etc., pero lo voy a usar strcpy()
aquí como mi enfoque), quieren decir que no hay límites strcpy()
. Por lo tanto, una cadena demasiado larga resultará en saturaciones de búfer. Son correctos. El uso strncpy()
en este caso evitará desbordamientos del búfer.
Siento que strncpy()
realmente no soluciona errores: resuelve un problema que un buen programador puede evitar fácilmente.
Como programador de C, debe conocer el tamaño de destino antes de intentar copiar cadenas. Esa es la premisa de strncpy()
y strlcpy()
's últimos parámetros demasiado: Usted suministro de ese tamaño a ellos. También puede conocer el tamaño de la fuente antes de copiar cadenas. Entonces, si el destino no es lo suficientemente grande, no llamestrcpy()
. Reasigne el búfer o haga otra cosa.
¿Por qué no me gusta strncpy()
?
strncpy()
es una mala solución en la mayoría de los casos: su cadena se truncará sin previo aviso; prefiero escribir código adicional para resolver esto yo mismo y luego tomar el curso de acción que quiero tomar, en lugar de dejar que alguna función decida yo sobre qué hacer.
strncpy()
es muy ineficiente. Escribe en cada byte del búfer de destino. No necesita esos miles '\0'
al final de su destino.
- No escribe una terminación
'\0'
si el destino no es lo suficientemente grande. Por lo tanto, debe hacerlo usted mismo de todos modos. La complejidad de hacer esto no vale la pena.
Ahora llegamos a strlcpy()
. Los cambios de lo strncpy()
hacen mejor, pero no estoy seguro de si el comportamiento específico destrl*
justifica su existencia: son demasiado específicos. Aún tienes que conocer el tamaño del destino. Es más eficiente que strncpy()
porque no escribe necesariamente en cada byte del destino. Pero los que resuelve un problema que puede ser resuelto haciendo: *((char *)mempcpy(dst, src, n)) = 0;
.
No creo que nadie diga eso strlcpy()
o strlcat()
pueda dar lugar a problemas de seguridad, lo que ellos (y yo) estamos diciendo que puede resultar en errores, por ejemplo, cuando espera que se escriba la cadena completa en lugar de una parte de ella.
El problema principal aquí es: ¿cuántos bytes copiar? El programador debe saber esto y si no lo sabe,strncpy()
o strlcpy()
no lo salvará.
strlcpy()
y strlcat()
no son estándar, ni ISO C ni POSIX. Entonces, su uso en programas portátiles es imposible. De hecho, strlcat()
tiene dos variantes diferentes: la implementación de Solaris es diferente de las otras para los casos de borde que involucran la longitud 0. Esto la hace aún menos útil que de otra manera.
strlcpy
ystrlcat
reportaría algún tipo de condición de error si chocaran con el límite de tamaño del búfer de destino. Aunque puede verificar la longitud devuelta para probar esto, no es obvio. Pero creo que es una crítica menor. El argumento de 'fomentan el uso de cadenas C, por lo que son malas' es una tontería.