什么是最有效的做法,以防止 算术溢出?

一些例子,想到的是:

  • 测试的基础上有效输入范围
  • 验证的使用正规方法
  • 使用的变量
  • 检测在运行时使用的语言功能或库(这并不妨碍它)
有帮助吗?

解决方案

一种可能性是使用一种语言,具有任意的中小型整数,从来没有溢/下溢。

否则,如果这是你真的关心,并且如果你的语言允许的话,编写一个包装类行为的喜欢整数,但是检查每一个操作的溢出。你甚至可能有这样做的检查在调试版本,并留下的东西优化用于释放生成。在语言等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...
};

编辑:

原来有人 这样做已经用C++ -当前实施的重点是为Visual Studio,但它看起来像他们得到的支持海湾合作委员会。

其他提示

我写了很多测试码做到的范围的/有效性检查,在我的代码。这往往赶上大多数的这类情况,绝对可以帮助我写更多的防弹的代码。

使用高精度浮点像一个数字 只要双倍.

我认为你是缺少一个非常重要的选项,在你的清单:选择正确的编程语言的工作。有许多编程语言,它不具有这些问题,因为他们没有固定的尺寸整数。

还有更重要的考虑因素当选择哪一种语言的使用比大的整数。简单地检查你的输入,如果你不知道如果价值是在边界、或使用例外处理,如果情况是非常罕见的。

包装用于检查的不一致性将会有意义在许多情况下。如果添加剂的作业(即外或乘)在两个或多个结果的整数在较小值的比操作数然后你知道的东西去了错误的。每添加剂的操作应遵循,

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

同样,任意操作,从逻辑上说应该结果在一个更小的数值应该检查,看看它是不小心embiggin。

你有没有调查所使用的正式方法,以检查你的代码证明,它是免费的溢?一个正式的方法的技术称为抽象的解释可以检查性的软件,以证明软件不会受到溢出,溢、划分通过零,溢,或者其他类似的运行时间错误。它是一个数学的技巧,详尽分析软件。该技术是创帕特里克Cousot在1970年代。它被成功地用于诊断溢出的条件下在阿里安5号火箭其中一个溢流造成的破坏启动的车辆。溢流造成的,而是转换一个浮点数为整数。你可以找到更多的信息,这种技术 在这里, 并且还在 维基百科.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top