'snprintf'에 해당되는 글 2건

  1. 2020.12.06 strncpy, snprintf, strncmp 같은 버퍼 크기 지정 함수 사용시 자주 보이는 실수
  2. 2020.12.01 strcpy, strncpy, sprintf, snprintf 안전하게 사용하기

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" 마지막 문자가 짤린다.
반응형
: