Programing

_CRT_SECURE_NO_DEPRECATE를 통해 생성 된 경고 비활성화

lottogame 2020. 10. 26. 07:38
반응형

_CRT_SECURE_NO_DEPRECATE를 통해 생성 된 경고 비활성화


_CRT_SECURE_NO_DEPRECATE쉽게 복원하고 Visual Studio 버전에서 작동 할 수 있도록을 통해 생성 된 경고를 비활성화하는 가장 좋은 방법은 무엇입니까 ?


소스 코드를 오염시키지 않으려면 (이 모든 경고가 Microsoft 컴파일러에만 표시됨) _CRT_SECURE_NO_WARNINGS"Project"-> "Properties"-> "Configuration properties"-> "C / C ++를 통해 프로젝트 설정 기호를 추가 하십시오. "->"전 처리기 "->"전 처리기 정의 ".

또한이 경고를 생성하는 헤더 파일을 포함하기 직전에 정의 할 수 있습니다. 다음과 같이 추가해야합니다.

#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif

그리고이 경고의 의미를 이해하고 MSVC 이외의 다른 컴파일러를 사용하지 않으려면 strcpy 대신 strcpy_s와 같은 안전한 버전의 함수를 사용하는 것이 좋습니다.


다음을 사용하여 경고가 나타나는 위치에서 일시적으로 경고를 비활성화 할 수 있습니다.

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

따라서 때때로 유해 할 수있는 모든 경고를 비활성화하지 않습니다.


다중 플랫폼 프로젝트에서 작업하므로 _s 함수를 사용할 수 없으며 Visual Studio 특정 코드로 내 코드를 오염시키고 싶지 않습니다.
내 해결책은 Visual Studio 프로젝트에서 경고 4996을 비활성화하는 것입니다. 프로젝트-> 속성-> 구성 속성-> C / C ++-> 고급-> 특정 경고 비활성화로 이동하여 값 4996을 추가합니다
. mfc 및 / 또는 atl 라이브러리 (내 경우가 아님)도 사용하는 경우 mfc _AFX_SECURE_NO_DEPRECATE 및 atl _ATL_SECURE_NO_DEPRECATE를 포함하기 전에.
저는 Visual Studio 2003과 2005에서이 솔루션을 사용합니다.

ps Visual Studio 만 사용하는 경우 보안 템플릿 오버로드가 좋은 솔루션이 될 수 있습니다.


Secure Template Overloads를 사용할 수도 있습니다. 버퍼 크기 (정적 배열)를 쉽게 추론 할 수있는 모든 곳에서 안전하지 않은 호출을 안전한 호출로 대체하는 데 도움이됩니다.

다음을 추가하십시오.

#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1 

그런 다음 _s 함수를 사용하여 나머지 경고를 직접 수정합니다.


@ [macbirdie] 및 @ [Adrian Borchardt] 답변의 조합입니다. 프로덕션 환경에서 매우 유용하다는 것이 입증되었습니다 (특히 크로스 플랫폼 컴파일 중에 기존 경고를 엉망으로 만들지 않음).

#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

경고 사례 별 경고의 경우 사례별로 수행하므로 어느 시점에서 기본값으로 복원하는 것이 좋습니다.

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

이를 수행하는 가장 좋은 방법은 간단한 확인 및 평가입니다. 나는 보통 다음과 같이한다.

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

실제로 필요한 것은 다음과 같습니다.

#pragma warning(disable: 4996)

아직 나를 실망시키지 않았습니다. 도움이 되었기를 바랍니다


보안 검사를 비활성화 할 수 있습니다. 이동

Project -> Properties -> Configuration properties -> C/C++ -> Code Generation -> Security Check

and select Disable Security Check (/GS-)


You can define the _CRT_SECURE_NO_WARNINGS symbol to suppress them and undefine it to reinstate them back.


Another late answer... Here's how Microsoft uses it in their wchar.h. Notice they also disable 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 )
} 

참고URL : https://stackoverflow.com/questions/119578/disabling-warnings-generated-via-crt-secure-no-deprecate

반응형