tengo el siguiente fragmento de código C y tienen que identificar el error y sugerir una forma de escribir que sea más segura:¿Cómo podría escribirse este fragmento C de forma más segura?
char somestring[] = "Send money!\n";
char *copy;
copy = (char *) malloc(strlen(somestring));
strcpy(copy, somestring);
printf(copy);
Así que el error es que strlen ignora el arrastre '\0'
de una cadena y por lo tanto no es va a asignar suficiente memoria para la copia, pero no estoy seguro de lo que están obteniendo al escribir con más seguridad?
Podría simplemente usar malloc(strlen(somestring)+1))
Supongo, pero estoy pensando que debe haber una manera mejor que eso?
EDIT: OK, he aceptado una respuesta, sospecho que no se esperaría que la solución strdup de nosotros ya que no es parte de la norma ANSI C. Parece ser una pregunta bastante subjetiva, así que No estoy seguro de si lo que he aceptado es realmente lo mejor. Gracias de todos modos por todas las respuestas.
+1 para el uso de strncpy. Esa es la fuente de tantos agujeros de seguridad, no es gracioso. –
El uso de strncpy() mal es peor que usar strcpy() mal. Si usa strncpy(), tiene * NO * garantía de salida terminada nula (este ejemplo es correcto, pero no en general). Además, si usa búferes de gran tamaño y sizeof (búfer) para el tercer parámetro de strncpy(), tiene un mini desastre de rendimiento en sus manos; strncpy() celosamente pone a cero los datos copiados a longitud completa. * SÍ * para conocer la longitud de las cadenas fuente y de destino; Si lo hace correctamente, utilizar strcpy() es seguro y más seguro que el uso ciego de strncpy(). (Si es de alguna ayuda, strncat() es mucho, mucho peor que strncpy(); ¡nunca lo use!) –
Jonathan, strlcpy() es mucho más sensato. Lo uso cuando está disponible, y en algún momento traigo una versión cuando no está disponible. Lástima que Drepper sea un idiota. – dwc