본문 바로가기

개발자/C

visual studio scanf 에러, scanf_s 사용

반응형

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

때문에 scanf를 scanf_s로 바꾸어 주어야한다.


scanf는 예전부터 써오던 standard console io(stdio)의 input 함수입니다. 이 함수는 참 범용적으로 사용되는데, 최근 몇 년동안 보안의 문제에 직면하면서 수정을 가한 것이 scanf_s입니다. scanf_s는 scanf와 거의 똑같지만, character와 character pointer를 입력받는 경우는 버퍼의 크기를 하나 더 적어 넣어줘야 합니다.

 

char c;

char  s[10];

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

 

 

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





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

문자형 char를 사용하여 문자또는 문자열을 입력 받을 수 없을 것이다 (위에서 설명했다 싶이, 버퍼의 크기를 지정해 주어야한다.)


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

이것은 scanf 경고를 제거하여 기존의 scanf 사용이 가능하다. 이제는 문자형도 입력을 받을 수 있다.


#pragma warning(disable:4996)

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


출처 : enter님 티스토리

반응형