상세 컨텐츠

본문 제목

Scanf에러 C4996해결에 대한 메뉴얼

Game/게임개발

by 듀_77 2020. 5. 6. 10:00

본문

반응형

 

C언어 강의를 듣다가 예제파일을 푸는데

Scanf에러(Scanf error)가 났다.

C4996이라는 넘버를 가지고 있는 이 에러때문에

컴파일이 안돼서 해결방법을 전부 찾아 포스팅할 예정이다.

 

여러가지 방법들이 있는데 최대한 

알기 쉽게 정리할 것이다.

 

*참고로 툴은 visual studio 사용중입니다.

*C4996의 원인?: 해당 표준 함수가 visual studio에서

보안 문제로 depricated되었기 때문이다.

 

BOF(Buffer overflow)에 취약한 함수들이 주로 

이 에러에 걸리게 된다.

(버퍼 오버플로우의 경우 시스템 해킹에

치명적이기 때문에 조심해야함)

 

-버퍼 오버플로: 해킹 방법 중 하나로, 데이터 영역까지

무단 침범하여 코드를 실행하게끔 한다.

마치 500ml 잔에 1리터짜리 액체를 들이붓는 격.

(이 개념은 추가로 포스팅 업로드할 예정)

그렇다면 이 에러에 관한 해결방법은 무엇인가.

 

우선 ms에서 제시해준 방법 2가지가 있다.

 

이 기능이 안전하지 않을 수 있으니 

1. scanf_s함수를 고려해보라는 말.

2. 혹은 CRT_SECURE_NO_WARNINGS 선언을 해보라는 말.

 

자세한 건 하이퍼링크된 C4996을 누르면

마이크로소프트가

Scanf에러(Scan error) 해결방법을 친절하게 알려준다. 

 

이런식으로 해당 에러에 대한 설명과 밑에

해결메뉴얼을 제시해준다.

사실 영어로 봐도 한국어로 봐도 뭔 소린지

초보자 입장에서는

잘 모르겠기 때문에

구글링 ㄱㄱ

 

일단 나의 에러는 다행히도 ms에서 제시해준

1번. Scanf대신 scanf_s를 써보세요. 에서 해결됐다.

 

★가장 좋은 방법임

정상적으로 작동되는 모습.

아마 강사님이 쓰시는 툴과 내가 쓰는 툴이 달라서

일어난 오류인듯하다.

 

그 다음 해결방법 

2번. #define CRT_SECURE_NO_WARNINGS 선언해주기.

 

가장 맨 처음 앞줄에 저 문장을 선언해주면

보안 검사가 무시되면서 scanf 함수도 

무사히 사용 가능하다.

 

 

3번. #programa warning (disable: 4996) 써주기.

 

역시나 가장 맨 처음 앞 줄에 위 문장 선언해주기.

위에 방법은 보안 테스트를 무시하는 건데

이건 에러 자체를 무시한다는 뜻이다.

 

4번. 속성->C/C++->일반에 들어가서

SDL 검사에 '아니오' 체크해주기.

 

보안 검사를 무시해줌으로써, 에러를 해결하는 방법이다.

에러가 warning 레벨로 내려간다는 건데

경고 문구가 뜨면서 컴파일은 가능해진다.

 

그러나 SDL검사가 다른 부분에도 많이 쓰이므로,

웬만하면 체크 해제 안 하는게 낫다.

Scanf는 에러가 일어나는데 왜 scanf_s는 멀쩡한걸까?

 

그건 scanf_s의 s가 size를 의미하기 때문이다.

일반 스캔에프함수는 입력받는 문자열의 크기를

체크하지 않는 것이 치명적인 문제점이다.

 

이것이 왜 문제가 되냐면 공간의 크기가 1,000인 곳에

일부러 10,000개를 입력해서

해킹을 시도할 수 있기 때문이다.

 

 scan_f 함수는 라스트 인자에 배열의 '사이즈'를 제시해준다.

즉, 배열 크기보다 오버되는 글자가 입력되면

그걸 저장하지 않는다.

 

이상 비주얼스튜디오에러 중 하나인 C4996에 

대한 해결방법 포스팅 끝!

반응형

관련글 더보기

댓글 영역