2018년 3월 20일 화요일

VC 2008.NET으로 기존 소스 컨버팅하기.


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( &ltime ) ;
이런식인데요.
내부 코드를 보면 localtime()함수에서 메모리를 생성시킨뒤 그 포인터를 newtime에 붙이는 것입니다.
( 내부 코드를 디버깅해보면 쓰래드 별로 메모리를 할당하게 되어 있기 때문에 , 멀티 쓰래딩 환경에서 메모리 침범은 없습니다.)
나중에 scope를 벋어나면 삭제를 하고요.
하지만 메모리 생성/삭제는 부하가 많이 걸리는 작업이죠 . 때문에 아래와 같이 변경을 해서 성능의 향상을 시켰습니다.
tm    newtime;
localtime_s( &newtime, &ltime ) ;
newtime을 지역 변수화 시켜서 , 스택 메모리를 사용하게 했는데요. 결국은 성능의 향상을 가져 올수 있겠지요.

아래는 제가 변경했던 내용들을 간략하게 정리해 보았습니다.

  • strcpy -> lstrcpyn
  • _strdate(datebuf); -> _strdate_s(datebuf,20);
  • _strtime(timebuf); -> _strtime_s(timebuf,20);
  • newtime = localtime( &ltime ) ; -> localtime_s( &newtime, &ltime ) ;
  • 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

댓글 없음:

댓글 쓰기