Download VCard

© 최병일 1981-‘10

명시적 반복문 한계치 지정 매크로 for C/C++, 혹은 무한 루프 방지

작성자 : yagur rev : 1

  다른분들은 어떤지 모르겠지만, 전 가끔 무한 루프에 빠지는 실수를 하곤합니다. 루프 횟수가 상수가 아니라 가변값인 경우에도 종종 애를 먹기도 합니다. 그래서 루프의 최대 반복 횟수를 단정지어 버리는 매크로를 만들어봤습니다. 이 확장된 _for, _while문은 명시적으로 지정한 반복 한계치에 도달하면 오류(assertion fail)를 발생시킵니다.

 소스코드
#define LOOP_ASSERT assert

#if defined(_DEBUG) && !defined(NO_INFINIT_LOOP_CHECK)
#define _while(condition, maxLoop) \
    for(unsigned int __LoopCounter = 0; \
        condition; \
        __LoopCounter++, LOOP_ASSERT(__LoopCounter != maxLoop))
#else
#define _while(condition, maxLoop) \
    for(;condition;)
#endif

#if defined(_DEBUG) && !defined(NO_INFINIT_LOOP_CHECK)
#define _for(initialize, condition, loop, maxLoop) \
    if(unsigned int __LoopCounter = 0 || true) \
        for(initialize; condition && __LoopCounter < maxLoop; \
            loop, __LoopCounter++, LOOP_ASSERT(__LoopCounter != maxLoop))
#else
#define _for(initialize, condition, loop, maxLoop) \
    for(initialize; condition; loop)
#endif

  Debug 모드에서 NO_INFINIT_LOOP_CHECK를 소스의 처음에 define 시켜주거나, C++ 전처리기에 넣으면 원래 반복문을 사용합니다(오버헤드가 없습니다.). Release모드에서는 루프 반복 한계치 검산이 동작하지 않으므로 오버헤드가 없습니다. 버그가 생기면, 알려주시면 감사하겠습니다.
  사용법은 내장 for, while문과 아주 약간 다릅니다.

C++ 기본 for, while의 예
for(int i = 0; i < 42; i++)
{
    ...
}
while(true)
{
   ....
}
확장된 for, while의 예
const unsigned int uiMaxLoop = 100000;
_for(int i = 0, i < uiRepeat, i++, uiMaxLoop)
{
    ....
}
_while(i < uiRepeat, uiMaxLoop)
{
    ....
}

  알고리즘 중에 최악의 경우나, 명세에 따른 최대 횟수(ex> Θ(N))같것을 명시적으로 코드에 적어주는 용도로 생각하셔도 괜찮을것 같습니다.

Comment 0 Trackback 0

Trackback : http://yagur.impon.net/trackback/147 관련글 쓰기

Top

prev 1 2 3 4 5 6 7 ... 81 next