63 lines
1.8 KiB
Plaintext
63 lines
1.8 KiB
Plaintext
========================================================================
|
|
!!! 클라이언트 스트링 처리 관련 주의 사항. !!!
|
|
|
|
- 오버런 문제.
|
|
|
|
작성일 : 오후 6:26 2006-05-30
|
|
|
|
작성자 : 유재영
|
|
|
|
NOTE : 잘못된 내용이 있다면 수정/보완 부탁 드립니다.
|
|
========================================================================
|
|
|
|
|
|
1. 개요
|
|
스트링 혹은 스트림 카피 부분에서 메모리 Overrun 이 발생하여
|
|
클라이언트가 크레쉬 될 수 있는 위험이 잠재해 있습니다.
|
|
|
|
2. 처리 방법
|
|
- 함수 사용
|
|
Sprintf -> Snprintf
|
|
strcpy -> _strncpy
|
|
|
|
Snprintf 는 메크로 이며 유니코드로 변환 했을때 지원가능한 함수로
|
|
메칭해 두었습니다.
|
|
이 함수는 NULL 종료자가 없더라도 크레쉬가 나지 않도록 특정 사이즈만큼의
|
|
스트링을 만들어 줍니다.
|
|
|
|
_strncpy은 Utility 프로젝트에 safe_String.h/cpp 에 정의 되어있습니다.
|
|
|
|
- 사이즈 관련 처리
|
|
멕스 사이즈 에 + 1을 한다음 초기화 후 정보를 특정 사이즈 만큼만 복사한다.
|
|
|
|
ex)
|
|
TCHAR szTest[MAX_SIZE+1];
|
|
|
|
ZeroMemroy(szTest, MAX_SIZE+1);
|
|
Snprintf(szTest, MAX_SIZE, "%s %d", param1, param2 );
|
|
//or
|
|
_strncpy(szTest, 특정 스트링, MAX_SIZE );
|
|
|
|
|
|
3. 관리
|
|
결과적으로 클라이언트에서 쓰는 스트링 관련 변수는 배열을 직접 사용하는것보다는
|
|
특정 배열로 받아진 스트링 정보를 std::_tstring 을 이용해서 사용하고
|
|
외부에선 해당 스트링을 직접 사용하기보다는 GetName(), SetName() 함수와 짝을 이뤄서
|
|
사용하는 편이 관리적으로 좋을듯 합니다.
|
|
|
|
#define SUNSTRING util::_tstring
|
|
|
|
const SUNSTRING & GetName() const;
|
|
const TCHAR * GetName() const;
|
|
|
|
void SetName( SUNSTRING & rStrName );
|
|
void SetName( const TCHAR * pszName );
|
|
|
|
|
|
!! 위 사항은 모두 알고 있는 내용이라 생각 됩니다.
|
|
허무하게 메모리 오버런을 양산하지 않으려면 위의 사항을
|
|
지켜주시기 바랍니다. 저도 조심 하겠습니다.
|
|
--> 추가작업은 물론이거니와 이전 코드도 위의 내용으로 수정작업을 진행 해야합니다.
|
|
|
|
|