El problema es que en C y C++, el procesador hace lo que tu le dices.
Es decir, si reservas 5 de memoria, pero luego le dices que copie 10, copia 10 aunque sólo hayas reservado 5 (y si tienes suerte, esto te provoca un buffer overflow - o su variante de pantallazo azul si estas con un driver o el sistema operativo - si no tienes suerte... puedes dar permisos de administrador a un usuario invitado, o corromper datos/ficheros).
¿Por que se dice que el strcpy es malo? Porque en vez de estar diciendole cuanto tiene que copiar, le dices que "cuente" lo que tiene que copiar (Es decir, si he reservado un string de 5 posiciones, y le digo que copie otro, copiará del otro hasta que encuentre en el otro un caracter 0, lo cual puede ser que copie 2, que copie 3, o que copie 33).
Ahora, ¿por que no usar el strncpy o el strncat? La respuesta corta es porque no es cómodo. Estas funciones, no tienen en cuenta el \0 del final de la cadena (es decir, si he reservado 5, y le pido que me copie una cadena que ocupa 33, me copia 5... pero no me pone el \0 al final porque no cabe), por lo que otras funciones, como el strlen, me darán datos probablemente falsos.
Por ello, se han creado los strlcpy y los strcpy_s (puede que la sintaxis de microsoft este mal: no las uso).
Re:warning C4996
(Puntos:0)Llevo tiempo programando en C y uso bastante esas funciones que mencionas, y nunca me han parecido peligrosas.
Re:warning C4996
(Puntos:1)( http://www.septeto.com/ | Última bitácora: Sábado, 01 Octubre de 2005, 13:34h )
Es decir, si reservas 5 de memoria, pero luego le dices que copie 10, copia 10 aunque sólo hayas reservado 5 (y si tienes suerte, esto te provoca un buffer overflow - o su variante de pantallazo azul si estas con un driver o el sistema operativo - si no tienes suerte... puedes dar permisos de administrador a un usuario invitado, o corromper datos/ficheros).
¿Por que se dice que el strcpy es malo? Porque en vez de estar diciendole cuanto tiene que copiar, le dices que "cuente" lo que tiene que copiar (Es decir, si he reservado un string de 5 posiciones, y le digo que copie otro, copiará del otro hasta que encuentre en el otro un caracter 0, lo cual puede ser que copie 2, que copie 3, o que copie 33).
Ahora, ¿por que no usar el strncpy o el strncat? La respuesta corta es porque no es cómodo. Estas funciones, no tienen en cuenta el \0 del final de la cadena (es decir, si he reservado 5, y le pido que me copie una cadena que ocupa 33, me copia 5... pero no me pone el \0 al final porque no cabe), por lo que otras funciones, como el strlen, me darán datos probablemente falsos.
Por ello, se han creado los strlcpy y los strcpy_s (puede que la sintaxis de microsoft este mal: no las uso).
Para una explicación más detallada visita esta web:
http://www.gratisoft.us/todd/papers/strlcpy.html [gratisoft.us]