2012-06-17 4 views
1

가능한 중복 :
Best way to detect integer overflow in C/C++C에서 long int를 위해 오버플로를 잡는 방법?

나는 C 프로그래밍 초보자 그리고 난 한 번에 long int 바이트를 읽고 공백의 끝에서 출력하는 프로그램을 작성. LONG_MAXLONG_MIN을 사용하여 오버플로/언더 플로를 catch하도록 limits.h 라이브러리에 구성해야합니다. 나는 long int 이상으로 캐스팅 할 수 없으며 음수에 대해서도 오버플로를 감지해야합니다. 여기에 내 코드입니다 :

int main(void) 
{ 
    int c; 
    int state; 
    long int num = 0; 

    while((c = getchar()) != EOF) 
    { 
     switch(state) 
     { 
      case 0: 
      { 
       if (isspace(c)) 
       { 
        //do nothing; 
       } 
       else 
       { 
        state = 1; 
        num = 10 * num + (c - '0'); 
       } 
       break; 
      } 

      case 1: 
      { 
       if (isspace(c)) 
       { 
        printf("%ld\n", num); 
        num = 0; 
        state = 0; 
        break; 
       } 

       num = 10 * num + (c - '0'); 

       if (num < LONG_MIN || num > LONG_MAX) 
       { 
        printf("overflow\n"); 
        break; 
       } 
       break; 
      } 
     } 
    } 
    return 0; 
} 

if (num < LONG_MIN || num > LONG_MAX) 때 그 반대의 경우도 마찬가지 언더 플로우를 입력 LONG_MAX +1 인 경우, 예를 들어,이 오버 플로우 때문에 일을하고 LONG_MIN가되어 보이지 않는 부분입니다.

답변

0

오버 플로우를 감지하는 가장 쉬운 방법은 "num"이 이전보다 항상 커지는지 확인하는 것입니다.

oldnum = num; 
num = 10 * num + (c - '0'); 

if (num < oldnum) 
{ 
    // overflow! 
    printf("overflow\n"); 
} 

고려해야 할 몇 가지 조건이 있지만 위의 내용은 num이 부호가 있거나 부호가 없거나 폭이 무엇이든 관계없이 대부분 작동해야합니다.

+0

이 아이디어는 위험합니다. 첫째, 오버플로가 신호를 발생시킬 수 있으므로 확인하지 못할 수도 있습니다. 그렇다면 가정은 곱셈이 아니라 덧셈 또는 뺄셈의 오버 플로우에만 작용합니다. –

+0

@JensGustedt - 정수 연산을 수행 한 결과로 신호를 올리는 오버플로를 나타내는 코드를 제공 할 수 있습니까? – selbie

+0

'-ftrapv' 옵션을 사용하여 컴파일러로 gcc를 사용한다면 코드를 추가 할 것입니다. gcc는 또한 inverse를 허용합니다. -fstrict-overflow'는 산술 연산이 오버 플로우하지 않는다고 가정합니다. 컴파일러가 죽은 지점이라고 가정하기 때문에 검사가 최적화 될 수 있습니다. –

관련 문제