Advertencia C4996 (función insegura) para strcpy pero no para memcpy

Estoy escribiendo código en VS2010 y veo que después de la comstackción el comstackdor me da una advertencia C4996 (“Esta función o variable puede ser insegura”) para strcpy y sprintf.

Sin embargo, no pude obtener advertencias similares para memcpy (y es posible que haya pocas llamadas a función ‘inseguras’ similares en el código)

int _tmain(int argc, _TCHAR* argv[]) { char buf1[100], buf2[100]; strcpy (buf1, buf2); // Warning C4996 displayed here asking to use strcpy_s instead memcpy (buf1, buf2, 100); // No warning here asking to use memcpy_s memcpy_s(buf1, 100, buf2, 100); return 0; } 

¿Por qué esto es tan? ¿Cómo puedo activar la advertencia C4996 para todas las posibles llamadas inseguras en mi código?

En general, para comstackr el código C, necesita un comstackdor de C conforme. Visual Studio es un comstackdor C ++ no conforme.

Recibes la advertencia porque Visual Studio es malo. Mira esto

C4996 aparece cada vez que utiliza una función que Microsoft considera obsoleta. Aparentemente, Microsoft decidió que deberían dictar el futuro del lenguaje C, en lugar del grupo de trabajo ISO C. Por lo tanto, obtienes falsas advertencias para un código perfectamente correcto. El comstackdor es el problema.

No hay nada malo con la función strcpy (), eso es un mito. Esta función ha existido durante unos 30-40 años y cada parte está debidamente documentada. Entonces, lo que hace la función y lo que no debe ser una sorpresa, incluso para los principiantes C progtwigdores.

Lo que Strcpy hace y no hace:

  • Copia una cadena terminada en nulo en otra ubicación de memoria.
  • No se responsabiliza por el manejo de errores.
  • No arregla errores en la aplicación de llamadas.
  • No se responsabiliza por la educación de los progtwigdores de C.

Debido a la última observación anterior, debe saber lo siguiente antes de llamar a strcpy:

  • Si le pasa una cadena de longitud desconocida a strcpy, sin verificar su longitud por adelantado, tiene un error en la aplicación de la persona que llama.
  • Si pasa un trozo de datos que no termina con \0 , tiene un error en la aplicación de la persona que llama.
  • Si pasa dos punteros a strcpy (), que apuntan a ubicaciones de memoria que se superponen, usted invoca un comportamiento indefinido. Lo que significa que tienes un error en la aplicación de la persona que llama.

Por ejemplo, en el código que publicó, nunca inicializó las matrices, por lo que su progtwig probablemente se bloquee y se queme. Ese error no está en lo más mínimo relacionado con la función strcpy () y no se resolverá al cambiar strcpy () por otra cosa.

strcpy no es seguro si falta el NUL terminación, ya que puede copiar más caracteres de los que caben en el área de destino. Con memcpy , el número de bytes copiados es fijo.

La función memcpy_s realmente hace que sea más fácil para los progtwigdores hacerlo mal: pasas dos largos, y usa el más pequeño de los dos, y todo lo que obtienes es un código de error que puede ignorarse silenciosamente sin esfuerzo. Llamar a memcpy requiere completar el parámetro de size , lo que debería hacer que los progtwigdores piensen qué pasar.

Obtiene estas advertencias porque no pasar la longitud de la cadena y confiar en la terminación \0 no es seguro ya que pueden causar un desbordamiento del búfer. En memcpy pasas la longitud así que no hay problema de desbordamiento.

Puedes usar algo como

 #ifdef _MSC_VER # pragma warning(push) # pragma warning(disable:4996) #endif strcpy... ; // Code that causes unsafe warning #ifdef _MSC_VER # pragma warning(pop) #endif 

Si no te preocupa la portabilidad, puedes usar alternativas como strcpy_s etc.

Incluir en la definición del encabezado "stdafx.h"

 #define _CRT_SECURE_NO_WARNINGS 

En cuanto a la diferencia de strcpy y memcpy , la última función tiene un tercer parámetro que especifica cuántos caracteres se deben copiar. La primera función no tiene información sobre cuántos caracteres se copiarán de la cadena de origen a la cadena de destino, por lo que, en general, existe la posibilidad de que se sobrescriba la memoria asignada para la cadena de destino.

Debido a que strcpy y sprintf realmente son funciones inseguras, depende del contenido de la cadena para que no se desborde. En su lugar, debe usar strncpy y snprintf para asegurarse de que no sobrescribe la memoria.

Si bien memcpy no es este caso, tiene la longitud para que no sobrescriba la memoria siempre que la longitud sea correcta.

La advertencia indica que la función está en desuso y no estará disponible en versiones futuras: http://msdn.microsoft.com/en-US/en-en/library/ttcz0bys.aspx No puede agregar otras funciones a la desactivada lista de Microsoft.

El motivo de la desaprobación es “inseguro”, pero eso es diferente de su suposición “C4496 muestra todas las funciones no seguras”.

La razón por la que recibes una advertencia sobre sprintf y strcpy , y no sobre memcpy , es porque memcpy tiene un parámetro de longitud que limita la cantidad de memoria que copias. Para strcpy y memcpy , la entrada debe terminarse con un \0 . Si no, continuará fuera de los límites. Puedes limitar esto usando las funciones snprintf y strncpy . Esos límites limitan implícitamente cuánto se puede copiar.

Tenga en cuenta que Microsoft ha _snprintf usar snprintf , por lo que debe usar la función de reemplazo _snprintf en _snprintf lugar. Sin embargo, esta es una función específica de MSVC.

Aconsejaría eliminar todos los búfers char * y cambiar a C ++, usando stl container, como std::string . Esto le ahorrará muchos dolores de cabeza de depuración y mantendrá su código portátil.