advertencia obsoleta de fopen


En Visual Studio 2005 C++ compiler, recibo la siguiente advertencia cuando mi código usa fopen y tales llamadas.

1>foo.cpp(5) : warning C4996: 'fopen' was declared deprecated
1>        c:\program files\microsoft visual studio 8\vc\include\stdio.h(234) : see declaration of 'fopen'
1>        Message: 'This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details.'

¿Cómo prevengo esto?

Author: Leos313, 2008-08-18

10 answers

Parece que Microsoft ha desaprobado muchas llamadas que utilizan búferes para mejorar la seguridad del código. Sin embargo, las soluciones que están proporcionando no son portátiles. De todos modos, si no está interesado en usar la versión segura de sus llamadas (como fopen_s), debe colocar una definición de _CRT_SECURE_NO_DEPRECATE antes de los archivos de encabezado incluidos. Por ejemplo:

#define _CRT_SECURE_NO_DEPRECATE
#include <stdio.h>

La directiva preprocesador también se puede agregar a la configuración de su proyecto para afectarla en todos los archivos bajo el proyecto. Para hacer esto agregue _CRT_SECURE_NO_DEPRECATE a Propiedades del proyecto -> Propiedades de configuración -> C/C++ -> Preprocesador -> Definiciones de Preprocesador.

 108
Author: Ashwin Nanjappa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-18 09:39:16

Bueno, podría agregar un:

#pragma warning (disable : 4996)

Antes de usar fopen, pero ¿ha considerado usar fopen_s como sugiere la advertencia? Devuelve un código de error que le permite comprobar el resultado de la llamada a la función.

El problema con solo deshabilitar las advertencias de funciones obsoletas es que Microsoft puede eliminar la función en cuestión en una versión posterior del CRT, rompiendo su código (como se indica a continuación en los comentarios, esto no sucederá en esta instancia con fopen porque es parte de la C & Estándares ISO de C++).

 23
Author: John Sibly,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-09-18 13:40:40

Esto es solo Microsoft siendo descarado. "Obsoleto" implica una característica de lenguaje que puede no ser proporcionada en futuras versiones del lenguaje estándar / bibliotecas estándar, según lo decretado por el comité de estándares. No significa, o no debería significar, "nosotros, unilateralmente, no creemos que debas usarlo", sin importar cuán bien fundado sea ese consejo.

 13
Author: tragomaskhalos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-11-12 17:34:49

Si el código está destinado a un sistema operativo diferente (como Mac OS X, Linux), puede usar lo siguiente:

#ifdef _WIN32
#define _CRT_SECURE_NO_DEPRECATE
#endif
 8
Author: Magnetron,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-20 23:02:21

Considere usar una biblioteca de portabilidad como glibo el apache portable runtime. Por lo general, proporcionan alternativas seguras y portátiles a llamadas como estas. También es algo bueno, porque estas llamadas inseguras están obsoletas en la mayoría de los entornos modernos.

 4
Author: Joseph Holsten,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-18 11:15:58

Estoy usando VisualStdio 2008. En este caso me pongo a menudo Preprocessor Definitions

Menu \ Project \ [ProjectName] Propiedades... Alt+F7

Si hace clic en este menú o presiona Alt + F7 en la ventana del proyecto, puede ver la ventana "Páginas de propiedades".

Luego vea el menú a la izquierda de la ventana.

Propiedades de configuración \ C / C++ \ Preprocesador

A continuación, añadir _CRT_SECURE_NO_WARNINGS a \ Definiciones del preprocesador.

 3
Author: Bryant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-15 03:35:23

Si desea que se use en muchas plataformas, puede definir como uso comentado:

#if defined(_MSC_VER) || defined(WIN32)  || defined(_WIN32) || defined(__WIN32__) \
                        || defined(WIN64)    || defined(_WIN64) || defined(__WIN64__) 

        errno_t err = fopen_s(&stream,name, "w");

#endif

#if defined(unix)        || defined(__unix)      || defined(__unix__) \
                        || defined(linux)       || defined(__linux)     || defined(__linux__) \
                        || defined(sun)         || defined(__sun) \
                        || defined(BSD)         || defined(__OpenBSD__) || defined(__NetBSD__) \
                        || defined(__FreeBSD__) || defined __DragonFly__ \
                        || defined(sgi)         || defined(__sgi) \
                        || defined(__MACOSX__)  || defined(__APPLE__) \
                        || defined(__CYGWIN__) 

        stream = fopen(name, "w");

#endif
 1
Author: JTIM,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-24 09:57:23

Para aquellos que utilizan la versión de Visual Studio 2017, parece que la definición del preprocesador necesaria para ejecutar operaciones inseguras ha cambiado. Use en su lugar:

#define _CRT_SECURE_NO_WARNINGS

Se compilará entonces.

 1
Author: Marcelo Coronel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-20 16:03:40

Muchas de las funciones seguras de Microsoft, incluyendo fopen_s(), son parte de C11, por lo que deberían ser portables ahora. Debe tener en cuenta que las funciones seguras difieren en comportamientos de excepción y, a veces, en valores de retorno. Además, debe tener en cuenta que mientras estas funciones están estandarizadas, es una opcional parte del estándar (Anexo K) que al menos glibc (por defecto en Linux) y libc de FreeBSD no implementan.

Sin embargo, luché contra este problema durante unos años. Me publicado un conjunto más grande de macros de conversión aquí., Para su problema inmediato, ponga el siguiente código en un archivo de inclusión e inclúyalo en su código fuente:

#pragma once
#if !defined(FCN_S_MACROS_H)
   #define   FCN_S_MACROS_H

   #include <cstdio>
   #include <string> // Need this for _stricmp
   using namespace std;

   // _MSC_VER = 1400 is MSVC 2005. _MSC_VER = 1600 (MSVC 2010) was the current
   // value when I wrote (some of) these macros.

   #if (defined(_MSC_VER) && (_MSC_VER >= 1400) )

      inline extern
      FILE*   fcnSMacro_fopen_s(char *fname, char *mode)
      {  FILE *fptr;
         fopen_s(&fptr, fname, mode);
         return fptr;
      }
      #define fopen(fname, mode)            fcnSMacro_fopen_s((fname), (mode))

   #else
      #define fopen_s(fp, fmt, mode)        *(fp)=fopen( (fmt), (mode))

   #endif //_MSC_VER

#endif // FCN_S_MACROS_H

Por supuesto, este enfoque no implementa el comportamiento de excepción esperado.

 1
Author: riderBill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-28 10:53:11

También tengo el mismo problema. Cuando intento agregar la biblioteca opencv

#include <opencv\cv.h>

No recibí una advertencia, sino un error.

error C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.    c:\program files (x86)\opencv\build\include\opencv2\flann\logger.h  

También utilicé las directivas del preprocesador como se mencionó. Pero eso no resolvió el problema.

Lo resolví haciendo lo siguiente:

  • Vaya a Propiedades -> C / C++ - > Encabezados Precompilados - > Elija No usar Encabezados Precompilados en Encabezado Precompilado.
 0
Author: Karthik_elan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-30 17:10:55