Здравствуйте, _const_, Вы писали:
C>>Деление на 0 — это undefined behavior, а не исключительная ситуация. Его нельзя обработать, его можно только предотвратить.
__>Уверены? У меня на VC6 и VC7 ДЛЯ ЦЕЛОЧИСЛЕННЫХ ТИПОВ стабильно вылетает Exception: Integer Divide by Zero.
Здравствуйте, CrystaX, Вы писали:
CX>Это не C++ exception. Смотри в сторону Win32 SEH.
А разве в случае выполнения арифметических операций могло быть исключение C++? Вопрос-то был: почему не вылетает исключение вообще, какое бы то ни было?
Здравствуйте, _const_, Вы писали:
CX>>Это не C++ exception. Смотри в сторону Win32 SEH.
__>А разве в случае выполнения арифметических операций могло быть исключение C++?
Нет, не могло. Если касаться только и исключительно C++, то деление на 0 — UB, как правильно заметил Centaur. Конкретно в среде MS VC++ это UB выражается выбрасыванием SEH исключения, которое никакого отношения к C++ не имеет. Но в UNIX, например, это уже будет посылка сигнала процессу, который его (процесс) убьет, если не принять дополнительных действий.
__> Вопрос-то был: почему не вылетает исключение вообще, какое бы то ни было?
Если же брать конкретный случай, описываемый автором, то необходима дополнительная информация — для начала операционная система, компилятор и ключи компиляции.
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[6]: Деление на 0
От:
Аноним
Дата:
03.12.05 11:14
Оценка:
Здравствуйте, CrystaX, Вы писали:
CX>Если же брать конкретный случай, описываемый автором, то необходима дополнительная информация — для начала операционная система, компилятор и ключи компиляции.
WinXP Home SP2, MinGW, Dev-C++. Default установки.
Re[2]: Деление на 0
От:
Аноним
Дата:
03.12.05 11:17
Оценка:
Здравствуйте, Centaur, Вы писали:
C>Деление на 0 — это undefined behavior, а не исключительная ситуация. Его нельзя обработать, его можно только предотвратить.
А если нет возможности предотвращения? Как это дело вообще можно обработать?
Re[3]: Деление на 0
От:
Аноним
Дата:
03.12.05 11:20
Оценка:
Здравствуйте, _const_, Вы писали:
__>Здравствуйте, Centaur, Вы писали:
C>>Здравствуйте, Аноним, Вы писали:
C>>Деление на 0 — это undefined behavior, а не исключительная ситуация. Его нельзя обработать, его можно только предотвратить.
__>Уверены? У меня на VC6 и VC7 ДЛЯ ЦЕЛОЧИСЛЕННЫХ ТИПОВ стабильно вылетает Exception: Integer Divide by Zero.
CX>Нет, не могло. Если касаться только и исключительно C++, то деление на 0 — UB, как правильно заметил Centaur. Конкретно в среде MS VC++ это UB выражается выбрасыванием SEH исключения, которое никакого отношения к C++ не имеет. Но в UNIX, например, это уже будет посылка сигнала процессу, который его (процесс) убьет, если не принять дополнительных действий.
Не совсем понял, как VC может выбрасывать исключения. Мое понимание таково. При обнаружении аппаратной ошибки в виде деления на ноль Windows бросает соответствующее исключение. Ловить его или нет — проблема программиста. При этом некоторые необработанные исключения (access violation) приведут к аварийному завершению программы (а-ля UNIX), а некоторые — нет. Хотя второе утверждение спорно: возможно, некоторые исключения ловятся стандартной библиотекой или что-то в этом роде.
CX>Если же брать конкретный случай, описываемый автором, то необходима дополнительная информация — для начала операционная система, компилятор и ключи компиляции.
Согласен. Кстати, при Release компиляции пример действительно перестал падать.
Re[3]: Деление на 0
От:
Аноним
Дата:
03.12.05 11:23
Оценка:
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Centaur, Вы писали:
C>>Деление на 0 — это undefined behavior, а не исключительная ситуация. Его нельзя обработать, его можно только предотвратить.
А>А если нет возможности предотвращения? Как это дело вообще можно обработать?
Здравствуйте, _const_, Вы писали:
__>Не совсем понял, как VC может выбрасывать исключения. Мое понимание таково. При обнаружении аппаратной ошибки в виде деления на ноль Windows бросает соответствующее исключение. Ловить его или нет — проблема программиста. При этом некоторые необработанные исключения (access violation) приведут к аварийному завершению программы (а-ля UNIX), а некоторые — нет. Хотя второе утверждение спорно: возможно, некоторые исключения ловятся стандартной библиотекой или что-то в этом роде.
Исключение выбрасывает не VC, это верно. Вот только преобразовывает SEH в C++ исключение MS CRT library. Поэтому ты можешь поймать любое SEH исключение, преобразовав его к C++ exception. Подробнее — _set_se_translator. Но все это действует только при условии использования MS CRT, почему и было написано о среде MS VC++.
_const_ wrote:
> CX>Это не C++ exception. Смотри в сторону Win32 SEH. > А разве в случае выполнения арифметических операций могло быть > исключение C++? Вопрос-то был: почему не вылетает исключение вообще, > какое бы то ни было?
Деление на ноль — это UB. То есть программа вправе форматировать винт и
слать боссу письма с порнухой.
Бросание исключения — это просто один из вариантов UB.
_const_ wrote:
> Не совсем понял, как VC может выбрасывать исключения. Мое понимание > таково. При обнаружении аппаратной ошибки в виде деления на ноль > Windows бросает соответствующее исключение. Ловить его или нет — > проблема программиста.
Windows НЕ бросает исключение С++. Бросается исключение через механизм
SEH (Structured Exception Handling), который от С++ никак не зависит.
SEH-исключение можно преобразовать в С++-исключение, иногда это делается
автоматически. Читайте help на функцию _set_se_translator.
Естественно, к языку С++ это отношения не имеет — это уже особенности
конкретной реализации. В Юниксах, например, будут использоваться сигналы.
> При этом некоторые необработанные исключения (access violation) > приведут к аварийному завершению программы (а-ля UNIX), а некоторые — нет.
Более того, с помощью механизма SEH можно ловить даже access violation и
продолжать после него работу.
Здравствуйте, Cyberax, Вы писали:
C>_const_ wrote:
>> Не совсем понял, как VC может выбрасывать исключения. Мое понимание >> таково. При обнаружении аппаратной ошибки в виде деления на ноль >> Windows бросает соответствующее исключение. Ловить его или нет — >> проблема программиста.
C>Windows НЕ бросает исключение С++. Бросается исключение через механизм C>SEH (Structured Exception Handling), который от С++ никак не зависит.
"А я этого и не утверждал" ((c) Петров)
C>SEH-исключение можно преобразовать в С++-исключение, иногда это делается C>автоматически. Читайте help на функцию _set_se_translator.
Спасибо, читал.
C>Естественно, к языку С++ это отношения не имеет — это уже особенности C>конкретной реализации. В Юниксах, например, будут использоваться сигналы.
>> При этом некоторые необработанные исключения (access violation) >> приведут к аварийному завершению программы (а-ля UNIX), а некоторые — нет.
Уточню, имелось в виду, если код не "обернут" в SEH-фрейм.
C>Более того, с помощью механизма SEH можно ловить даже access violation и C>продолжать после него работу.
Полностью согласен.
C>-- C>С уважением, C> Alex Besogonov (alexy@izh.com)
Кодт wrote:
> C>Деление на ноль — это UB. То есть программа вправе форматировать винт и > C>слать боссу письма с порнухой. > TODO: не забыть включить эту ценную фичу в спецификацию. Поднять боссу > хмм... настроение.
Действительно, хорррошая идея...
> Кстати говоря, crash report'ы слать — очень даже разумная реализация > такого UB.
Здравствуйте, <Аноним>, Вы писали:
А>14 C:\Dev-Cpp\Project\main.cpp `__try' undeclared (first use this function)
2 обходных пути: Установить SEH фрейм вручную. Для этого понадобится ассемблер. SetUnhandledExceptionFilter.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth