2008-09-23 7 views

Respuesta

100

Si no quiere contaminar su código fuente (después de todo este aviso presenta solo el compilador de Microsoft), agregue el símbolo _CRT_SECURE_NO_WARNINGS a la configuración del proyecto a través de "Proyecto" -> "Propiedades" -> "Propiedades de configuración" - > "C/C++" -> "Preprocesador" -> "Definiciones de preprocesador".

También puede definirlo justo antes de incluir un archivo de encabezado que genera esta advertencia. Usted debe agregar algo como esto

#ifdef _MSC_VER 
#define _CRT_SECURE_NO_WARNINGS 
#endif 

Y sólo una pequeña observación, asegúrese de que entiende lo que esta advertencia significa, y tal vez, si usted no tiene intención de utilizar otros compiladores de MSVC, considere el uso de la versión más segura de funciones, es decir, strcpy_s en lugar de strcpy.

+0

Con el C11 y C++ 11 especificaciones, usted debe utilizar las versiones _S de las rutinas de manipulación de cadenas, a través de cualquier compilador compatible. –

+9

@PaulWhitehurst: No, solo están en extensiones opcionales. – Deduplicator

1

Puede definir el símbolo _CRT_SECURE_NO_WARNINGS para suprimirlos y no definirlos para volver a restaurarlos.

6

También puede usar el Secure Template Overloads, lo ayudarán a reemplazar las llamadas no seguras por otras seguras donde sea posible deducir fácilmente el tamaño del búfer (matrices estáticas).

Apenas añada el siguiente:

#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1 

luego fijar las advertencias restantes a mano, mediante el uso de las funciones _S.

8

trabajo en un proyecto multiplataforma, así que no puedo usar la función _s y no quiero contaminar mi código con el código específico de Visual Studio.
mi solución desactiva la advertencia 4996 en el proyecto de Visual Studio. vaya a Proyecto -> Propiedades -> Propiedades de configuración -> C/C++ -> Avanzado -> Deshabilitar advertencia específica agregue el valor 4996.
si usa también la biblioteca mfc y/o atl (no es mi caso) definir antes de incluir mfc _AFX_SECURE_NO_DEPRECATE y antes incluyen atl _ATL_SECURE_NO_DEPRECATE.
uso esta solución en Visual Studio 2003 y 2005.

p.s. si usa solo Visual Studio, las sobrecargas de plantillas seguras podrían ser una buena solución.

+2

Las funciones '* _s' no son específicas de Microsoft. Se conocen como interfaces Bounds Checking y forman parte del estándar C/C++. Ver [ISO/IEC TR 24772] (http://www.iso.org/iso/catalogue_detail.htm?csnumber=41542). La gente de Glibc decidió no implementarlos. – jww

+1

"... y no quiero contaminar mi código con el código específico de Visual Studio" - ¿Por qué no usar las funciones más seguras y evitar los errores de seguridad? En Unix y Linux, puede proporcionar un contenedor que realice la comprobación encuadernada que debería estar haciendo de todos modos, y luego llamar a la función estándar de Unix o Linux. *** Si *** no está realizando la verificación encuadernada, entonces realmente necesita *** estas funciones para evitar los problemas con su código (al menos en Windows). – jww

41

Usted puede desactivar temporalmente las advertencias en lugares donde aparecen utilizando

#pragma warning(push) 
#pragma warning(disable: warning-code) //4996 for _CRT_SECURE_NO_WARNINGS equivalent 
// deprecated code here 
#pragma warning(pop) 

por lo que no desactivar todas las advertencias, que pueden ser perjudiciales a veces.

+2

-1 no relevante aquí. – Tomas

+13

Exactamente lo que necesitaba –

+0

En realidad, la única forma en que funciona para mí en VS2008 – Geoffroy

2

La mejor manera de hacerlo es mediante un simple control y evaluación. Yo suelo hacer algo como esto:

#ifndef _DEPRECATION_DISABLE /* One time only */ 
#define _DEPRECATION_DISABLE /* Disable deprecation true */ 
#if (_MSC_VER >= 1400)   /* Check version */ 
#pragma warning(disable: 4996) /* Disable deprecation */ 
#endif /* #if defined(NMEA_WIN) && (_MSC_VER >= 1400) */ 
#endif /* #ifndef _DEPRECATION_DISABLE */ 

Todo lo que realmente necesita es la siguiente:

#pragma warning(disable: 4996) 

no me ha fallado todavía; Espero que esto ayude

2

Para el caso de advertencia por advertencia, es conveniente restaurarlo a la configuración predeterminada en algún momento, ya que lo está haciendo caso por caso.

#pragma warning(disable: 4996) /* Disable deprecation */ 
// Code that causes it goes here 
#pragma warning(default: 4996) /* Restore default */ 
4

Combinación de @ [macbirdie] y @ [Adrian Borchardt] respuesta. Que resulta ser muy útil en el entorno de producción (no echar a perder la advertencia previamente existente, especialmente durante la compilación multiplataforma)

#if (_MSC_VER >= 1400)   // Check MSC version 
#pragma warning(push) 
#pragma warning(disable: 4996) // Disable deprecation 
#endif 
//...       // ... 
strcat(base, cat);    // Sample depreciated code 
//...       // ... 
#if (_MSC_VER >= 1400)   // Check MSC version 
#pragma warning(pop)   // Renable previous depreciations 
#endif 
2

puede desactivar control de seguridad. ir a

Proyecto -> Propiedades - Propiedades> Configuración -> C/C++ -> Generación de código -> Control de seguridad

y seleccione Desactivar Control de seguridad (/ GS)

0

Otra respuesta tardía .. Así es como Microsoft lo usa en su wchar.h. Tenga en cuenta que también desactivar Warning C6386:

__inline _CRT_INSECURE_DEPRECATE_MEMORY(wmemcpy_s) wchar_t * __CRTDECL 
wmemcpy(_Out_opt_cap_(_N) wchar_t *_S1, _In_opt_count_(_N) const wchar_t *_S2, _In_ size_t _N) 
{ 
    #pragma warning(push) 
    #pragma warning(disable : 4996 6386) 
     return (wchar_t *)memcpy(_S1, _S2, _N*sizeof(wchar_t)); 
    #pragma warning(pop) 
} 
Cuestiones relacionadas