관심쟁이 영호

scanf ? scanf_s ? 어떤 차이가 있을까? 본문

IT/에러의 왕!

scanf ? scanf_s ? 어떤 차이가 있을까?

관심쟁이 영호 2020. 2. 20. 01:50
반응형

 

 

안녕하세요 최고왕입니다!

오늘은 scanf / scanf_s의 차이에 대해서 알아볼까 해요!

결론부터 말씀드리자면!

 

Scanf?

scanf는 버퍼 오버플로우라는 문제가 발생할 위험이 상당히 커요!

그래서 scanf_s를 새롭게 만들게 된 유래가 있죠!

 

버퍼 오버플로우?

버퍼 오버플로 또는 버퍼 오버런을 사전적 의미로 먼저 봅시다!

 

위키백과에서 버퍼 오버플로는

 

"프로세스가 데이터를 버퍼에 저장할 때 프로그래머가 지정한 곳 바깥에 저장하는 것을 의미한다."

 

라고 설명하네요!

 

 

버퍼?

그럼 버퍼가 무엇인지 알아봅시다!

 

위키백과에서 사전적 의미로 보면!

 

"버퍼는 데이터를 한 곳에서 다른 한 곳으로 전송하는 동안 일시적으로 그 데이터를 보관하는 메모리 영역이다."

 

이 말은 즉슨

 

주방에서 요리를 한다고 했을 때!

 

요리를 완성하기 위해서는 재료 준비, 재료 손질 등등 여러 가지 일을 해야 하는데요!

 

이 일을 하기 위해선 순차적으로 해야 하죠..

 

우리는 여러 가지 일을 한 번에 할 수 없으니까!

 

그리고 모든 일은 순서가 있는 법이니까!

 

컴퓨터도 마찬가지라고 생각하시면 돼요!

 

컴퓨터 안의 프로세스 사이에서 데이터를 이동시킬 때 사용되는 게 버퍼예요!

 

흔하게 네트워크 상에서 자료를 주고받을 때나 스피커 소리를 재생할 때!

 

하드웨어의 입출력을 결합할 때 자주 사용됩니다.

 

여하튼! 복잡하고!

 

한마디로 컴퓨터가 데이터를 다루는데 아주 효율적으로 다루기 위해서 버퍼를 사용한다는 소리예요!

 

오버플로우가 되는 게 뭐가 어때서?

 

음 우리가 배열을 만든다고 생각합시다!

 

배열의 크기는 10이고 안에 정보 값들이 저장되어있어요!

 

근데 우리가 프로세스를 구동하면서

 

이 배열은 A라는 버퍼에 저장이 되는 순간이 있어요!

 

근데 만약에 A라는 버퍼에 10이라는 크기를 넘어서는 데이터를 저장하게 되는 순간이 올 테죠.

 

그러면 컴퓨터는 10이라는 크기를 넘어서서 넘친 데이터를 다른 곳에다가 저장하게 돼요!

 

그러면 데이터는 오염이 되는 거예요!

 

이를 악용하여 악의적 프로그래머들이 잘못된 용도로 그 정보를 사용할 가능성도 아주 높아요!

 

그래서 데이터 오염, 악의적 프로그래머 등등 여러 가지의 안 좋은 이유 때문에

 

scanf_s를 권장하게 되는 겁니다!

 

scanf_s??

 

scanf_s는 scanf와 어떤 점에서 다르냐!!

 

scanf_s는 scanf와는 다르게 사이즈를 넘어서게 된다면 아예 저장을 하지 않아요!

 

그래서 버퍼 오버플로우 현상이 일어나지 않죠!

 

scanf를 계속 사용하고 싶다면!

 

첫 부분에

#define _CRT_SECURE_NO_WARNINGS라는 코드를 쳐줍니다!

그러면 컴퓨터는 scanf를 scanf_s로 바꾸게 됩니다.

 

 

여기까지 최고왕이었습니다.

 

읽어주셔서 진심으로 감사드립니다.

 

 

 

 

 

 

 

 

 

 

300x250
Comments