INT_MIN / -1 = Floating point exception

margadon

Впечатляет, хотя может и боян

$ cat intmin.c
#include <limits.h>

int foo (int a, int b) {
return a / b;
}

int main (void) {
return foo (INT_MIN, -1);
}

$ gcc -O0 intmin.c -o intmin
$ ./intmin
Floating point exception
$
$ gcc -O2 intmin.c -o intmin
$ ./intmin
$

а ещё можно в 64битном bash выполнить вот это:

$ ($-2**63/-1
Floating point exception
$

а вот и ссылочка с дополнительными плюшками: http://avva.livejournal.com/2548306.html

yolki

-INT_MIN > INT_MAX, почему бы и нет?

margadon

да я и не против, просто впечатляет что при этом кидается эксепшн, что по-моему нелогично
ну и авторы баша судя по всему тоже не в курсе, раз деление на ноль заэкранировали проверкой, а вот такое - нет

istran

Это не эксепшн в терминах C++. Это просто сигнал SIGFPE. Название конечно неудачное выбрано для него =)

elenangel

а почему операции с int вызывают Floating exception?

Serab

Это не эксепшн в терминах C++.
ну да, было бы прикольно, если бы оно кидало эксепшен в терминах
C++ из проги на C

margadon

думаю из списка сигналов больше всего подходит SIGFPE - вот его и кидают

smit1

Это особенность конкретной операционки на конкретной архитектуре
DO_ERROR_INFO(X86_TRAP_DE, SIGFPE, "divide error", divide_error, FPE_INTDIV,
regs->ip)

doublemother

Это особенность конкретной операционки на конкретной архитектуре
Посоны говорят, что на msvc11 / x86 тоже воспроизводится.

margadon

он говорил о том, что целочисленное деление вот так странно мапится в Floating point exception в конкретной операционке
сам "баг" заключается в специфике работы процессорной функции x86 idiv - а это фича процессора, а не архитектуры операционки
каков аналог сигналов под виндой?

Serab

каков аналог сигналов под виндой?
в данном случае вроде бы должен использоваться SEH

andrei260280

% $-2**63/-1
zsh: command not found: -9223372036854775808

margadon

64битный?

andrei260280

ага; дабы развеять сомнения:

% $[2**63]; $[2**63/-1]; $[2**64]
zsh: command not found: -9223372036854775808
zsh: command not found: -9223372036854775808
zsh: command not found: 0

margadon

на макоси баш от такого виснет в бесконечном цикле

andrei260280

жесть
Оставить комментарий
Имя или ник:
Комментарий: