본문 바로가기
나머지/IT개발.잡다한것.

This function or variable may be unsafe fopen_s fscanf_s 경고

by 무늬만학생 2012. 9. 14.
반응형

1>------ Build started: Project: image123, Configuration: Release Win32 ------

1>  image123.cpp

1>image123.cpp(4): warning C4068: unknown pragma

1>image123.cpp(52): warning 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.

1>          C:\Program Files\Microsoft Visual Studio 10.0\VC\include\stdio.h(234) : see declaration of 'fopen'

1>image123.cpp(53): warning C4996: 'fscanf': This function or variable may be unsafe. Consider using fscanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

1>          C:\Program Files\Microsoft Visual Studio 10.0\VC\include\stdio.h(253) : see declaration of 'fscanf'

1>image123.cpp(54): warning C4996: 'fscanf': This function or variable may be unsafe. Consider using fscanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

1>          C:\Program Files\Microsoft Visual Studio 10.0\VC\include\stdio.h(253) : see declaration of 'fscanf'

1>image123.cpp(65): warning C4996: 'fscanf': This function or variable may be unsafe. Consider using fscanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

1>          C:\Program Files\Microsoft Visual Studio 10.0\VC\include\stdio.h(253) : see declaration of 'fscanf'

1>  Generating code

1>  Finished generating code

1>  image123.vcxproj -> C:\IMAGE\project\2012.9.14\image123\Release\image123.exe

========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========

질문

I'm puzzled by the following difference in behaviour:


// suppose myfile.txt contains a single line with the single character 's'

    errno_t res;

    FILE* fp;

    char cmd[81];


    res = fopen_s(&fp, "D:\\myfile.txt", "rb" );

    fscanf(fp,"%80s",cmd); // cmd now contains 's/0'

    fclose(fp);


    res = fopen_s(&fp, "D:\\myfile.txt", "rb" );

    fscanf_s(fp,"%80s",cmd); // cmd now contains '/0' !

    fclose(fp);

The results do not depend in the order of call (i.e., call fscanf_s first, you'd get the empty string first). Compiled on VC++ - VS2005. Can anyone reproduce? Can anyone explain?


Thanks!


답변

The main difference between the secure functions (with the _s suffix) and the older functions is that the secure functions require the size of each c, C, s, S and [ type field to be passed as an argument immediately following the variable. For more information, see scanf_s, _scanf_s_l, wscanf_s, _wscanf_s_l and scanf Width Specification.

Unlike scanf and wscanf, scanf_s and wscanf_s require the buffer size to be specified for all input parameters of type c, C, s, S, or [. The buffer size is passed as an additional parameter immediately following the pointer to the buffer or variable. For example, if reading a string, the buffer size for that string is passed as follows:


char s[10];

scanf("%9s", s, 10);

So you should call it like so:

fscanf_s(fp,"%80s",cmd, sizeof(cmd));

출처 : http://stackoverflow.com/questions/3112869/fscanf-fscanf-s-difference-in-behaviour




http://msdn.microsoft.com/en-us/library/w40768et.aspx

반응형