web-dev-qa-db-fra.com

Désactivation des avertissements générés via _CRT_SECURE_NO_DEPRECATE

Quel est le meilleur moyen de désactiver les avertissements générés via _CRT_SECURE_NO_DEPRECATE qui leur permet d’être rétablis facilement et fonctionnent avec les versions de Visual Studio?

71
grrussel

Si vous ne voulez pas polluer votre code source (après tout cet avertissement ne concerne que le compilateur Microsoft), ajoutez le symbole _CRT_SECURE_NO_WARNINGS aux paramètres de votre projet via "Projet" -> "Propriétés" -> "Propriétés de configuration" -> "C/C++ "->" Préprocesseur "->" Définitions du préprocesseur ".

Vous pouvez aussi le définir juste avant d'inclure un fichier d'en-tête qui génère cet avertissement . Vous devriez ajouter quelque chose comme ceci

#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif

Et juste une petite remarque, assurez-vous de bien comprendre le sens de cet avertissement et si vous n’avez pas l’intention d’utiliser d’autres compilateurs que MSVC, envisagez d’utiliser une version plus sûre des fonctions, à savoir strcpy_s au lieu de strcpy.

102
Serge

Vous pouvez désactiver les avertissements temporairement aux endroits où ils apparaissent en utilisant

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

vous ne désactivez donc pas tous les avertissements, qui peuvent parfois être dangereux.

45
macbirdie

je travaille sur un projet multi-plateforme, je ne peux donc pas utiliser la fonction _s et je ne veux pas polluer mon code avec du code spécifique à Visual Studio.
Ma solution est de désactiver l’avertissement 4996 sur le projet Visual Studio. Allez dans Projet -> Propriétés -> Propriétés de configuration -> C/C++ -> Avancé -> Désactiver l'avertissement spécifique, ajoutez la valeur 4996.
Si vous utilisez également les bibliothèques MFC et/ou ATL (pas mon cas), définissez avant include mfc _AFX_SECURE_NO_DEPRECATE et avant d’inclure atl _ATL_SECURE_NO_DEPRECATE.
J'utilise cette solution dans Visual Studio 2003 et 2005.

p.s. Si vous utilisez uniquement Visual Studio, les surcharges de modèles sécurisées pourraient constituer une bonne solution.

8
conte0

Vous pouvez également utiliser Secure Template Overloads , ils vous aideront à remplacer les appels non sécurisés par des appels sécurisés partout où vous pourrez facilement déduire la taille de la mémoire tampon (matrices statiques).

Ajoutez simplement ce qui suit:

#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1 

Ensuite, corrigez les avertissements restants à la main, en utilisant les fonctions _s.

6
Drealmer

Combinaison des réponses @ [macbirdie] et @ [Adrian Borchardt]. Ce qui s'avère très utile en environnement de production (ne pas gâcher les avertissements existants, en particulier lors de la compilation multiplate-forme)

#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
5
PicoCreator

Pour l'avertissement par cas, il est sage de le rétablir par défaut à un moment donné, car vous le faites au cas par cas.

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

vous pouvez désactiver le contrôle de sécurité. aller à

Projet -> Propriétés -> Propriétés de configuration -> C/C++ -> Génération de code -> Contrôle de sécurité

et sélectionnez Désactiver le contrôle de sécurité (/ GS-)

2
s.c

La meilleure façon de procéder consiste à vérifier et à évaluer. Je fais habituellement quelque chose comme ça:

#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 */

Tout ce qui est vraiment requis est le suivant: 

#pragma warning(disable: 4996)

M'a pas encore échoué; J'espère que cela t'aides

2
Adrian Borchardt

Vous pouvez définir le symbole _CRT_SECURE_NO_WARNINGS pour les supprimer et annuler la définition pour les rétablir.

1
dennisV

Une autre réponse tardive ... Voici comment Microsoft l’utilise dans leur wchar.h. Notez qu'ils désactivent également 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 )
} 
0
jww