0

文字列を取得して文字列を評価するircボットで使用する小さなプログラムを作成しています。このために、私はヒントパッケージを使用しています。これは私のニーズに非常に適しています。私が今抱えている問題は、2^1000000000などの計算に時間がかかる式の評価を防ぎたいということです。

System.Timeoutパッケージを次のように使用してみました。

import Data.Maybe 
import Language.Haskell.Interpreter
import System.Timeout
import System.Environment (getArgs)

main :: IO()
main = do
  r <- timeout 500000 $ runInterpreter $ hEval arg
  case r of
    Nothing -> putStrLn "Timed out!"
    Just x ->
      case x of
        Left err -> putStrLn (show err)
        Right a  -> putStrLn a

hEval e = do
  setImportsQ [("Prelude", Nothing),("Data.List",Nothing)]
  a <- eval e
  return $ take 200 a  

しかし、それは機能していません。何も評価できないほど短い時間を入れない限り、タイムアウトは発生しません。Timeoutパッケージのページで、一部のモジュールで問題が発生する可能性があり、テーマを終了させる必要があることを読みましたが、ヒントがそのようなモジュールであるかどうかを知るには十分ではありません。

したがって、これが機能しないことを私に伝えるだけであっても、これに関する助けをいただければ幸いです。

4

1 に答える 1

4

GHCスレッドは協調的です。それらは、メモリ割り当てを実行するときにのみ、非同期例外によって生成または終了できます。これは通常は正常に機能しますが、悪意のある人が、割り当てを行わずにかなりの時間実行されるタイトなループを作成する可能性があります。

muevalパッケージは、このようなことを処理するために作成されました。ヒントの観点から実装されていますが、さまざまな方法で多くの追加の安全性が追加されています。

于 2012-08-01T14:43:36.827 に答える