Sobre Visual Studio 2005 compilador de C++, me sale la siguiente advertencia cuando mi código utiliza el fopen y llamadas de este tipo.

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 puedo evitar esto?

10 Comentarios

  1. 118

    Parece que Microsoft ha dejado de utilizar muchas de las llamadas que el uso de búferes para mejorar la seguridad en el código. Sin embargo, las soluciones que te ofrecen no son portátiles. De todos modos, si usted no está interesado en el uso de la versión segura de sus llamadas (como fopen_s), es necesario hacer una definición de _CRT_SECURE_NO_DEPRECATE antes de su incluidos los archivos de cabecera. Por ejemplo:

    #define _CRT_SECURE_NO_DEPRECATE
    #include <stdio.h>

    La directiva de preprocesador también puede ser añadido a la configuración del proyecto a efecto de que en todos los archivos en el proyecto. Para ello añadir _CRT_SECURE_NO_DEPRECATE a Propiedades del Proyecto -> Propiedades de Configuración -> C/C++ -> Preprocesador -> de las Definiciones del Preprocesador.

    • Probablemente, usted debe hacer algo como esto: #ifdef _WIN32 #define _CRT_SECURE_NO_DEPRECATE #endif #include <stdio.h> Debido a que otras plataformas no necesita que se define durante el tiempo de compilación.
    • Una mejor guardia sería comprobar #ifdef _MSC_VER.
  2. 25

    Bien, se podría agregar un:

    #pragma warning (disable : 4996)

    antes de usar fopen, sin embargo, han considerado el uso de fopen_s como la advertencia sugiere? Devuelve un código de error que le permite comprobar el resultado de la llamada a la función.

    El problema con sólo desactivar obsoleto función de las advertencias es que Microsoft puede eliminar la función en cuestión en una versión posterior de la CRT, rompiendo el código (como se indica más abajo en los comentarios, esto no sucede en este caso con fopen, porque es parte de la C & C++ normas ISO).

    • Podría haber usado fopen_s, pero desde que esto empezó con el código que yo quería ser lo más portátil posible, yo no prefiero que de la solución. Me resulta difícil creer que Microsoft eliminará completamente el estándar de las llamadas a la biblioteca. Se puede hacer bastante difícil de utilizar, sino que tendrá que mantener durante viejo código.
    • «Microsoft puede eliminar la función en cuestión en una versión posterior de la CRT» – si ya no desea ejecutar el C o estándares de C++.
    • Algunas personas objetivo de no MS de plataformas. Y con una gran cantidad de estos _s funciones, no hay realmente un notable seguridad de ganancia.
    • Para el futuro de google: In this context, "deprecated" just means that a function's use is not recommended; it does not indicate that the function is scheduled to be removed from the CRT.msdn ++++
    • Ya a sabiendas y voluntariamente romper la norma. Consulte este.
    • En VS2013 que necesitaba usar #pragma warning(disable:4996) porque la propuesta de _CRT_SECURE_NO_WARNINGS y _CRT_SECURE_NO_DEPRECATE tanto no funciona. El #defines parecen funcionar en otros contextos, por lo que un heads-up que este parece ser implementado de forma incoherente.

  3. 13

    Esto es sólo Microsoft siendo descarado. «Obsoleta» implica una característica del lenguaje que no puede ser proporcionada en futuras versiones de la lengua estándar /estándar de las bibliotecas, como fue decretado por el comité de normas. No, o no debe decir, «nosotros, de forma unilateral, no creo que se debería usar», no importa lo bien fundado de que el asesoramiento es.

    • El significado de la palabra en inglés «desaprobar» es, precisamente, la segunda cosa: «pensamos que usted no debería usar». Pero en el equipo de la jerga recientemente ha llegado a tener una mucho más débil que significa, «puede no ser conveniente para el uso, porque estamos tipo de pensamiento de su remoción, y hemos proporcionado algo que nos parece mejor».
  4. 8

    Si el código está diseñado para un sistema operativo diferente (como Mac OS X, Linux) se pueden utilizar los siguientes:

    #ifdef _WIN32
    #define _CRT_SECURE_NO_DEPRECATE
    #endif
  5. 4

    Considerar el uso de una portabilidad de la biblioteca como glib o la apache portable runtime. Estos suelen proporcionar seguro, portátil alternativas a las llamadas de estos. Es una buena cosa, porque estas insegura de llamadas están en desuso en la mayoría de los ambientes modernos.

  6. 4

    Soy utilizando VisualStdio de 2008.
    En este caso, a menudo me puse a Preprocessor Definitions

    Menú \ Proyecto \ [Nombre De Proyecto] Propiedades… Alt+F7

    Si haga clic en este menú o presione Alt + F7 en la ventana de proyecto, se puede ver «Páginas de propiedades» ventana.

    A continuación, ver el menú a la izquierda de la ventana.

    Propiedades De Configuración \ C/C++ \ Preprocesador

    A continuación, agregue _CRT_SECURE_NO_WARNINGS a \ Definiciones del Preprocesador.

    • Por favor, consulte esta primera ¿cómo responder Esta pregunta se contesta antes de que, obviamente, usted puede añadir su respuesta aquí. Pero es Necesario entender algunos puntos antes de contestar. Primero, no hay que añadir una respuesta que previamente se ha añadido con el mismo código o sugerencia. Segundo, no agregue demasiado complicado responder si el usuario ha solicitado que muy específicamente sobre el problema y lo que necesita para resolver esto. En tercer lugar, puede agregar un comentario si quieres sugerir algo respecto a la respuesta o la pregunta.
    • Esta es la única respuesta que trabajó para mí en Visual Studio 2017. #define a la izquierda un montón de C4996 errores. (@ankitsuthar tu comentario me parece fuera de lugar para mí. Esta respuesta es concisa, funciona, y difiere en los detalles importantes de los otros).
  7. 1

    Si quieres ser utilizado en muchas plataformas, usted podría como se ha comentado utilizar define como:

    #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
    • Su complejo #SI sólo las direcciones de las plataformas, no versiones de compilador. ¿#if (defined(_MSC_VER) && (_MSC_VER >= 1600) ) ... #ELSE ... Que debe abarcar todos los casos, a la derecha?
    • _MSC_VER = 1600 puede no ser la primera versión obsoleta de fopen(), etc. Fue la primera versión en la que me encontré con el problema.
    • Se parece a la primera versión de MSVC con (algunas de) las funciones segura estaba de 2005, _MSC_VER = 1400.
  8. 1

    Para aquellos que están usando Visual Studio 2017 versión, parece que la definición de preprocesador necesarios para ejecutar operaciones inseguras ha cambiado. Utilizar en su lugar:

    #define _CRT_SECURE_NO_WARNINGS

    Va a compilar, a continuación,.

    • Al parecer, este no funciona para mí. Aún así obtener errores de compilación para freopen.
  9. 1

    Muchos de seguro de Microsoft funciones, incluyendo fopen_s(), son parte de C11, por lo que debe ser portátil ahora. Usted debe darse cuenta de que el seguro de las funciones difieren en excepción de los comportamientos y a veces en los valores de retorno. Además, usted necesita estar consciente de que mientras estas funciones están estandarizados, es un opcional parte de la norma (Anexo K) que en menos de glibc (por defecto en Linux) y FreeBSD libc no implementan.

    Sin embargo, he luchado este problema por un par de años. He publicado una serie de macros de conversión de aquí., Para su inmediata problema, coloque el código siguiente en un archivo de inclusión, y la incluyen 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 implementar el esperado comportamiento de excepción.

    • MS _s no son de la misma C11 la comprobación de los límites de la interfaz en general. Algunos tienen el mismo sinature, algunos no. Ya que su interfaz es opcional, algunas implementaciones de apoyo, bercause es en su mayoría innecesarias. Y el código es C++, no C a la que se refieren en el texto.
    • Hmm. Yo no puedo dirección de la comprobación de los límites, aparte de señalar mi comportamiento de excepción advertencia.
    • Tienes razón en que he citado a la C11 estándar (frente a C++14 o 17). Las funciones están disponibles en las versiones recientes de Microsoft compiladores de C++. Resulta que el Anexo K no es ampliamente soportado fuera de MSVS. Jonathan Leffler comentó here que el MS versiones de la realidad no se corresponde con el Anexo K de las especificaciones. Tanto para la portabilidad.
    • Te agradecería si usted lee mis comentarios completo. MSVC realmente no uso el BCI, pero su propia sopa. MSVC no ha ben compatibles desde al menos 18 años y fueron muy claro no con la intención de, al menos, incluyendo C99 obligatorio featues como VLAs, que son compatibles con todas las modernas compilador desde hace años ya (incluyendo las principales incrustado).
    • El interrogador etiquetado de Visual C++. He copiado el código de un gran archivo de C++. Para C, supongo que la incluye sería stdio.h y de la cadena.h (cadenas no se utilizan en el código anterior, aunque). No necesito el using namespace std; estado de cuenta, es la vigente en C? Estoy pensando en el en línea extern ( … ) debe ser estática en línea en C, para evitar problemas de vinculador. No quiero escribir mucho código C en estos días. Añadir un comentario si estoy equivocado.
    • No hay necesidad de ser grosero. No sé nada acerca de la comprobación de los límites de la interfaz se refiere. Que es lo que quiere decir «no puedo atender …» Mi comentario original continuó con «aunque tbh, que no es lo que quería en el momento.» Esa última parte desapareció mientras estaba editando (I pulse la tecla de retorno — estúpida idea de volver a la media de enviar o guardar, en mi humilde opinión). Yo no se siente que es importante de todos modos. Siéntase libre de proporcionar una respuesta explicando la comprobación de los límites de la interfaz. Si es importante, me gustaría saber acerca de ella.
    • Nadie estaba siendo grosero. Yo encontrar tal intros bastante insultante. «Muchos de seguro de Microsoft funciones, incluyendo fopen_s(), son parte de C11, por lo que debe ser portátil ahora» y «tienes razón en que he citado a la C11 estándar» – así que estamos seguros que usted conoce el estándar, ¿por qué iba a que estado esta? Sobre el resto: google. Todos los mensajes se pueden editar los comentarios para 5 minutos. Eso debería ser suficiente. Tal vez no debería haber saltado de la tour? Para futuras referencias: port70.net/~nsz/c/c11/n1570.html me quedo con esta debajo de mi almohada (Ver apéndice K para esta discusión)

  10. 0

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

    #include <opencv\cv.h>

    Yo no tengo 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 he usado las directivas de preprocesador como se ha mencionado. Pero que no se resuelve el problema.

    Lo resuelto por hacer de la siguiente manera:

    • Ir a Propiedades -> C/C++ -> Encabezados Precompilados -> Seleccione No Utilizar Encabezados Precompilados en el Encabezado Precompilado.

Dejar respuesta

Please enter your comment!
Please enter your name here