деление (компьютерное)
Jan. 30th, 2013 01:18 amПрикольно - оказывается, инструкция idiv, деление со знаком, на x86 кидает исключение не только при делении на ноль, но и когда результат не помещается в регистр. А этого очень легко добиться, написав в C например INT_MIN / -1. Как мы помним, INT_MIN по модулю на единицу больше, чем INT_MAX; например, в 32-битных числах INT_MIN равно -2147483648, а INT_MAX равно 2147483647. Поэтому когда INT_MIN делят на -1, положительный результат не вмещается в 32 бита.
Само по себе это не катастрофа - ну кидает исключение, ну и подумаешь. Дело в том, однако, что про деление на ноль все знают и помнят, и проверяют перед попыткой делить. А против INT_MIN/-1 никто практически не защищается. Поэтому можно, например:
- крэшнуть компилятор (правда, игрушечный), PostgreSQL (не игрушечную) или антивирус;
- подвесить Windows 8;
- убить bash
Само по себе это не катастрофа - ну кидает исключение, ну и подумаешь. Дело в том, однако, что про деление на ноль все знают и помнят, и проверяют перед попыткой делить. А против INT_MIN/-1 никто практически не защищается. Поэтому можно, например:
- крэшнуть компилятор (правда, игрушечный), PostgreSQL (не игрушечную) или антивирус;
- подвесить Windows 8;
- убить bash
no subject
Date: 2013-01-30 01:12 am (UTC)no subject
Date: 2013-01-30 01:34 am (UTC)Если есть нормативный документ, требующий перепрыгивающего поведения, имеем ошибку реализации, которую можно донести реализаторам, чтобы те её исправили.
Если это всё чепуха, тогда имеет смысл надавить на документаторов, чтобы они чётче определили поведение в данной ситуации.
Кстати, на странице по последней ссылке вообще написано следующее: Integer division by zero has undefined result. On some architectures it will generate a SIGFPE signal. (Also dividing the most negative integer by -1 may generate SIGFPE.) Ignoring this signal might lead to an endless loop.
Сейчас это можно практически трактовать только как то, что искомое поведение не является гарантированным на практике.
no subject
Date: 2013-01-30 08:12 am (UTC)Про это там как раз очень хорошо написано:
According to POSIX, the behavior of a process is undefined after it ignores a SIGFPE, SIGILL, or SIGSEGV signal that was not generated by kill(2) or raise(3)
no subject
Date: 2013-01-30 08:36 am (UTC)no subject
Date: 2013-01-30 03:09 am (UTC)no subject
Date: 2013-01-30 05:27 am (UTC)no subject
Date: 2013-01-30 01:54 pm (UTC)no subject
Date: 2013-01-31 04:02 am (UTC)no subject
Date: 2013-01-30 08:23 am (UTC)Хуже того, если бы программа игнорировала этот сигнал, она могла бы долгое время успешно делать вид, что она работает правильно, что гораздо опаснее падения.
no subject
Date: 2013-01-30 08:26 am (UTC)no subject
Date: 2013-01-30 08:32 am (UTC)no subject
Date: 2013-01-30 04:10 pm (UTC)А вот #DF и #MC - abort - сливай воду, туши свет, практически.
no subject
Date: 2013-01-30 04:31 pm (UTC)no subject
Date: 2013-01-30 08:38 am (UTC)no subject
Date: 2013-01-30 08:52 am (UTC)no subject
Date: 2013-01-30 08:57 am (UTC)