wake-up-neo.com

Deaktivieren von Warnungen, die über _CRT_SECURE_NO_DEPRECATE generiert wurden

Was ist der beste Weg, um die über _CRT_SECURE_NO_DEPRECATE generierten Warnungen zu deaktivieren, damit sie problemlos wiederhergestellt werden können und für alle Visual Studio-Versionen geeignet sind?

71
grrussel

Wenn Sie Ihren Quellcode nicht verschmutzen möchten (nachdem diese Warnung nur bei Microsoft-Compiler angezeigt wird), fügen Sie den Projekteinstellungen das Symbol _CRT_SECURE_NO_WARNINGS über "Projekt" -> "Eigenschaften" -> "Konfigurationseigenschaften" > "C/C++" -> "Präprozessor" -> "Präprozessor-Definitionen".

Sie können es auch definieren, bevor Sie eine Header-Datei einfügen, die diese Warnung generiert. Sie sollten etwas hinzufügen

#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif

Und nur eine kleine Bemerkung: Vergewissern Sie sich, dass Sie wissen, wofür diese Warnung steht. Wenn Sie nicht beabsichtigen, andere Compiler als MSVC zu verwenden, sollten Sie die Verwendung einer sichereren Version von Funktionen in Betracht ziehen, d. H. Strcpy_s statt strcpy.

102
Serge

Sie können die Warnungen an Orten, an denen sie angezeigt werden, vorübergehend deaktivieren

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

sie deaktivieren also nicht alle Warnungen, die manchmal schädlich sein können.

45
macbirdie

ich arbeite an einem Multi-Plattform-Projekt, daher kann ich die _s-Funktion nicht verwenden und möchte nicht, dass mein Code mit visuellem, Studio-spezifischem Code verunreinigt wird.
Meine Lösung ist die Deaktivierung der Warnung 4996 für das Visual Studio-Projekt. Gehen Sie zu Projekt -> Eigenschaften -> Konfigurationseigenschaften -> C/C++ -> Erweitert -> Spezifische Warnung deaktivieren und fügen Sie den Wert 4996 hinzu.
Wenn Sie auch die mfc- und/oder die atl-Bibliothek (nicht mein Fall) verwenden, definieren Sie vor dem Include mfc _AFX_SECURE_NO_DEPRECATE und vor dem Include atl _ATL_SECURE_NO_DEPRECATE.
Ich verwende diese Lösung in Visual Studio 2003 und 2005.

p.s. Wenn Sie nur Visual Studio verwenden, können die sicheren Vorlagenüberladungen eine gute Lösung sein.

8
conte0

Sie können auch Secure Template Overloads verwenden, um die unsicheren Anrufe überall dort zu ersetzen, wo Sie die Puffergröße (statische Arrays) problemlos ableiten können.

Fügen Sie einfach folgendes hinzu:

#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1 

Beheben Sie anschließend die verbleibenden Warnungen mithilfe der _s-Funktionen von Hand.

6
Drealmer

Kombination von @ [macbirdie] und @ [Adrian Borchardt] antworten. Was sich in Produktionsumgebungen als sehr nützlich erweist (keine Verwirrung von bereits vorhandenen Warnungen, insbesondere beim plattformübergreifenden Kompilieren).

#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

Für die Warnung durch den Warnfall ist es ratsam, den Standard irgendwann wiederherzustellen, da Sie dies von Fall zu Fall tun.

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

sie können die Sicherheitsüberprüfung deaktivieren. gehe zu

Projekt -> Eigenschaften -> Konfigurationseigenschaften -> C/C++ -> Codegenerierung -> Sicherheitsprüfung

und wählen Sie Sicherheitsüberprüfung deaktivieren (/ GS-)

2
s.c

Dies erreichen Sie am besten durch eine einfache Prüfung und Bewertung. Ich mache normalerweise so etwas:

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

Alles was wirklich erforderlich ist, ist folgendes: 

#pragma warning(disable: 4996)

Hat mich noch nicht versagt; Hoffe das hilft

2

Sie können das _CRT_SECURE_NO_WARNINGS-Symbol definieren, um sie zu unterdrücken.

1
dennisV

Noch eine späte Antwort ... So benutzt Microsoft es in ihrem wchar.h. Beachten Sie, dass sie auch Warning C6386 deaktivieren:

__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