Question

Sur Compilateur Visual Studio 2005 C++, je reçois l'avertissement suivant lorsque mon code utilise le fouvert et de tels appels.

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.'

Comment puis-je empêcher cela ?

Était-ce utile?

La solution

Il semble que Microsoft ait abandonné de nombreux appels utilisant des tampons pour améliorer la sécurité du code.Cependant, les solutions proposées ne sont pas portables.Quoi qu'il en soit, si vous n'êtes pas intéressé à utiliser la version sécurisée de leurs appels (comme fopen_s), vous devez placer une définition de _CRT_SECURE_NO_DEPRECATE avant vos fichiers d'en-tête inclus.Par exemple:

#define _CRT_SECURE_NO_DEPRECATE
#include <stdio.h>

La directive du préprocesseur peut également être ajoutée aux paramètres de votre projet pour l'appliquer à tous les fichiers du projet.Pour ce faire, ajoutez _CRT_SECURE_NO_DEPRECATE à Propriétés du projet -> Propriétés de configuration -> C/C++ -> Préprocesseur -> Définitions du préprocesseur.

Autres conseils

Eh bien, vous pourriez ajouter un :

#pragma warning (disable : 4996)

avant d'utiliser fopen, mais avez-vous envisagé d'utiliser fopen_s comme le suggère l'avertissement ?Il renvoie un code d'erreur permettant de vérifier le résultat de l'appel de fonction.

Le problème avec la simple désactivation des avertissements de fonctions obsolètes est que Microsoft peut supprimer la fonction en question dans une version ultérieure du CRT, cassant ainsi votre code (comme indiqué ci-dessous dans les commentaires, cela n'arrivera pas dans ce cas avec fopen car cela fait partie de les normes ISO C & C++).

C'est juste que Microsoft est effronté.« Obsolète » implique une fonctionnalité de langage qui pourrait ne pas être fournie dans les futures versions du langage standard/des bibliothèques standard, comme l'a décrété le comité des standards.Cela ne signifie pas, ou ne devrait pas signifier, « nous, unilatéralement, pensons que vous ne devriez pas l'utiliser », quel que soit le bien-fondé de ce conseil.

Si votre code est destiné à un autre système d'exploitation (comme Mac OS X, Linux), vous pouvez utiliser ce qui suit :

#ifdef _WIN32
#define _CRT_SECURE_NO_DEPRECATE
#endif

Pensez à utiliser une bibliothèque de portabilité comme désinvolte ou la environnement d'exécution portable Apache.Ceux-ci offrent généralement des alternatives sûres et portables aux appels comme ceux-ci.C'est également une bonne chose, car ces appels non sécurisés sont obsolètes dans la plupart des environnements modernes.

J'utilise VisualStdio 2008.Dans ce cas, je règle souvent Preprocessor Definitions

Menu \ Projet \ [ProjectName] Propriétés...Alt+F7

Si vous cliquez sur ce menu ou appuyez sur Alt + F7 dans la fenêtre du projet, vous pouvez voir "Pages de propriétés" fenêtre.

Ensuite, voyez le menu à gauche de la fenêtre.

Propriétés de configuration \ C/C++ \ Préprocesseur

Puis ajouter _CRT_SECURE_NO_WARNINGS à \ Définitions du préprocesseur.

Si vous souhaitez qu'il soit utilisé sur de nombreuses plates-formes, vous pouvez définir l'utilisation commentée comme :

#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

Pour ceux qui utilisent la version Visual Studio 2017, il semble que la définition du préprocesseur requise pour exécuter des opérations non sécurisées ait changé.Utilisez plutôt :

#define _CRT_SECURE_NO_WARNINGS

Il sera alors compilé.

De nombreuses fonctions sécurisées de Microsoft, notamment fopen_s(), font partie de C11, elles devraient donc être portables désormais.Vous devez comprendre que les fonctions sécurisées diffèrent par leurs comportements d'exception et parfois par leurs valeurs de retour.De plus, vous devez être conscient que même si ces fonctions sont standardisées, il s'agit d'un facultatif fait partie du standard (Annexe K) qu'au moins la glibc (par défaut sous Linux) et la libc de FreeBSD n'implémentent pas.

Cependant, j'ai combattu ce problème pendant quelques années.J'ai publié un plus grand ensemble de macros de conversion ici., Pour votre problème immédiat, placez le code suivant dans un fichier d'inclusion et incluez-le dans votre code source :

#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

Bien entendu, cette approche n’implémente pas le comportement d’exception attendu.

J'ai aussi eu le même problème.Quand j'essaye d'ajouter la bibliothèque opencv

#include <opencv\cv.h>

Je n'ai pas reçu un avertissement mais une erreur.

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  

J'ai également utilisé les directives du préprocesseur comme mentionné.Mais cela n'a pas résolu le problème.

Je l'ai résolu en procédant comme suit :

  • Accédez à Propriétés -> C/C++ -> En-têtes précompilés -> Choisissez Ne pas utiliser d'en-têtes précompilés dans l'en-tête précompilé.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top