본문 바로가기

C언어/C_지식_정리

[C언어] This function or variable may be unsafe 에러 문제 해결

C언어를 하다보면 코드상 문제가 없어 보이지만 에러가 발생한다면 고려해 봐야할 해결법이다.

에러에 저런 문구가 포함 되어있는 경우에 해결방법이다.

(여기서 --- 는 어떤 변수나 함수를 대체한다.)

'---' :This function or variable may be unsafe. Consider using --- instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS.

먼저, 에러가 뜨는 원인부터 간단하게 설명하면, C언어 책이나 인터넷 강좌에서 가르치는 함수들 중 몇개는 함수에 취약점이 있기 때문에 에러가 나는것이다. 위에 에러코드도 자세히 읽어보면 '이 함수나 변수는 안전하지 않을 수 있습니다.' 라고 적혀있다.

유명한 해킹 기법인 스택 버퍼 오버플로우 기법이 strcpy를 사용했기 때문에 일어나게 되는것이다.

보통, 취약점이 있는 함수를 대체하는 새로운 함수들이 이미 존재하지만, 코딩을 아직 배우는 중이며 시판에 내놓아서 프로그램을 파는것이 아니라면 차후에 알아둬도 된다.

취약점이 있는 함수의 예시 와 그를 대체하는 함수들
scanf -> scanf_s

strcpy -> strcpy_s

strcat -> strcat_s

sprintf -> sprintf_s

fopen -> fopen_s

...이 외에도 여러가지 더 있다.

취약점을 보완한 새로운 함수들을 사용하는게 아닌 다른 해결방법들이 있다.

  1. 프로젝트 파일 맨 위에 #define _CRT_SECURE_NO_WARNINGS 코드를 추가한다.
  2. SDL 검사를 해제한다.

두가지 방법 중에 한가지만 사용하면 된다.

1번은 말 그대로 파일 맨 위에 #define _CRT_SECURE_NO_WARNINGS 를 추가하면 된다.

#define _CRT_SECURE_NO_WARNINGS 추가
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
	int num;
	scanf("%d", &num);
	printf("%d", num);
	return 0;
}

 

2번은 프로젝트를 만들 때 SDL검사를 해제하거나, 프로젝트 속성에서 제거하는 방법이다.

Visual Studio 2017 기준으로 프로젝트를 생성할때 미리 검사를 체크 해제하거나,

프로젝트를 생성 후, 위에 내비게이션 바에서 

프로젝트 > 속성 > C/C++ > 일반 에 들어가서 SDL검사를 아니요로 바꾸면 된다.

속성을 눌렀을때 나오는 탭

해결법이 있어도 나중에 보완된 함수들을 알아두는 것도 좋다.