деление (компьютерное)
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 07:48 am (UTC)no subject
Date: 2013-01-30 08:08 am (UTC)если делим Int64/Int32, то IDIV напрямую никогда не используется, хотя именно эту операцию он реализует.
Если делим Int32/Int32, IDIV используется и генерится исключение в случае переполнения результата.
Не видно, что и каким образом здесь возможно улучшить на уровне работы CPU.
no subject
Date: 2013-01-30 08:24 am (UTC)no subject
Date: 2013-01-30 08:37 am (UTC)Полезного применения INT_MIN/-1 не видно, и потому логичнее сигнализировать об ошибке
no subject
Date: 2013-01-30 08:48 am (UTC)no subject
Date: 2013-01-30 03:49 pm (UTC)no subject
Date: 2013-01-30 04:04 pm (UTC)А главное, если бы это была единственная дыра или одна из очень немногих... Умные люди найдут другие дыры. Достаточно найти одну хорошую или скомбинировать несколько не очень хороших, и уже не важно сколько их всего и какие они.
Надеюсь, ты не думаешь, что writing secure code - это просто, и что о security думают все программисты, чей код потенциально под ударом?
no subject
Date: 2013-01-30 04:18 pm (UTC)Я думаю, что писать безопасный код - сложно, поэтому нужно защищаться не только кодом, но и системными средствами.
no subject
Date: 2013-01-30 04:24 pm (UTC)Если точно, докажи.
Иногда упавший сервис можно перезапустить, откатив при этом выполняющиеся транзакции. Неправильное число иногда может привести к тому, что например, стырят данные или деньги. Или пациента облучат до лучевой болезни.
no subject
Date: 2013-01-30 04:44 pm (UTC)no subject
Date: 2013-01-30 03:17 pm (UTC)этого никто не гарантирует. implementation defined.
операции над unsigned с гарантией не генерируют исключений, но idiv именно что signed.