어제 오늘 황당한 버그에 시달렸는데 찾아낸 결과가 너무나 황당해서 기록하고 넘어간다. 우선 아래의 소스 코드를 보자.
출력 결과를 예측하기는 어렵지 않지만, 이걸 일본어 윈도우에서 돌리면 "OOPS"를 출력한다.
일본어 윈도우에서 돌아가는 프로그램에 한글이 들어가 있다고 버럭하고 화를 낼 사람도 있을지 모르겠지만, "앵커빌" 이라는 문자들이 단순한 바이트의 나열이라고 생각한다면 있을 수 없는 일이다.
strncpy의 소스를 봐도 단순한 바이트 단위의 복사에 불과하다.
여기서 진짜 웃긴 건 저 strncpy를 strcpy로 바꾸면 한/영/일문 윈도우에서 모두 ok를 출력한다는 사실이다. strcpy와 strncpy의 문자 카피 로직은 똑같은데도 말이다.
int _tmain(int argc, _TCHAR* argv[])
{
std::string anchor = "앵커빌";
char temp[128] = {0, };
_tcsncpy(temp, anchor.c_str(), 128);
if ( !strcmp(temp, anchor.c_str()) )
std::cout << "OK" << std::endl;
else
std::cout << "OOPS" << std::endl;
return 0;
}
{
std::string anchor = "앵커빌";
char temp[128] = {0, };
_tcsncpy(temp, anchor.c_str(), 128);
if ( !strcmp(temp, anchor.c_str()) )
std::cout << "OK" << std::endl;
else
std::cout << "OOPS" << std::endl;
return 0;
}
출력 결과를 예측하기는 어렵지 않지만, 이걸 일본어 윈도우에서 돌리면 "OOPS"를 출력한다.
일본어 윈도우에서 돌아가는 프로그램에 한글이 들어가 있다고 버럭하고 화를 낼 사람도 있을지 모르겠지만, "앵커빌" 이라는 문자들이 단순한 바이트의 나열이라고 생각한다면 있을 수 없는 일이다.
strncpy의 소스를 봐도 단순한 바이트 단위의 복사에 불과하다.
while (count && (*dest++ = *source++)) /* copy string */
count--;
count--;
여기서 진짜 웃긴 건 저 strncpy를 strcpy로 바꾸면 한/영/일문 윈도우에서 모두 ok를 출력한다는 사실이다. strcpy와 strncpy의 문자 카피 로직은 똑같은데도 말이다.
