코딩공부

Visual Studio의 scanf와 scanf_s 본문

Language/C언어

Visual Studio의 scanf와 scanf_s

초보코더 2017. 9. 5. 10:08
반응형

최근 있었던 수업중에 이해가 안되는 일이 있었다.

원래 내가 개인노트북에서 사용하던 visual studio는 2010버전이였는데 학교 컴퓨터에는 2013버전이 깔려있었다. 2010버전에서는 scanf를 사용하면 오류가아닌 경고문구만 뜨게되어서 굳이 scanf_s를 사용하지 않고 익숙한 scanf를 사용해 왔는데 2013버전은 그게 안되더라...


코드를 보자!


이 버전은 2017버전이다! (해보려고 최신판으로 다시설치했다...)

이런 코드를 빌드하면 과연 어떻게될까? 빌드가 될까?

당연히 안된다. (아오 빡쳐)

사실 중요한건 안된다는 사실보다 '왜'안되냐가 더 중요한것이다! 그럼 왜 안될까?


scanf라는 함수는 예전부터 사용되던 입력 함수인데 항상 제기되던 문제가 있다고한다. scanf_s의 s가 security라는것을 생각하면 어떤 문제일까? 당연히 보안관련 문제가 꾸준히 제시되어 왔던 것이다! 버퍼 오버플로우, 버퍼 오버런에 관한 문제인데 쉽게 얘기하면 버퍼의 크기를 명확히 지정해주지 않아서 생길 수 있는 문제인 것이다! 그래서 만들어진 대체함수가 scanf_s이다.


이 코드를 보자.

scanf_s를 사용해서 빌드한 사진이다. 보다시피 빌드는 성공했다! 그런데 빌드출력창의 글들을 보면 문제가 있다고 징징댄다.(그럼 빌드를 안해주던가...)

그래서 무슨얘기인가 살펴보면 


이렇다고 한다!

헤더파일상에서 scanf_s를 뜯어볼 능력이 된다면 더 자세한 설명이 가능하겠지만 아직은 능력밖의 일이라...ㅠㅠ... 그런 나를 위해 나온 내용을 보면 scanf_s에 unsigned int형의 인수가 한개 더 필요한데 왜 안주냐!! 이거다. 위의 scanf에 관한 이야기를 할때 버퍼의 크기를 지정해주지 않아서 문제가 생긴다고 했었다. 그럼 scanf_s에서는? 버퍼의 크기를 지정해달라 이거다! 수정된 코드를 보자.

정말 빌드창이 깔-끔해졌다! scanf_s에서는 문자 또는 문자열을 입력 받고싶으면 그 버퍼의 크기를 지정해 주어야 한다는 의미이다! 물론 문자형(character)형 같은 경우 크기가 1이므로 sizeof(c)의 자리에 그냥 숫자로 1을 써주어도 되지만 sizeof()를 사용해 주면 앞으로 문자열을 사용할때에도 편하게 쓸 수 잇을것으로 생각된다!


아 그리고 중요한 프로그램이라면 당연히 scanf_s를 쓰는게 맞지만 귀찮고 꼭 scanf_s를 안써도 되고 scanf가 익숙하다면 코드의 맨 위에

#define _CRT_SECURE_NO_WARNINGS

라고 입력해주면 그냥 scanf를 사용해도 오류가 발생하지 않고 잘 작동된다!


scanf_s... 처음에는 왜만들었는지 몰라서 scnaf 못쓴다는게 안타까웠는데 보안상의 문제라니... 이제 scanf_s로 연습해야겠다.

반응형

'Language > C언어' 카테고리의 다른 글

문자열에 관한 고찰(1)  (0) 2017.10.08
Palindromic 수 찾기  (0) 2017.10.01
2차원 배열과 포인터에 대해 Araboza  (0) 2017.09.26
Scanf와 &  (2) 2017.09.07