안전한 null-terminated 문자열 복사 (strncpy vs. snprintf)
Programming / 2009. 11. 12. 11:33
어제 회사에서 한분이 문자열 복사에 대한 질문을 하셨습니다.
처리 결과를 문자열로 복사하여 리턴하는 부분의 코드였습니다.
그분의 코드를 리뷰하던 중에 다음과 같은 코드를 발견했습니다.
strncpy(rtString, "이건 이래서 실패했습니다.", sizeof(rtString));
해당 코드는 위험한 부분이 있습니다. 복사하고자 하는 문자열의 길이가 sizeof(rtString)의 크기보다 작다면 null 문자까지 정상적으로 복사되지만 그 크기를 넘어간다면 문제가 될 수 있습니다.
당장은 buffer overflow가 발생하지 않지만, 추후 rtString을 출력하거나, 복사할때 큰 문제가 생길수 있습니다.
strncpy()의 man page를 보면 다음과 같이 기술하고 있습니다.
The strncpy() function is similar, except that not more than n bytes of src are copied. Thus, if there is no null byte among the first n bytes of src, the result will not be null-terminated.
이와같은 경우에는 snprintf() 쓰는 것이 더 안전합니다. 다음 예제를 보겠습니다.
위 코드의 실행 결과는 다음과 같습니다.
strncpy = 12345*****
snprintf = 1234
결과에서 snprintf()는 입력된 버퍼의 길이에 맞게 null 문자까지 포함하여 안전하게 복사해 주고 있습니다.
사실 매우 초보적인 내용일 수 있지만 잘 알지 못하고 쓰면 나중에 큰 화를 부를수도 있기에 정리해봤습니다^^
'Programming' 카테고리의 다른 글
여러분의 소스코드는 안녕하십니까? (7) | 2009.11.24 |
---|---|
개발언어와 개발스타일 (5) | 2009.11.23 |
Subtype Polymorphism과 성능 이슈 (4) | 2009.11.17 |