#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 есть вот такие встроенные функции проверки переполнения
Комментариев нет:
Отправить комментарий