헬마입니다.

오늘은 우연히 기존에 작성했던 라이브러리의 코드를 재구성하면서 다시 검토하게 되었습니다.

전에 이곳에도 잠깐 올렸던 코드인데요. - Http Web Post 클래스라고 해서 올린 적이 있습니다.

재구성하면서 보니 버그가 있네요. ㅠㅠ

코드는 깔끔하게 보시려면 여기서 보시면 되구요.

그냥 보시려면 글을 밑에 올립니다.

bool CHttpPost::AddItem(const std::string& strName, const std::vector<std::string>& vecData )
{
 if( vecData.empty() )
  return false;

 for( std::vector<std::string>::const_iterator iter = vecData.begin(); iter != vecData.end(); ++iter )
 {
 #ifdef UNICODE
  DWORD dwPostData = strlen(iter->c_str()) * sizeof(wchar_t) + 1 * sizeof(wchar_t);

  wchar_t *pszPostData = new wchar_t[ dwPostData ];
  ZeroMemory(pszPostData, dwPostData);

  int nPostResult = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, iter->c_str(), strlen(iter->c_str()), pszPostData, dwPostData);

  dwPostData = strlen( strName.c_str() ) * sizeof(wchar_t) + 1 * sizeof(wchar_t);

  wchar_t *pszName = new wchar_t[ dwPostData ];
  ZeroMemory(pszName, dwPostData);

  int nNameResult = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, strName.c_str(), strlen(strName.c_str()), pszName, dwPostData);

  if( nPostResult > 0 && nNameResult > 0 )
   AddItem(tstring(pszName, nNameResult), tstring(pszPostData,nPostResult), true);

  if( pszName )
   delete [] pszName;
  if( pszPostData )
   delete [] pszPostData;
 #else
  AddItem(strName, *iter, true);
 #endif
 }

 return true;
}

코드를 보셨나요? 어느부분에 버그가 있을까요?
.
.
.
.
윈도 운영체제의 인코딩 변환함수인 MultiByteToWideChar 와 WideCharToMultiByte 함수는 은근히 사용하기 까다롭기로 유명합니다. 거기에 신경을 쓰다가 다른부분에 방심을 하고 말았네요.
윈도 운영체제의 인코딩 변환함수는 매개변수로 변환되서 저장될 공간을 직접 할당하고 그 크기를 알려줘야하는데요.
이게 두 함수가 살짝 달라서 헷갈리게 합니다.

하지만, 위의 코드는 버그는 거기에 있는게 아니었습니다.

잘 보시면 dwPostData 로 처음에 변환이 수행된 문자열이 저장될 공간을 할당하기 위해 크기를 계산합니다.
그리고 이 값을 그래도 new char 나 new wchar_t 에 사용하고 있는데요 . 사실 dwPostData 의 값은 바이트단위로 계산한 값이지
new 에 사용할 문자열의 갯수를 계산한 값이 아니라 최대 2배까지 공간이 더 할당되고 사용되지 않는 버그가 만들어지고 말았네요.

코드 자체가 작동하는데에는 문제가 없지만 이런 잠재적인 위험의 코드도 만들어서는 안되겠죠 ^^

오늘 코드를 옮기면서 새삼 깨닫고 말았네요. ^^

p.s strlen 등의 문자열 길이 함수는 널 문자를 제외한 길이를 반환해주기 때문에 이 길이를 토대로 new 로 할당할때는 널문자가 들어갈 공간만큼 (보통 1글자) 추가로 할당해줘야 합니다. 이를 까먹으면 문자열뒤에 이상한 글자가 연이어 붙어있는 짜증스런 상황을 겪게되죠 ^^

댓글을 달아 주세요

  1. 푸른하마 2009.05.30 11:58 Address Modify/Delete Reply

    봐두 모른다눈.