Deaktivieren von Warnungen, die über _CRT_SECURE_NO_DEPRECATE generiert wurden

73

Was ist der beste Weg, um die über generierten Warnungen zu deaktivieren _CRT_SECURE_NO_DEPRECATE, damit sie problemlos wiederhergestellt werden können und in allen Visual Studio-Versionen funktionieren?

grrussel
quelle

Antworten:

104

Wenn Sie Ihren Quellcode nicht verschmutzen möchten (nachdem diese Warnung nur beim Microsoft-Compiler angezeigt wird), fügen Sie _CRT_SECURE_NO_WARNINGSIhren Projekteinstellungen über "Projekt" -> "Eigenschaften" -> "Konfigurationseigenschaften" -> "C / C ++" ein Symbol hinzu "->" Präprozessor "->" Präprozessordefinitionen ".

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

#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif

Und nur eine kleine Bemerkung: Stellen Sie sicher, dass Sie verstehen, wofür diese Warnung steht. Wenn Sie nicht beabsichtigen, andere Compiler als MSVC zu verwenden, sollten Sie eine sicherere Version der Funktionen verwenden, z. B. strcpy_s anstelle von strcpy.

Serge
quelle
Mit den Spezifikationen c11 und c ++ 11 sollten Sie die _s-Versionen der Routinen zur Zeichenfolgenmanipulation für jeden kompatiblen Compiler verwenden.
Paul Whitehurst
10
@PaulWhitehurst: Nein, sie sind nur in optionalen Erweiterungen.
Deduplikator
48

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

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

Macbirdie
quelle
14
Genau das, was ich brauchte
Hans Malherbe
2
#pragma warning(supress: warning-code)Wenn nur eine (die folgende) Zeile eine veraltete Funktion verwendet.
Cremno
2
@ Cremno suppressmit zwei Ps
Gunther Struyf
8

Ich arbeite an einem Multi-Plattform-Projekt, daher kann ich die Funktion _s nicht verwenden und möchte meinen Code nicht mit Visual Studio-spezifischem Code verschmutzen.
Meine Lösung besteht darin, die Warnung 4996 im Visual Studio-Projekt zu deaktivieren. Gehen Sie zu Projekt -> Eigenschaften -> Konfigurationseigenschaften -> C / C ++ -> Erweitert -> Spezifische Warnung
deaktivieren und fügen Sie den Wert 4996 hinzu bevor Sie atl _ATL_SECURE_NO_DEPRECATE einschließen.
Ich benutze diese Lösung in Visual Studio 2003 und 2005.

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


quelle
2
Die *_sFunktionen sind nicht Microsoft-spezifisch. Sie werden als Bounds Checking-Schnittstellen bezeichnet und sind Teil des C / C ++ - Standards. Siehe ISO / IEC TR 24772 . Die Glibc-Leute beschlossen, sie nicht umzusetzen.
JWW
1
"... und ich möchte meinen Code nicht mit Visual Studio-spezifischem Code verschmutzen" - Warum nicht die sichereren Funktionen nutzen und Sicherheitslücken vermeiden? Unter Unix und Linux können Sie einen Wrapper bereitstellen, der die gebundene Prüfung durchführt, die Sie sowieso durchführen sollten, und dann die Standardfunktion von Unix oder Linux aufrufen. Wenn Sie die gebundene Prüfung nicht durchführen, benötigen Sie diese Funktionen wirklich , um Probleme mit Ihrem Code zu vermeiden (zumindest unter Windows).
JWW
6

Sie können auch die Überlastungen für sichere Vorlagen verwenden . Sie helfen Ihnen dabei, die unsicheren Aufrufe überall dort durch sichere zu ersetzen, wo die Puffergröße (statische Arrays) leicht abgeleitet werden kann.

Fügen Sie einfach Folgendes hinzu:

#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1 

Beheben Sie dann die verbleibenden Warnungen von Hand mithilfe der Funktionen _s.

Drealmer
quelle
5

Kombination aus @ [macbirdie] und @ [Adrian Borchardt] Antwort. Dies erweist sich in der Produktionsumgebung als sehr nützlich (da zuvor vorhandene Warnungen, insbesondere beim plattformübergreifenden Kompilieren, nicht durcheinander gebracht werden).

#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
PicoCreator
quelle
3

Für die Warnung von Fall zu Fall ist es ratsam, sie irgendwann auf den Standardwert zurückzusetzen, 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 */
Gustavo Litovsky
quelle
2

Der beste Weg, dies zu tun, ist eine einfache Überprüfung und Bewertung. Normalerweise mache ich 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 benötigt wird, ist das Folgende:

#pragma warning(disable: 4996)

Hat mich noch nicht im Stich gelassen; Hoffe das hilft

Adrian Borchardt
quelle
2

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

Projekt -> Eigenschaften -> Konfigurationseigenschaften -> C / C ++ -> Codegenerierung -> Sicherheitsüberprüfung

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

sc
quelle
1

Sie können das Symbol _CRT_SECURE_NO_WARNINGS definieren, um sie zu unterdrücken, und die Definition aufheben, um sie wieder herzustellen.

dennisV
quelle
0

Noch eine späte Antwort ... So verwendet Microsoft es in ihren wchar.h. Beachten Sie, dass sie auch die Warnung 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 )
} 
jww
quelle