Re: ZeroDivide bug in float printing
Holger Freyther <[email protected]>
| Newsgroups | gmane.comp.lang.smalltalk.gnu.general |
|---|---|
| Message-ID | <[email protected]> |
> On 29. Mar 2019, at 00:07, Derek Zhou <[email protected]> wrote: > > list, > thanks for looking into it! > There were discussion on this list about this bug in the debian package: Are you aware of: http://git.savannah.gnu.org/cgit/smalltalk.git/commit/libgst/interp.inl?id=72ada189aba0283c551ead16635c1983968080b8 > Last night I tracked it down. It only happens with: > > * 64 bit arch > * gcc 4.9.x Why is this version of GCC used? What prevents the usage of GCC8? Can the above be backported to the debian package? And let's get a new release out of the door (maybe skip VisualGST...) > The reason is smalltalk has to detect integer multiplication overflow > reliably; and there were 3 ways in the code: > > 1. use __builtin_mul_overflow > 2, see if the result is too big or too small > 3, basically a * b / b == a ? OK : OVERFLOW > > gcc 5+ and clang use 1. 32 bit arch use 2. they all works. However, on > gcc 4.9 and 64 bit it has to fall back to 3 which does not work. The > reason is gcc is being overly smart and optimize it away. gcc does > provide a switch "-fwrapv" to disable this optimization, but I am not > sure what other thing it may cause and we dont want to get caught in the > compiler shenanigan again in other compilers or other platform. > > I propose to change 3 into a more conservative and slower test > such as: > > (MAX_ST_INT / abs(b)) < abs(a) ? OVERFLOW : OK Overflow checking requires lots of thinking. E.g. have you considered where abs(a) < 0? I would prefer if we can exclusively use the compiler primitive.