Обнаружение знакового переполнения в C/C++C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Обнаружение знакового переполнения в C/C++

Сообщение Anonymous »

На первый взгляд этот вопрос может показаться дубликатом вопроса «Как обнаружить целочисленное переполнение?», однако на самом деле он существенно отличается.

Я обнаружил это, пока Обнаружение переполнения беззнакового целого числа довольно тривиально, обнаружение переполнения знакового в C/C++ на самом деле сложнее, чем думает большинство людей.

Самый простой очевидный, но наивный способ сделать это будет примерно таким:

Код: Выделить всё

int add(int lhs, int rhs)
{
int sum = lhs + rhs;
if ((lhs >= 0 && sum < rhs) || (lhs < 0 && sum > rhs)) {
/* an overflow has occurred */
abort();
}
return sum;
}
Проблема в том, что согласно стандарту C переполнение целочисленного знака является неопределенным поведением. Другими словами, согласно стандарту, как только вы вызовете знаковое переполнение, ваша программа станет такой же недействительной, как если бы вы разыменовали нулевой указатель. Таким образом, вы не можете вызвать неопределенное поведение, а затем попытаться обнаружить переполнение постфактум, как в приведенном выше примере проверки постусловия.

Несмотря на то, что приведенная выше проверка скорее всего, будет работать на многих компиляторах, на это нельзя рассчитывать. Фактически, поскольку стандарт C гласит, что переполнение знакового целого числа не определено, некоторые компиляторы (например, GCC) оптимизируют вышеуказанную проверку, когда установлены флаги оптимизации, поскольку компилятор предполагает, что переполнение знакового числа невозможно. Это полностью сводит на нет попытку проверить наличие переполнения.

Итак, другой возможный способ проверить наличие переполнения:

Код: Выделить всё

int add(int lhs, int rhs)
{
if (lhs >= 0 && rhs >= 0) {
if (INT_MAX - lhs 

Подробнее здесь: [url]https://stackoverflow.com/questions/3944505/detecting-signed-overflow-in-c-c[/url]
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»