이름

strlcpy , strlcat – 크기가 제한된 문자열 복사 및 연결

도서관

BSD 시스템의 유틸리티 함수 (libbsd, -lbsd)

개요

#include

size_t

strlcpy ( char * dst , const char * src , size_t size );

size_t

strlcat ( char * dst , const char * src , size_t size );

기술

strlcpy () 및 strlcat () 함수는 문자열을 각각 복사하고 연결합니다. strncpy (3) 및 strncat (3)에 대한보다 안전하고 일관성 있고 오류가 발생하지 않는 대체품으로 설계되었습니다. 이러한 함수와 달리 strlcpy ()와 strlcat ()은 버퍼의 전체 크기 (길이뿐만 아니라)를 취하고 결과가 NUL- 종료되도록 보증합니다 ( 크기 가 0보다 크거나 strlcat ()의 경우) , 적어도 하나의 바이트가 dst에 없는 한). NUL의 바이트는 크기에 포함되어야합니다. 또한 strlcpy ()와 strlcat ()는 진정한 ”C ”문자열에서만 작동합니다. 이것은 strlcpy ()에 대해 src 가 NUL 종료되어야하고 strlcat ()에 대해 srcdst 가 모두 NUL 종료되어야 함을 의미합니다.

strlcpy () 함수는 최대 1 문자를 NUL 종료 문자열 src 에서 dst복사 하고 NUL은 결과를 종료합니다.

strlcat () 함수는 NUL 종료 문자열 srcdst 의 끝에 추가합니다. 대부분의 size – strlen (dst) – 1 바이트를 추가하고 NUL은 결과를 종료합니다.

반환 값

strlcpy () 및 strlcat () 함수는 생성하려고 시도한 문자열의 전체 길이를 반환합니다. strlcpy ()는 src 의 길이를 의미한다. strlcat ()은 dst 의 초기 길이 + src 길이를 의미합니다. 이것이 다소 혼란스럽게 보일 수 있지만 절단 감지를 간단하게하기 위해 수행되었습니다.

그러나 strlcat ()이 NUL을 찾지 않고 크기 문자를 탐색하는 경우 문자열의 길이는 크기 로 간주되고 대상 문자열은 NUL 종료되지 않습니다 (NUL에 대한 공간이 없으므로). 이렇게하면 strlcat ()이 문자열의 끝에서 벗어나지 않게됩니다. 실제로 이것은 ( 크기 가 올바르지 않거나 dst 가 적절한 ‘C’문자열이 아님을 의미하므로) 발생하지 않아야합니다. 이 검사는 잘못된 코드의 잠재적 보안 문제를 방지하기 위해 존재합니다.

예제들

다음 코드 단편은 간단한 경우를 보여줍니다.

char * s, * p, buf [BUFSIZ];

(void) strlcpy (buf, s, sizeof (buf));
(void) strlcat (buf, p, sizeof (buf));

경로명을 만드는 동안 절단을 감지하기 위해 다음과 같은 것을 사용할 수 있습니다 :

char * dir, * file, pname [MAXPATHLEN];

if (strlcpy (pname, dir, sizeof (pname))> = sizeof (pname))

goto toolong;

if (strlcat (pname, file, sizeof (pname))> = sizeof (pname))

goto toolong;

처음으로 얼마나 많은 문자가 복사되었는지 알 수 있기 때문에, append가 아닌 copy를 사용하여 약간의 속도를 낼 수 있습니다 :

char * dir, * file, pname [MAXPATHLEN];
size_t n;

n = strlcpy (pname, dir, sizeof (pname));
if (n> = sizeof (pname))

goto toolong;

if (strlcpy (pname + n, file, sizeof (pname) – n)> = sizeof (pname) – n)

goto toolong;

그러나 strlcpy () 및 strlcat ()의 전체 목적을 무력화 시키므로 이러한 최적화의 유효성에 의문을 가질 수 있습니다. 사실이 매뉴얼 페이지의 첫 번째 버전은 잘못되었습니다.

참고 사항

snprintf (3), strncat (3), strncpy (3)

역사

strlcpy ()와 strlcat () 함수는 OpenBSD 2.4에 처음 등장하여 FreeBSD 3.3에 등장했습니다.

BSD 4 월 14 일 BSD