strncpy, snprintf, strncmp 같은 버퍼 크기 지정 함수 사용시 자주 보이는 실수

프로그래밍/c,c++ 2020. 12. 6. 13:33
반응형

strncpy, snprintf : 버퍼 크기를 source 문자열 크기로 지정함 => destnation 버퍼 크기로 지정해야함

                                     개발시 동일 함수내 src 와 dst 크기가 같은 경우가 많아 문제가 발생하는 경우가 적지만 

                                     함수 인자로 src를 받을때 심각한 문제 발생함

char* src = "012345678";
char dst[5] = { 0, };

strncpy(dst, src, strlen(src)); // 버퍼 오버플로우 발생
snprintf(dst, strlen(src), "%s", src); // 버퍼 오버플로우 발생

 

strncmp : 문자열 비교를 위 함수 처럼 버퍼 크기를 벗어나지 않는 용도로 사용하여 의도치 않는 결과 발생함

                    갯수를 지정할 때는 문자열 앞 n 글자만 비교가 필요할 경우만 사용, 문자열 전체 비교는 strcmp

char* str1 = "";
char* str2 = "abcd";

strncmp(str1, str2, strlen(str1)); // return 0 : 같음, n 값이 0으로 문자 비교 없음
strncmp(str1, str2, strlen(str2)); // return 0 이 아닌값 : 다름

char* str3 = "ab";
char* str4 = "abcd";

strncmp(str3, str4, strlen(str3)); // return 0 : 같음, 앞 2글자 비교
strncmp(str3, str4, strlen(str4)); // return 0 이 아닌값 : 다름
반응형
:

strcpy, strncpy, sprintf, snprintf 안전하게 사용하기

프로그래밍/c,c++ 2020. 12. 1. 10:24
반응형

strcpy : src 의 길이가 dst 의 길이 보다 작아야 한다.

char *src = "AAA";
char dst[10] = { 0, };
if (strlen(src) < sizeof(dst) {
	strcpy(dst, src);
}

strncpy : src 길이가 dst 보다 크거나 같으면 dst 마지막에 '\0' 이 없어지기 때문에 dst length - 1로 n 값을 설정해야 한다.

char *src = "AAA";
char dst[10] = { 0, };
strncpy(dst, src, sizeof(dst) - 1);

sprintf : format 문자열이 dst를 넘지 않아야 한다.

snprintf : 길이 n의 마지막에는 '\0' 값이 들어간다는 것을 염두에 두고 길이 값을 설정한다.

char *src = "aaaaa"
int src2 = 10000

char dst[10] = { 0, };

snprintf(dst, sizeof(dst), "%s%d", src, src2); // "aaaaa1000" 마지막 문자가 짤린다.
반응형
: