본문 바로가기

C, C++

strcpy, strncpy 대신에

C의 표준 함수 strcpy와 strncpy의 사용은 BOF (Buffer Overflow)와 관련성이 깊다. 개발자의 오류 코딩을 어느 정도 방지하기 위해 C11 이후로는 strcpy_s, strncpy_s 함수로의 사용이 권고된다.

strcpy

source(src) 포인터에 의해 지정된 문자열을 destination(dst)으로 지정된 포인터에 복사하는 역할을 수행. 복사하는 길이는 문자열의 길이만큼으로 함.

char *strcpy(char *dest, const char *src);

오류 유발 포인트

- destination 배열이 source의 문자열 크기보다 충분히 크지 않은 경우 --> destination 배열의 끝에 null 이 없어서 string의 요건을 만족하지 못함. destination 배열을 넘어서 복사 작업이 이루어지기 때문에 memory corruption을 일으킴.

- src 배열이 문자열 배열이 아닌 경우, 즉 null terminated 가 아닐 경우 오동작을 일으킴. source에서 null 문자가 나올 때까지 복사 작업을 진행하기 때문에 문제를 일으킬 수 있음.

 

권장되는 대체 함수

: destination의 크기를 지정함.

errno_t strcpy_s(char *restrict dest, rsize_t destsz, const char *restrict src);

- string.h  에 정의되어 있음

  • Parameters
  • dest : destination 문자 배열 포인터
  • src : source 문자 배열 포인터. NULL로 끝나는 배열
  • destsz : 최대 복사 길이. 일반적으로 destination 문자 배열의 크기로 함.

 

  • 리턴
  • - 성공 : 0
  • - 실패 : 0이 아닌 값. dest[0]에 0을 씀(단 dest가 null pointer가 아니어야 함. destsz가 0이 아니어야 함)

strncpy

기본 동작은 strcpy와 동일하며, 길이 인지가 추가되어 주어진 길이만큼 복사를 진행하게 됨. null character 뒤의 값은 복사하지 않음.

char *strncpy(char *dest, const char *src, size_t count);

오류 유발 포인트

- source 문자열보다 count 값이 작은 경우 --> destination 배열의 끝에 null 이 없어서 string의 요건을 만족하지 못함.   null character까지 복사하지 못해서 발생하는 문제. 

- count 값이 destination 배열보다 크기가 큰 경우 --> memory corruption을 일으킴.

권장되는 대체 함수

: destination의 크기를 지정하며, 복사할 문자의 크기 또한 지정함

errno_t strncpy_s(char *restrict dest, rsize_t destsz, const char *restrict src, rsize_t count);

- string.h에 정의되어 있음

  • Parameters
  • dest : destination 문자 배열 포인터
  • src : source 문자 배열 포인터. NULL로 끝나는 배열
  • count : 복사할 문자의 수
  • destsz : 최대 복사 길이. 일반적으로 destination 문자 배열의 크기로 함.

 

  • 리턴
  • - 성공 : 0
  • - 실패 : 0이 아닌 값. dest[0]에 0을 씀(단 dest가 null pointer가 아니어야 함. destsz가 0이 아니어야 함)

 

 

'C, C++' 카테고리의 다른 글

배열의 주소  (0) 2022.02.08
주어진 길이의 문자열 값을 얻어오는 함수 정의 방식  (0) 2022.02.07
C++ 표준의 버전  (0) 2022.02.07
C 표준 (ANSI C, ISO C, Standard C)의 버전  (0) 2022.02.07