it-swarm-eu.dev

Zakázání výstrah generovaných pomocí _CRT_SECURE_NO_DEPRECATE

Jaký je nejlepší způsob, jak zakázat varování generovaná pomocí _CRT_SECURE_NO_DEPRECATE, která umožňují jejich snadné obnovení a budou fungovat ve všech verzích aplikace Visual Studio?

71
grrussel

Pokud nechcete znečišťovat zdrojový kód (po všech těchto varováních se zobrazí pouze kompilátor Microsoft), přidejte symbol _CRT_SECURE_NO_WARNINGS do nastavení projektu pomocí "Project" -> "Vlastnosti" -> "Vlastnosti konfigurace" -> "C/C++ "->" Preprocessor "->" Definice preprocesoru ".

Také jej můžete definovat těsně před vložením souboru záhlaví, který toto varování vygeneruje. Měli byste něco takového přidat

#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif

A jen malá poznámka, ujistěte se, že rozumíte tomu, co toto varování znamená, a možná, pokud nechcete používat jiné kompilátory než MSVC, zvažte použití bezpečnější verze funkcí, tj. Strcpy_s místo strcpy.

102
Serge

Upozornění můžete dočasně zakázat na místech, kde se zobrazují pomocí

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

takže nemusíte zakázat všechna varování, která mohou být občas škodlivá.

45
macbirdie

i pracovat na více platformě projektu, takže nemohu použít _s funkce a nechci znečišťovat můj kód s vizuálním studiovým specifickým kódem.
mým řešením je vypnout varování 4996 o projektu vizuálního studia. přejděte do Projektu -> Vlastnosti -> Vlastnosti konfigurace -> C/C++ -> Upřesnit -> Zakázat konkrétní varování a přidejte hodnotu 4996.
pokud použijete také mfc a/nebo atl knihovnu (není můj případ), definujte před zahrnutím mfc _AFX_SECURE_NO_DEPRECATE a před zahrnutím atl _ATL_SECURE_NO_DEPRECATE.
Toto řešení používám napříč vizuálním studiem 2003 a 2005.

p.s. Pokud používáte pouze vizuální studio, může být dobrým řešením přetížení zabezpečené šablony.

8
conte0

Můžete také použít Secure Template Overloads , které vám pomohou nahradit nezabezpečené hovory bezpečnými všude tam, kde je možné snadno odvodit velikost vyrovnávací paměti (statická pole).

Stačí přidat následující:

#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1 

Zbývající varování pak ručně opravte pomocí funkcí _s.

6
Drealmer

Kombinace odpovědi @ [macbirdie] a @ [Adrian Borchardt]. Ukázalo se, že je to velmi užitečné ve výrobním prostředí (neoznámení dříve existujícího varování, zejména při kompilaci mezi platformami)

#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

Pro případ varování varováním je v určitém okamžiku moudré jej obnovit do výchozího stavu, protože to děláte případ od případu.

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

můžete vypnout kontrolu zabezpečení. jít do

Projekt -> Vlastnosti -> Vlastnosti konfigurace -> C/C++ -> Generování kódu -> Kontrola zabezpečení

a vyberte Zakázat kontrolu zabezpečení (/ GS-)

2
s.c

Nejlepším způsobem, jak toho dosáhnout, je jednoduchá kontrola a posouzení. Obvykle něco takového dělám:

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

Vše, co je opravdu potřeba, je následující: 

#pragma warning(disable: 4996)

Ještě mě nezklamal; Snad to pomůže

2

Symbol _CRT_SECURE_NO_WARNINGS můžete definovat, chcete-li je potlačit a definovat, abyste je mohli obnovit.

1
dennisV

Další pozdní odpověď ... Zde je návod, jak ji Microsoft používá ve svém wchar.h. Všimněte si, že také vypnout Upozornění 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