Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: SIGFPE crash



On 8 May 2011 00:19, Jon Mayo <jon.mayo@xxxxxxxxx> wrote:
> On Sat, May 7, 2011 at 3:17 PM, Mikael Magnusson <mikachu@xxxxxxxxx> wrote:
>> On 7 May 2011 23:56, Jon Mayo <jon.mayo@xxxxxxxxx> wrote:
>>> echo $[-9223372036854775808/-1]
>>>
>>> this causes zsh to exit immediately with an FPE. Does anyone have a
>>> patch to fix this?
>>
>> diff --git a/Src/math.c b/Src/math.c
>> index 35b362d..3c08052 100644
>> --- a/Src/math.c
>> +++ b/Src/math.c
>> @@ -1053,8 +1053,12 @@ op(int what)
>>                    return;
>>                if (c.type == MN_FLOAT)
>>                    c.u.d = a.u.d / b.u.d;
>> -               else
>> -                   c.u.l = a.u.l / b.u.l;
>> +               else {
>> +                    if (a.u.l == LONG_MIN && b.u.l == -1)
>
> should be LLONG_MIN
>
>> +                        c.u.l = 0;
>
> LLONG_MAX would be the closest answer, but 1 off. I would switch it
> from integer to double type in this case, but that might be difficult.

It should probably be neither, zsh does some weird stuff to find a
suitably long type for .l, which may or may not be a long long.

>> +                    else
>> +                       c.u.l = a.u.l / b.u.l;
>> +                }
>>                break;
>>            case MOD:
>>            case MODEQ:
>>
>>
>> Do we want to print a warning and/or use another value than 0 in this case?

This is assuming we want to do this at all, I am told that only
division will generate an exception on x86, but presumably other
arches behave differently, and bash behaves the same way too
(exception + die). Does some sort of standard have anything to say on
the matter? I'm guessing someone has thought of it before and clearly
nobody ever did anything about it.

-- 
Mikael Magnusson



Messages sorted by: Reverse Date, Date, Thread, Author