Одной из возможностей является использование языка с произвольными целыми числами, который никогда не переполняется / не переполняется.
В противном случае, если вас это действительно беспокоит, и если ваш язык это позволяет, напишите класс-оболочку, который действует как целое число, но проверяет каждую операцию на переполнение. Вы могли бы даже сделать так, чтобы он проверял отладочные сборки и оставлял вещи оптимизированными для сборок релизов. На таком языке, как 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...
};
Edit:
Оказывается, кто-то делает это уже для C ++ - текущая реализация ориентирована на Visual Studio, но похоже, что они также получают поддержку для gcc.