POST

c언어 비쥬얼 스튜디오 2013 scanf 오류(경고) visual studio

C언어 Visual Studio(비쥬얼 스튜디오) scanf 오류(경고)



최신 버전의 Visual Studio 를 쓰면 scanf 경고로 인해 컴파일이 되지않습니다.

경고의 내용은 대략 이러합니다 "scanf 는 안전하지않으니 scanf_s를 이용하라. 자세한것은 온라인으로 도와주겠다."

여기서는 scanf와 scanf_s 이 두가지 모두를 사용하는 방법에 대해 설명을 드리겠습니다.



scanf 말고 scanf_s 이용하기



scanf는 예전부터 써오던 standard console io(stdio)의 input 함수입니다. 이 함수는 참 범용적으로 사용되는데, 최근 몇 년동안 보안의 문제에 직면하면서 수정을 가한 것이 scanf_s입니다.


scanf_s는 버퍼 오버런, 버퍼 오버플로우를 이용한 공격을 방어하는 목적입니다. 좀 자세히 설명하면, 버퍼의 크기를 정해주지 않는 경우, 그 버퍼에 실행코드를 함께 넣으면서, 그 실행코드로 jump하게하는 기술을 사용하면, scanf등을 이용해 입력을 받는 프로그램을 통해 외부의 실행코드가 실행될 수 있게 되고, 그 실행으로 바이러스를 옮기는 등의 악성 프로그램을 실행하게 될 수 있습니다. 이런 것을 막기위해 많은 standard C의 함수들이 보안 기능(security --> 그래서 s가 붙지요)을 추가한 함수로 변경되고 있습니다


하지만 이걸 그냥 사용하면서 아래처럼 약간의 문제점이 생기게 됩니다.



문자형 char를 사용하여 문자또는 문자열을 입력 받을 수 없을 것 입니다. 

아래의 파란 박스 처럼 버퍼의 크기를 지정해 주어야 정상적으로 사용이 가능합니다.

(저는 번거롭고 해서 아래의 다른 방법을 이용합니다.)


char c;

char  s[10];

scanf_s("%c %s", &c, 1, s, 10);

 

 





scanf를 그대로사용하기



두번째 방법은 scanf_s를 사용하지않고 scanf를 그대로 사용하는 것 입니다.

이것은 scanf 경고를 제거하여 기존의 scanf의 사용을 가능하게 해줍니다.




#pragma warning(disable:4996)

위의 해당 코드를 #include<stdio.h> 처럼 소스코드의 상단에 입력하면 더이상 scanf경고가 나오지 않습니다.