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
...이 외에도 여러가지 더 있다.
추가적으로 _s를 추가한 함수의 경우 원래 함수와 인수조건이 다를 수 있습니다.
strcpy_s 함수는 strcpy 함수의 단점을 보안하기 위해서 만들어진 함수이고 string.h 헤더 파일에 아래와 같이 선언되어 있습니다.
errno_t strcpy_s(char *dest, rsize_t dest_size, const char *src);
errno_t strcpy_s(char *dest, rsize_t dest_size, const char *src);
함수의 원형을 보면 strcpy 함수와 유사하지만 dest 변수와 src 변수 사이에 dest가 가리키는 메모리의 크기를 적는 매개 변수가 추가되었습니다. 따라서 아래와 같이 strcpy_s 함수를 사용할 때는 복사될 메모리의 크기를 두 번째 인자에 꼭 적어야 합니다.
char str[4]; strcpy_s(str, 4, "test");
char str[4]; strcpy_s(str, 4, "test");
이제 위 코드를 실행하면 strcpy 함수일 때는 잠재적 오류 상태가 되었지만 strcpy_s 함수를 사용하면 프로그램 실행 시에 아래와 같은 디버그 오류 창이 표시됩니다. 따라서 자신의 소스 코드 중에 어떤 코드에서 오류가 발생한 것인지 좀 더 편하게 찾을 수 있습니다.
취약점을 보완한 새로운 함수들을 사용하는게 아닌 다른 해결방법들이 있습니다.
- 프로젝트 파일 맨 위에 #define _CRT_SECURE_NO_WARNINGS 코드를 추가합니다.
- SDL 검사를 해제합니다.
두가지 방법 중에 한가지만 사용하면 됩니다.
1번은 말 그대로 파일 맨 위에 #define _CRT_SECURE_NO_WARNINGS 를 추가하면 됩니다.
1. #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 기준으로 프로젝트를 생성할때 미리 검사를 체크 해제하거나,
Visual Studio 2019에서 찾아보려 했지만, 끝내 못찾았습다.
프로젝트를 생성 후, 위에 내비게이션 바에서
프로젝트 > 속성 > C/C++ > 일반 에 들어가서 SDL검사를 아니요로 바꾸면 됩니다.
참고 출처:
'코딩 | 개념 정리 > C' 카테고리의 다른 글
[C언어] 함수를 활용해 짝수/홀수, 절대값, 음수/양수/0 판별하기 (0) | 2021.04.10 |
---|---|
[C언어] 함수를 활용해 실수를 정수로 반올림하기 (0) | 2021.04.09 |
[C언어] 함수를 활용해 윤년인지 판단하기 (0) | 2021.04.09 |
[C언어] 함수를 활용해 원의 면적 구하기 (0) | 2021.04.09 |
[C언어] 함수를 활용해 입력값의 알파벳 여부 판단하기 (0) | 2021.04.09 |