2010. 5. 8. 2:06
이번에 회사에서 새롭게 데스크탑을 지급 받아 VC를 설치하면서 2008.NET 버전으로 설치를 했네요.
현재 코드가 2005까지 호환이 되는 관계로 다시 2008버전으로 컨버팅을 하면서 수정했던 내용들을 정리해 보았습니다.
( 사실 좀 늦은 감이 있네요. 나온지 2년이나 된 컴파일러를 지금 논의하는것 자체가 게을러 보일 수도 있겠네요 ^^ )
변환하면서 느낀점은 기본적으로는 아래와 같은 의미있는 변화가 있었다는 점이네요.
1. 보안 향상
sprintf 등의 함수가 대표적인데요.
첫번째 파라메터로 받는 문자열버퍼에 대한 사이즈가 지정되지 않았었기 때문에 buffer overflow 공격이나 , 개발자의 실수로 인한 메모리 관련 오류들을 발생시키는 경우가 많았던 함수지요.
물론 MS에서는 <strsafe.h> 에 있는 함수 셋을 사용 권장했지만, 기존의 sprintf 함수를 사용 못하게 하지는 않았습니다.
2008 버전에서는 warnning를 표시해 줘서 , 개발자들에게 모두 바꿀것을 권장하는 군요.
ex)
char szBuf[20];
sprintf(szBuf,"%s","test is good"); -> sprintf_s(szBuf,20,"%s","test is good");
2. Heap 메모리 사용을 줄여서 작동 속도 향상
localtime 등의 리턴을 포인터로 받는 함수가 대표적인 경우인데요.
이것 정말 웃긴 함수인게 리턴을 포인터로 한다는 점입니다.
tm * newtime;
newtime = localtime( <ime ) ;
이런식인데요.
내부 코드를 보면 localtime()함수에서 메모리를 생성시킨뒤 그 포인터를 newtime에 붙이는 것입니다.
( 내부 코드를 디버깅해보면 쓰래드 별로 메모리를 할당하게 되어 있기 때문에 , 멀티 쓰래딩 환경에서 메모리 침범은 없습니다.)
나중에 scope를 벋어나면 삭제를 하고요.
하지만 메모리 생성/삭제는 부하가 많이 걸리는 작업이죠 . 때문에 아래와 같이 변경을 해서 성능의 향상을 시켰습니다.
tm newtime;
localtime_s( &newtime, <ime ) ;
newtime을 지역 변수화 시켜서 , 스택 메모리를 사용하게 했는데요. 결국은 성능의 향상을 가져 올수 있겠지요.
아래는 제가 변경했던 내용들을 간략하게 정리해 보았습니다.
- strcpy -> lstrcpyn
- _strdate(datebuf); -> _strdate_s(datebuf,20);
- _strtime(timebuf); -> _strtime_s(timebuf,20);
- newtime = localtime( <ime ) ; -> localtime_s( &newtime, <ime ) ;
- sprintf -> sprintf_s
- if ((infile=fopen(file, "rb")) == NULL) -> if ((err = fopen_s( &infile,file, "rb")) !=0 )
- while((n=_vsnprintf(szQuery, nQueryLength-1, szBuff, argptr))<0) -> while((n=vsnprintf_s(szQuery, nQueryLength-1, _TRUNCATE, szBuff, argptr))<0)
- vsprintf( buf, format, arg ); -> vsprintf_s( buf,500, format, arg );
- itoa(cOpt2,szBuff,10); -> itoa_s(cOpt2,szBuff,10,10);
- tok = strtok(buf,":"); -> tok = strtok_s(buf,":",&next_tok);
참고로 하위 버전의 호환성을 고려해서 제 경우는 아래와 같이 작업을 했습니다.
#if _MSC_VER > 1400 // 1300 = 2003 .NET , 1400 = 2005 .NET, 1500 = 2008.NET
char *next_token;
token = strtok_s(szBuf,szTkn, &next_token);
#else
token = strtok(szBuf,szTkn);
#endif
char *next_token;
token = strtok_s(szBuf,szTkn, &next_token);
#else
token = strtok(szBuf,szTkn);
#endif
댓글 없음:
댓글 쓰기