[Haskell-cafe] Timing out a pure evaluation of an expression I did not write myself
Ian Denhardt
ian at zenhack.net
Thu Nov 29 14:28:43 UTC 2018
That should have the same problem; the exceptions can't be delivered
until the target thread reaches a yield. 'timeout' uses the same
underlying mechanism.
Obvious worrisome question: is it possible to use this to DoS
lambdabot/mueval?
Quoting Erik Hesselink (2018-11-29 05:15:49)
> Hi Ryan,
> I'm not quite sure of your use case, but lambdabot/mueval do something
> like this I think. From a brief look at the source [1] it seems they
> compute in a separate thread, then in another thread, wait until the
> timeout then kill the computation thread. Would something like that
> work for you?
> Erik
> [1]
> [1]https://github.com/gwern/mueval/blob/09b6a7aa5a25c4115442ea2e6ae0c2d
> b557007f8/Mueval/Parallel.hs
>
> On Thu, 29 Nov 2018 at 03:41, Ryan Reich <[2]ryan.reich at gmail.com>
> wrote:
>
> I expected something like that. I'm all the way back in ghc-8.2.2, but
> I think what this really shows is that the flag is unreliable and
> version-dependent. Unfortunately there doesn't seem to be a precise
> specification of where yield points should appear, and therefore, where
> they might be not-omitted.
>
> On Wed, Nov 28, 2018, 17:10 Viktor Dukhovni <[3]ietf-dane at dukhovni.org
> wrote:
>
> On Wed, Nov 28, 2018 at 09:39:01AM -0800, Ryan Reich wrote:
> > Thanks for the suggestion, which Arjen made also.� Unfortunately,
> it does
> > not appear to help.� See this simple program:
> >
> > -- Loop.hs
> > import Control.Exception
> > import System.Timeout
> >
> > main :: IO (Maybe Integer)
> > main = timeout 100000 $ evaluate $ last $ repeat 0
> > -- end
> >
> > With either GHC invocation "stack exec ghc Loop[ --
> -fno-omit-yields]",
> > running ./Loop fails to terminate (it should do so in 0.1s).
> >
> > Based only on the very terse description of that flag in the
> User's Guide,
> > and its name, I think the problem is simply that GHC doesn't
> normally
> > *generate* yields in that loop, so there's nothing not to omit.
> It times out for me with GHC 8.4.4 on FreeBSD 11.2, and "ghc -O
> -fno-omit-yields"
> and does� not time out with "ghc -O":
> � � $ cat /tmp/foo.hs
> � � import Control.Exception
> � � import System.Timeout
> � � main :: IO (Maybe Integer)
> � � main = timeout 1000000 $ evaluate $ last $ repeat 0
> � � $ ghc -O -fno-omit-yields /tmp/foo.hs
> � � [1 of 1] Compiling Main� � � � � � � ( /tmp/foo.hs,
> /tmp/foo.o ) [Optimisation flags changed]
> � � Linking /tmp/foo ...
> � � $ time /tmp/foo
> � � real� � 0m1.033s
> � � user� � 0m1.025s
> � � sys� � � 0m0.008s
> � � $ rm /tmp/foo
> � � $ ghc -O /tmp/foo.hs
> � � [1 of 1] Compiling Main� � � � � � � ( /tmp/foo.hs,
> /tmp/foo.o ) [Optimisation flags changed]
> � � Linking /tmp/foo ...
> � � $ time /tmp/foo
> � � ^C^C
> � � real� � 0m5.864s
> � � user� � 0m5.857s
> � � sys� � � 0m0.000s
> On MacOS X with GHC 7.10.3, it does not time out either way.�
> Perhaps
> some versions of GHC don't make the timeout possible.
> --
> � � � � Viktor.
> _______________________________________________
> Haskell-Cafe mailing list
> To (un)subscribe, modify options or view archives go to:
> [4]http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe
> Only members subscribed via the mailman list are allowed to post.
>
> _______________________________________________
> Haskell-Cafe mailing list
> To (un)subscribe, modify options or view archives go to:
> [5]http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe
> Only members subscribed via the mailman list are allowed to post.
>
> Verweise
>
> 1. https://github.com/gwern/mueval/blob/09b6a7aa5a25c4115442ea2e6ae0c2db557007f8/Mueval/Parallel.hs
> 2. mailto:ryan.reich at gmail.com
> 3. mailto:ietf-dane at dukhovni.org
> 4. http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe
> 5. http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe
More information about the Haskell-Cafe
mailing list