블로그 이미지
Every unexpected event is a path to learning for you. blueasa

카테고리

분류 전체보기 (2797)
Unity3D (853)
Programming (479)
Server (33)
Unreal (4)
Gamebryo (56)
Tip & Tech (185)
협업 (61)
3DS Max (3)
Game (12)
Utility (68)
Etc (98)
Link (32)
Portfolio (19)
Subject (90)
iOS,OSX (55)
Android (14)
Linux (5)
잉여 프로젝트 (2)
게임이야기 (3)
Memories (20)
Interest (38)
Thinking (38)
한글 (30)
PaperCraft (5)
Animation (408)
Wallpaper (2)
재테크 (18)
Exercise (3)
나만의 맛집 (3)
냥이 (10)
육아 (16)
Total
Today
Yesterday

'Runtime Check'에 해당되는 글 1건

  1. 2011.06.11 [펌] 윈도우 안전한 프로그래밍[Runtime Check]
링크 : http://forums.andromedarabbit.net/wiki/%EC%9C%88%EB%8F%84%EC%9A%B0_%EC%95%88%EC%A0%84%ED%95%9C_%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D

런타임 검사

[편집]개요

런타임 검사는 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

 
반응형
Posted by blueasa
, |