MS Visual Studio 2005 에서 fopen 과 sprintf 함수 사용시 다음과 같은 warning message 가 뜬다.

warning C4996: 'fopen' was declared deprecated
C:\Program Files\Microsoft Visual Studio 8\VC\include\stdio.h(234) : see declaration of 'fopen'
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.'

warning C4996: 'sprintf' was declared deprecated
C:\Program Files\Microsoft Visual Studio 8\VC\include\stdio.h(345) : see declaration of 'sprintf'
Message: 'This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details.'

해석하자면,
'님아 그 함수 불안전함. _s 붙여서 사용해보삼. 자세한 내용은 검색해보던가.' 가 되겠다.

대체 함수가 안전한지 어떤지 당최 뭔 말인지 모르겠지만...
좌튼 안전 (또는 보안) 상의 이유로 secure 를 뜻하는 _s 가 붙은 함수를 사용하라고 하니...
컴파일 시 1개의 warning 도 용납이 안되는 성격인지라,
어쩔 수 없이 fopen_s 와 sprintf_s 를 사용해야겠다.
(물론 warning 은 개 무시하고 그냥 fopen 과 sprintf 를 사용해도 무방하다.)



fopen 의 사용이 아래의 예문과 같다면,
FILE *fp = fopen("test.file", "rb");

fopen_s 의 사용은 다음과 같이 이루어져야 한다.
FILE *fp;
fopen_s(&fp, "test.file", "rb");

주의점 : 1. FILE 선언과 fopen 을 one line 으로 할 수 없다.
            2. fopen_s 의 첫번째 인자, 파일 포인터를 전달할때 꼭 & 를 붙여야 한다.



sprintf 의 사용이 아래의 예문과 같다면,
sprintf(cOut, "%s", cIn);

sprintf_s 의 사용은 아래와 같이 이루어져야 한다.

/* 수정합니다.
과객 DEMIAN 님의 댓글처럼 sprintf_s 의 두번째 인자는 buffer 의 최대 크기를 의미합니다.
*/

sprintf_s( char *_DstBuf, size_t_SizeInBytes, const char *_Format, ... )

ex)
char cOut[256];
sprintf_s( cOut, 256, "%s", cIn );

sprintf_s(cOut, string_length, "%s", cIn);

주의점 : 
string_length 는 문자열의 길이를 나타내는데,
            예를 들어서 '
abc' 일 경우 string_length = 3아니라, string_length = 4 가 된다.
이 때, 숫자가 1 이라도 다를 경우 error 가 발생하고 문자열이 뭔지도 모를 경우가 태반이라
편하게 사용하기 위해서는 아래와 같은 방법을 사용하면 된다.

sprintf_s(cOut,
strlen(cIn)+1, "%s", cIn);

아 물론, "%s_ver.1" 과 같은 경우,

sprintf_s(cOut,
strlen(cIn)+1+6, "%s_ver.1", cIn);

과 같이 고정 문자열 길이를 더해주면 ... 될까? (안해봤다...)
되겠지 -_-;
 



warning 없는 코딩을 추구하는 것,
쓸데 없는 것일려나....( -.-)y~~~ 휴우....
  1. Favicon of http://winape.tistory.com winape 2009.11.10 00:26

    덕분에 VS2008에서 fopen의 warning 을 없앴습니다.
    fopen_s 의 사용법 너무 간결하게 설명 잘 해놓으셨네요 ^^
    감사합니다^^

  2. 아뭥미 2009.11.21 16:50

    아나 왜 ㅁㅊ마소는 그런걸 안전하지 않다고 허냐.. 나도 괜히 불안하네..

    • Favicon of https://lafirr.tistory.com lafirr 2009.12.01 17:20 신고

      그러게 말입니다.
      밑도 끝도 없이 '보안상'의 이유라니...
      찜찜할 따름입니다.

  3. choeeee 2010.02.04 23:06

    좋은 정보 감사합니다 ^^

  4. DEMIAN 2010.05.17 18:57

    sprint_s에서 string_length 인자부분 잘못 이해하고 계시군요.
    다른분들도 이글보고 잘못 이해하실까봐 올리고 갑니다.
    ======== MSDN 내용 ===========================
    buffer
    Storage location for output // 저장이 되어질 버퍼의 주소

    sizeOfBuffer
    Maximum number of characters to store. // 이 인자는 문자열자체의 크기가 아닙니다. 저장되어질 버퍼의 최대크기를 입력함으로써, 문자열이 버퍼의 크기를 넘어서 복사되어지지 못하도록 최대 버퍼의 길이를 지정하는 부분입니다.

    예를 들어서, char buffer[50]; 이라면,
    sprintf_s(buffer, 50, "문자열: %s, %d\n", 인자1, 인자2);
    이런식으로 사용합니다.

    • Favicon of https://lafirr.tistory.com lafirr 2010.05.17 23:18 신고

      네. 확인했습니다.
      DEMIAN 님 말씀대로 두번째 인자는 버퍼의 최대 크기입니다.
      도움 주셔서 감사합니다 ^^

  5. 코드인 2012.06.24 18:56

    감사합니다! ^^ 덕분에 워닝없애네요. ㅋㅋㅋ

  6. jaeyoung 2017.04.06 10:56

    감사합니다. 덕분에 warning 없앴네요 ㅎㅎ

+ Recent posts