avva: (moose)
[personal profile] avva
Прикольно - оказывается, инструкция 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

Date: 2013-01-30 02:25 pm (UTC)
From: [identity profile] oblomov-jerusal.livejournal.com
У меня 64-битная версия bash и zsh на дебиане ловит. Версия bash та же, что и у автора статьи, наверное дело в библиотеках

[2375]% bash
ilya@ilya-linux:~$ ($((-2**63/-1)))
Исключение в операции с плавающей точкой
ilya@ilya-linux:~$ exit
ilya-linux [bash] ~                                                                                               4:19
[2376:136]% bash -version
GNU bash, version 4.2.37(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
ilya-linux [bash -version] ~                                                                                      4:19
[2377]% ($((-2**63/-1)))
zsh: floating point exception  ( $((-2**63/-1)); )
ilya-linux [($((-2**63/-1)))] ~                                                                                   4:23
[2378:136]% 

Date: 2013-01-30 02:33 pm (UTC)
From: [identity profile] oblomov-jerusal.livejournal.com
А, это у меня просто не включен coredump, а внешние скобки включают порожденный процесс.

December 2025

S M T W T F S
  123 4 56
78 9 10 11 1213
1415 1617181920
21 22 23 24 2526 27
28293031   

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Dec. 29th, 2025 12:11 am
Powered by Dreamwidth Studios