ProgramingTip

fopen 비추천 경고

bestdevel 2020. 11. 16. 21:58
반응형

fopen 비추천 경고


비주얼 스튜디오 2005 C ++ 컴파일러 내 코드를 사용하면, 다음과 같은 경고를 하면 fopen 및 호출.

1>foo.cpp(5) : warning C4996: 'fopen' was declared deprecated
1>        c:\program files\microsoft visual studio 8\vc\include\stdio.h(234) : see declaration of 'fopen'
1>        Message: 'This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details.'

관리는 어떻게 방지합니까?


Microsoft는 코드 보안을 향상시키기 위해 버퍼를 사용하는 많은 호출을 사용하지 않는 것입니다. 그러나 그들이 제공하는 솔루션은 이식성이 없습니다. 어쨌든 보안 버전의 호출 (예 : fopen_s ) 을 사용하는 데 관심 이있는 모든 것이 포함 된 헤더 파일 _CRT_SECURE_NO_DEPRECATE 의 정의를 배치해야 합니다. 예를 들면 :

#define _CRT_SECURE_NO_DEPRECATE
#include <stdio.h>

전 처리기 지시문을 프로젝트 설정에 추가하여 프로젝트의 모든 파일에 적용 할 수도 있습니다. 이렇게 비용이 많이 드는 프로젝트 속성-> 구성 속성-> C / C ++-> 전 처리기-> 전 처리기 정의_CRT_SECURE_NO_DEPRECATE추가 합니다.


다음을 추가 할 수 있습니다.

#pragma warning (disable : 4996)

fopen을 사용하기 전에 경고에서 알 수 있습니다. fopen_s 사용을 고려 했습니까? 함수 호출의 결과를 확인할 수있는 오류 코드를 반환합니다.

더 이상 사용되지 않는 함수 경고를 사용하는 문제는 Microsoft가 최신 버전의 CRT에서 사용 된 함수를 제거하여 코드를 깨뜨릴 수 없습니다. C & C ++ ISO 표준).


이것은 Microsoft가 건방진 것입니다. "사용하지 않음"은 표준위원회에서 선언 한대로 표준 언어 / 표준 라이브러리의 차기 버전에서 제공하지 않을 수있는 언어 기능을 의미합니다. 그 조언이 아무리 근거가 아니더라도 "우리는 일방적으로 체계적으로 생각하지 않습니다"는 의미가 그렇게 생각하지 않습니다.


다른 OS (예 : Mac OS X, Linux) 용으로 코딩 한 경우 다음을 사용할 수 있습니다.

#ifdef _WIN32
#define _CRT_SECURE_NO_DEPRECATE
#endif

glib 또는 apache의 실행 과 같은 이식성 라이브러리 사용을 고려하십시오 . 일반적으로 이와 같은 통화에 대해 안전하고 가능한 대안을 제공합니다. 안전하지 않은 호출은 대부분의 현대 환경에서 더 이상 사용하지 않기 때문에 좋은 것입니다.


저는 VisualStdio 2008을 사용하고 있습니다.이 경우 저는 종종 Preprocessor Definitions

메뉴 \ 프로젝트 \ [프로젝트 이름] 속성 ... Alt + F7

이 메뉴를 클릭하거나 프로젝트 창에서 Alt + F7을 표시 "속성 페이지" 가 나타납니다.

그런 다음 창 왼쪽의 메뉴를 참조하십시오.

구성 속성 \ C / C ++ \ 전 처리기

그리고 추가 \ 처리기 정의 ._CRT_SECURE_NO_WARNINGS


많은 플랫폼에서 사용하는 다음과 같이 정의 할 수 있습니다.

#if defined(_MSC_VER) || defined(WIN32)  || defined(_WIN32) || defined(__WIN32__) \
                        || defined(WIN64)    || defined(_WIN64) || defined(__WIN64__) 

        errno_t err = fopen_s(&stream,name, "w");

#endif

#if defined(unix)        || defined(__unix)      || defined(__unix__) \
                        || defined(linux)       || defined(__linux)     || defined(__linux__) \
                        || defined(sun)         || defined(__sun) \
                        || defined(BSD)         || defined(__OpenBSD__) || defined(__NetBSD__) \
                        || defined(__FreeBSD__) || defined __DragonFly__ \
                        || defined(sgi)         || defined(__sgi) \
                        || defined(__MACOSX__)  || defined(__APPLE__) \
                        || defined(__CYGWIN__) 

        stream = fopen(name, "w");

#endif

Visual Studio 2017 버전을 사용하는 사람들에게는 안전하지 않은 작업을 실행하는 데 필요한 전 처리기 정의가 변경된 것입니다. 대신 사용 :

#define _CRT_SECURE_NO_WARNINGS

당신이됩니다.


fopen_s ()를 포함한 많은 Microsoft 보안 함수는 C11의 일부이므로 이제 이식 가능해야합니다. 보안 함수는 예외 동작과 때때로 반환 값이 다르다는 것을 알아야합니다. 또한 이러한 기능은 표준화되어 있지만 최소한 glibc (Linux의 기본값)와 FreeBSD의 libc가 구현하지 않는 표준 (Annex K) 선택적 부분 이라는 것을 알아야합니다 .

그러나 나는 몇 년 동안이 문제와 싸웠다. 여기에 더 큰 전환 매크로 세트를 게시했습니다 . , 당장 문제를 해결하려면 다음 코드를 포함 파일에 넣고 소스 코드에 포함하십시오.

#pragma once
#if !defined(FCN_S_MACROS_H)
   #define   FCN_S_MACROS_H

   #include <cstdio>
   #include <string> // Need this for _stricmp
   using namespace std;

   // _MSC_VER = 1400 is MSVC 2005. _MSC_VER = 1600 (MSVC 2010) was the current
   // value when I wrote (some of) these macros.

   #if (defined(_MSC_VER) && (_MSC_VER >= 1400) )

      inline extern
      FILE*   fcnSMacro_fopen_s(char *fname, char *mode)
      {  FILE *fptr;
         fopen_s(&fptr, fname, mode);
         return fptr;
      }
      #define fopen(fname, mode)            fcnSMacro_fopen_s((fname), (mode))

   #else
      #define fopen_s(fp, fmt, mode)        *(fp)=fopen( (fmt), (mode))

   #endif //_MSC_VER

#endif // FCN_S_MACROS_H

물론이 접근 방식은 예상되는 예외 동작을 구현하지 않습니다.


나도 같은 문제가 있습니다. opencv 라이브러리를 추가하려고 할 때

#include <opencv\cv.h>

경고가 아니라 오류가 발생했습니다.

error C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.    c:\program files (x86)\opencv\build\include\opencv2\flann\logger.h  

또한 언급 한 전 처리기 지시문도 사용했습니다. 그러나 그것은 문제를 해결하지 못했습니다.

다음과 같이 수행하여 해결했습니다.

  • 속성-> C / C ++-> 미리 컴파일 된 헤더-> 미리 컴파일 된 헤더에서 미리 컴파일 된 헤더를 사용하지 않음을 선택합니다.

참고 URL : https://stackoverflow.com/questions/14386/fopen-deprecated-warning

반응형