Russian Belarusian English German Japanese Ukrainian

Rashka.studio - игры и приложения для Android! Заходи, ждём тебя =)

SafeInt

CuBook05

template<typename T, typename E = _SAFEINT_DEFAULT_ERROR_POLICY>
class SafeInt;
safeint.h
Класс SafeInt защищает от переполнения целого числа в математических операциях. Допустим один из них имеет значение 200, а второй - имеет значение 100. Математическая операция будет правильной 200 + 100 = 300. Однако из-за 8 разрядного ограничения целого числа, компилятор будет потерян и верхний бит будет 44 (300 - 2) 8 в результат.
 
Класс SafeInt проверяет, присутствует ли арифметического переполнения или деления на ноль. В обоих случаях класс вызывает обработчик ошибок для предупреждения программы прогнозируемой проблемы.
 
Этот класс также позволяет сравнить 2 различных типа целых чисел, пока они являются объектами SafeInt. Как правило, при выполнении сравнения, сначала необходимо преобразовать числа, чтобы они были одного типа.
 
Большинство математические операторы возвращают объект SafeInt типа T. Операции сравнения SafeInt объединенным типом могут выполняться в любом направлении. Например, а SafeInt<int>(x) < y и y > SafeInt<int>(x) допустимым и возвращают один и тот же результат.
 
Многие двоичные операторы не поддерживают 2 различных типа SafeInt. Примером этого оператора &. SafeInt<T, E> & int поддерживается, но не SafeInt<T, E> & SafeInt<U, E>. В последнем примере компилятор не знает, какой тип параметра, который необходимо вернуть. Решением этой проблемы является приведение второго параметра обратно к базовому типу. С помощью тех же вариантов, это можно сделать с SafeInt<T, E> & (U)SafeInt<U, E>, чтобы предотвратить переполнение целых числа и позволяет сравнивать различные типы целых чисел.
 
Для битовых операций: 2 различных параметра должны быть одинакового размера. Если размеры различаются, то компилятор создает исключение ASSERT (MFC). Результаты данной операции невозможно гарантировать, что были явно заданы. Чтобы разрешить эту проблему, приведение меньший параметр до тех пор, пока не будет тот же размер, как большой параметр.
 
Для операторов миграции нескольких битов не существует для типа шаблона, будут вызывать исключение УТВЕРЖДЕНИЯ. Это не оказывает влияния в режиме выпуска. Смешение 2-ого типа параметров SafeInt возможно для операторов миграции, поскольку тип возвращаемого значения тот же, что и исходный тип. Номер справа от оператора отображает только число битов к миграции.
 
При выполнении, логическое сравнение с объектом SafeInt сравнивается строго с арифметическим. Например:
SafeInt<uint>((uint)~0) > -1
((uint)~0) > -1
Первый оператор в true, но второй оператор в false. Побитовое отрицание 0 0xFFFFFFFF. Во второй выписке по умолчанию оператор сравнения сравнивает 0xFFFFFFFF к 0xFFFFFFFF и считает, что они равны. Оператор сравнения для класса SafeInt производится, что второй параметр является отрицательным, в то время как первый параметр беззнаковый. Поэтому, битовые представления каждого элемента, выполняемыми последним логическим оператор SafeInt, целое число без знака больше -1.
Будьте внимательны при использовании класса SafeInt вместе с оператором ?: троичным. Рассмотрим следующую строку кода.
Int x = flag ? SafeInt<unsigned int>(y) : -1;
Компилятор преобразует его этому:
Int x = flag ? SafeInt<unsigned int>(y) : SafeInt<unsigned int>(-1);
Если flagfalse, то компилятор создает исключение вместо присвоения значения от -1 до x. Поэтому во избежание этой функциональности, правильный код для использования приведен ниже.
Int x = flag ? (int) SafeInt<unsigned int>(y) : -1;
T и U можно присвоить логический тип, символьный тип или тип integer. Типы целого числа без знака могут быть подписаны и размера от 8 до 64 бит.
Хотя класс SafeInt принимает любой тип целого числа, он выполняет более эффективно с типами без знака.
Политика по умолчанию SafeIntErrorPolicy_SafeIntException, которая вызывает исключение Класс SafeIntException при возникновении ошибки. Другая политика SafeIntErrorPolicy_InvalidParameter, программа останавливается при возникновении ошибки.
 
Можно также указать _SAFEINT_DEFAULT_ERROR_POLICY для настройки пользовательского класса обработки ошибок, прежде чем включать библиотеку SafeInt. Используйте этот параметр, если нужно, чтобы изменить политику обработки ошибок для всех экземпляров класса SafeInt в коде.
Настраиваемый класс, который обрабатывает ошибки из библиотека SafeInt не должен вернуть элемент управления коду, который вызвал обработчика ошибок. После того, как обработчик ошибок называется, результат операции SafeInt не должен быть показан.
Если заметили ошибку, выделите фрагмент текста и нажмите Ctrl+Enter

Добавить комментарий