segfault/massive memory use when using Data.Bits.shiftL

Remi Turk rturk at science.uva.nl
Mon Feb 28 17:44:53 EST 2005


On Mon, Feb 28, 2005 at 02:55:56PM +0000, Ganesh Sittampalam wrote:
> Hi,
> 
> The following either eats memory until killed or segfaults (I can't pin
> down a reason for the difference). Tested with GHC 6.2.2 and 6.4.20050212,
> with various different libgmp3s under various Redhat and Debian platforms,
> and WinXP.
> 
> Prelude> :m +Data.Bits
> Prelude Data.Bits> 18446658724119492593 `shiftL` (-3586885994363551744) ::
> Integer
> 
> Cheers,
> 
> Ganesh

shiftL for Integer is defined in fptools/libraries/base/Data/Bits.hs:

class Num a => Bits a where
    shiftL       :: a -> Int -> a
    x `shiftL` i = x `shift`  i

instance Bits Integer where
   shift x i | i >= 0    = x * 2^i
             | otherwise = x `div` 2^(-i)

IOW, for y < 0:
        x `shiftL` y
      = x `shift` y
      = x `div` 2^(-y)

and calculating, in your case, 2^3586885994363551744 is not
something your computer is going to like...
as it's probably a number which doesn't fit in our universe :)
Still, a segfault might point at a bug, which I unfortunately
won't be able to say much about. (Due to lack of knowledge &
information.)

Greetings,
Remi

-- 
Nobody can be exactly like me. Even I have trouble doing it.


More information about the Glasgow-haskell-users mailing list