[펌] 윈도우 안전한 프로그래밍[Runtime Check]
런타임 검사
[편집]개요
런타임 검사는 Runtime Check, RTC라고 한다. Visual Studio 2008을 기준으로 보면 [프로젝트 - 속성 - 구성 속성 - C/C++ - 코드 생성] 메뉴에 관련 옵션이 있다. 작은 형식 검사 (/RTCc), 기본 런타임 검사 (/RTC1, /RTCsu)가 런타임 검사에 속한다.
- /RTCc
더 큰 데이터 형식의 값을 더 작은 데이터 형식에 할당할 때 데이터 손실이 발생할 수 있음을 결고한다. 예를 들어 INT64 변수 값을 INT32 변수에 할당하는 경우가 이에 해당한다. 물론 이러한 할당이 의도적이고 정확한 연산일 수도 있기 때문에 아무 때나 오류 메시지를 내보내진 않는다. 값 할당 시에 비트 연산자를 명시적으로 사용하면 RTCc 검사에 걸리지 않는다.
#include <crtdbg.h> char get8bits(int value, int position) { _ASSERT(position < 32); return (char)(value >> position); // Try the following line instead: // return (char)((value >> position) && 0xff); } int main() { get8bits(12341235,3); }
- /RTCs
스택 프레임 런타임 오류 검사를 수행한다. MSDN 라이브러리 문서를 읽고 어떤 식으로 문제를 탐지해내는지 알아두면 커스텀 스택 메모리 할당자를 개발할 때 도움이 된다. Earlgrey 프로젝트의 StackAllocator는 이러한 사례 중 하나이다.
- /RTCu
초기화되지 않은 변수가 사용될 때 보고한다.
- /RTC1, /RTCsu
/RTC1은 /RTCsu를 뜻한다.
[편집]언제 쓰는가?
/RTC 옵션은 컴파일러가 탐지 기능을 삽입해 넣으므로 성능에 영향을 미친다. 더군다나 /RTC 옵션이 설정되면 최적화(optimize pragma, /O)도 되지 않는다. 그러므로 DEBUG 빌드 때에만 /RTC 옵션을 켜는 게 좋다.
[편집]boost::numeric_cast 와 /RTCc
/RTCc 옵션을 켠 상태로 boost::numeric_cast를 쓰다 보면 런타임 오류 메시지를 마주치게 된다.
TEST(EarlgreyMathTest, UIntToInt64) { EARLGREY_STATIC_ASSERT(UINT_MAX < _I64_MAX); UINT src = 123; INT64 dst = EARLGREY_NUMERIC_CAST<INT64>(src); ASSERT_EQ(123, dst); }
boost::numeric_cast 내부에서 비트 연산을 명시적으로 써서 컴파일러가 올바른 타입 변환임을 알게 해주었더라면 이런 문제가 없었을 것이다. 이 문제를 해결하려면 크게 두 가지 방법이 동원 가능하다.
- boost::numeric_cast의 소스 코드를 고친다. 물론 써드파티 라이브러리를 손 대기 시작하면 이후에 최신 버전으로 업그레이드할 때 골이 아프다.
- #pragma runtime_checks 지시자를 활용한다. 이 지시자를 사용하면 일부 함수에 한해 특정 런타임 검사를 무효화할 수 있다. 일반적으로 이 지시자로 문제 해결이 가능하지만 안타깝게도 boost::numeric_cast처럼 템플릿 함수일 때는 그렇게 상황이 단순하지 않다. 다양한 이슈가 있기 때문에 뒤에서 따로 이 문제를 다룬다. 여기선 /RTCc 옵션틀 끄는 편이 나을 수도 있다는 것만 언급한다.
[편집]/RTCc 와 #pragme runtime_checks
'Tip & Tech' 카테고리의 다른 글
[펌] Tistory에서 source code Syntax highlight 이용하기 (0) | 2011.06.11 |
---|---|
[펌] Visual studio Debuging Tip (0) | 2011.06.11 |
[펌] fatal error C1083: 미리 컴파일된 헤더 파일을 열 수 없습니다. (0) | 2011.06.11 |
[펌] float -> int 형변환 정리 (2) | 2011.06.08 |
[펌] 기업에서까지 완전 무료 프로그램 - 진정한 FREE!! (0) | 2011.06.08 |