2008-09-17 3 views

답변

3

하나의 가능성은 임의로 si 절대 넘치거나 언더 플로우하지 않는 정수입니다.

그렇지 않으면 정말로 염려되는 것입니다. 그리고 언어에서 허용하는 경우 정수처럼 작동하는 래퍼 클래스를 작성하지만 오버플로에 대한 모든 작업을 확인하십시오. 당신은 디버그 빌드에 대한 점검을하고, 릴리즈 빌드에 최적화 된 것을 남겨 둘 수도 있습니다. C++과 같은 언어에서는 이것을 수행 할 수 있으며 릴리즈 빌드에서는 정수와 거의 동일하게 동작하지만 디버그 빌드에서는 전체 런타임 검사를 얻게됩니다.

class CheckedInt 
{ 
private: 
    int Value; 

public: 
    // Constructor 
    CheckedInt(int src) : Value(src) {} 

    // Conversions back to int 
    operator int&() { return Value; } 
    operator const int &() const { return Value; } 

    // Operators 
    CheckedInt operator+(CheckedInt rhs) const 
    { 
     if (rhs.Value < 0 && rhs.Value + Value > Value) 
      throw OverflowException(); 
     if (rhs.Value > 0 && rhs.Value + Value < Value) 
      throw OverflowException(); 
     return CheckedInt(rhs.Value + Value); 
    } 

    // Lots more operators... 
}; 

편집 :

누군가가 doing this already for C++입니다 밝혀 - 현재 구현은 비주얼 스튜디오에 대한 초점을 맞추고 있습니다,하지만 그들은뿐만 아니라 GCC에 대한 지원을 얻고있는 것 같습니다.

1

내 코드에서 범위/유효성 검사를 수행 할 테스트 코드를 많이 작성합니다. 이것은 대부분의 이러한 유형의 상황을 파악하는 경향이 있습니다. 그리고 확실히 더 많은 방탄 코드를 작성하는 데 도움이됩니다.

1

long double과 같은 고정밀 부동 소수점 숫자를 사용하십시오.

+0

부동 소수점 (모든 정밀도 포함)은 훨씬 더 어려운 문제의 범주, 즉 정밀도의 손실을 가져옵니다. 나는. '(x + 1.0) -x! = 1'이다. 'long double'을 사용하면 주파수와 크기가 줄어 듭니다. – MSalters

1

목록에 매우 중요한 옵션이 하나 빠져 있다고 생각합니다. 작업에 적합한 프로그래밍 언어를 선택하십시오. 고정 된 크기의 정수가 없기 때문에 이러한 문제가없는 많은 프로그래밍 언어가 있습니다.

0

사용하는 언어를 선택할 때 정수 크기보다 중요한 고려 사항이 있습니다. 값이 범위 내에 있는지 알지 못하는 경우 입력을 확인하거나 예외가 매우 드문 경우 예외 처리를 사용하십시오.

0

불일치를 검사하는 래퍼가 많은 경우에 적합합니다. 두 개 이상의 정수에 대한 더하기 연산 (즉, 더하기 또는 곱하기)이 피연산자보다 작은 값을 생성하면 무언가 잘못되었다는 것을 알게됩니다. 모든 부가적인 동작에 선행되어야

if (sum < operand1 || sum < operand2) 
    omg_error(); 

마찬가지로 논리적 실수 embiggin'd되었는지 확인한다 작은 값을 초래한다 어떠한 동작.

0

오버플로가없는 코드를 확인하기 위해 공식적인 방법을 사용했는지 조사 했습니까? 추상 해석으로 알려진 공식 방법 기술은 소프트웨어가 오버플로, 언더 플로, 0으로 나누기, 오버플로 또는 기타 유사한 런타임 오류가 발생하지 않는다는 것을 증명하기 위해 소프트웨어의 견고성을 검사 할 수 있습니다. 그것은 소프트웨어를 철저히 분석하는 수학적 기법입니다. 이 기술은 1970 년대 Patrick Cousot에 의해 개척되었습니다.오버런으로 인해 발사체가 파괴 된 Arian 5 로켓의 오버플로 상태를 진단하는 데 성공적으로 사용되었습니다. 부동 소수점 수를 정수로 변환하는 동안 오버플로가 발생했습니다. 이 기술에 대한 자세한 내용은 hereWikipedia에 있습니다.

관련 문제