Страницы

Поиск по вопросам

четверг, 19 декабря 2019 г.

Как переполнить тип int С++

#cpp #visual_cpp


Мне нужно отловить переполнение int не прибегая к математике.
Но как показала практика получить ошибку о переполнении нереально. После того как
тип переполнен программа не выбрасывает исключение или ошибку, что бы ее можно было
обработать.
Как посоветуете поступить?, вариант сравнения: если значение больше то сообщение
об ошибке, не подходит.
    


Ответы

Ответ 1



Переполнение типа int приводит к неопределенному поведению (UB), и по этому в С++ программе его не может быть. На практике, компилятор С++ может удалять код проверяющий переполнение int, т.к. переполнения не может происходить. Если же переполнение int произойдет, то дальнейшее поведение программы не определено, и любые пост-фактум проверки бессмысленны, т.к. программа уже находится в невалидном состоянии. По этому возможность переполнения можно проверить только до выполнения операции, которая может его вызвать, например: int x; if (x != INT_MAX) { ++x; } else { // будет переполнение } Примечание: На платформе x86 есть инструкция into, но она не доступна из С++. В компиляторе gcc есть опция -fstrict-overflow, которая позволяет отключить оптимизации, связанные с невозможностью переполнения знаковых типов. Это позволяет компилировать старый код, нарушающий запрет на переполнение int. Впрочем в новом коде эту опцию лучше не использовать, и писать код, соответствующий требованиям стандарта.

Ответ 2



Для gcc есть вот такие встроенные функции проверки переполнения

Комментариев нет:

Отправить комментарий