티스토리 뷰

안전한 문자열 함수

- StringCbCopy : 버퍼의 크기 ( 버퍼가 몇 바이트의 크기인가 )
HRESULT StringCbCopy ( 
   OUT LPTSTR pszDest,				// 복사 결과를 저장할 버퍼
   IN size_t cbDest, (sizeof(TCHAR))		// 복사 결과를 저장할 버퍼의 크기 => pszDest의 크기
   IN LPCTSTR pszSrc				// 복사 원본 (NULL 포함된 문자열)
) 

- StringCchCopy : 버퍼의 길이 ( 버퍼가 문자열 몇 개를 담는가 )

HRESULT StringCchCopy ( 
   OUT LPTSTR pszDest,				// 복사 결과를 저장할 버퍼
   IN size_t cchDest, (STRSAFE_MAX_CCH)		// 복사 결과를 저장할 버퍼의 크기 => 저장할 글자 수
   IN LPCTSTR pszSrc				// 복사 원본 (NULL 포함된 문자열)
) 


- 반환값(HRESULT) : 함수의 성공여부, 성공한 경우 S_OK



특징

strsafe.h 헤더에 위와 같은 함수가 포함되어 있으므로 이 함수들을 사용하기 위해서는 strsafe.h 헤더파일을 포함시켜야한다.


사용 이유

기존에는 strcpy같은 함수를 사용했지만 그러면 아래의 예제를 통해 어떤 문제가 발생하는지 보겠다.
TCHAR* temp = "string copy"
TCHAR  buf[3];
_tcscpy(buf, temp);

위와 같은 경우, buf보다 큰 size인 temp를 복사할 경우, buf에 할당된 영역을 넘게되므로 버퍼 오버플로우 현상이 일어날 수 있다.

이러한 문제를 예방하기 위해 안전한 문자열 함수를 사용해야한다.


예제

- StringCbCopy
TCHAR tszTemp[256] = { 0x00, };
TCHAR *src = "Hello World";
StringCbCopy(tszTemp, sizeof(tszTemp), src)))  


- StringCchCopy
TCHAR tszTemp[256] = { 0x00, };
TCHAR *src = "Hello World";
StringCchCopy(tszTemp, RTL_NUMBER_OF(tszTemp), src);


- RTL_NUMBER_OF(A) = sizeof(A)/sizeof((A)[0])) // return the number of elements in statically sized array.

'programming language > c++' 카테고리의 다른 글

[c++] struct와 class의 차이  (0) 2018.06.14
[c++] freind 함수  (0) 2018.06.12
[c++] StringCbCopy, StringCchCopy  (1) 2018.06.12
[c++] malloc/free, new/delete  (0) 2018.06.11
[C++] MultiByteToWideChar, WideCharToMultiByte 함수  (0) 2018.06.07
[c++] 참조(reference)  (0) 2018.06.01
댓글
댓글쓰기 폼