在v8中检测无限递归

时间:2014-08-20 23:06:59

标签: c++ v8 embedded-v8

我正在使用谷歌的v8 javascript引擎在我的项目中有一个嵌入式js解释器,它必须能够执行用户提供的代码,但我想知道是否可以提前设置一些东西调用任何用户代码,确保如果代码试图无限递归(或者即使它只执行太长时间),它可以以某种方式中止,抛出一个未捕获的异常,并将问题报告给调用者。

感谢所有人回答到目前为止...是的,我意识到我发布这篇文章后不久,我基本上要求对停止问题采取某种解决方案,我知道这是无法解决的,实际上远远超过了我真正需要的是什么。

我需要的是一种机制,用于检测v8环境中运行的内容何时返回得足够快,或者只是一种机制来检测是否正在发生递归......我的用例是这样的最终用户不应该使用任何递归,如果我甚至可能检测到它,那么我可以在那时拒绝它而不是盲目地执行它。但是,对于不同的线程,允许同时调用相同的函数,因此我不能使用静态局部变量来锁定对同一函数的另一个调用。

1 个答案:

答案 0 :(得分:3)

编译器[V8在这种情况下肯定是一个编译器,即使它不是"总是"编译器]可以检测递归,但如果代码足够聪明(例如,取决于在编译时不知道的变量),则无法检测它是否具有无限或有限递归。 / p>

我只是声明"超过X秒执行",如果执行时间超过那么长,则中止它。你可以通过一个"看门狗线程"来实现这一点,当代码完成时触发它 - 如果监视程序线程运行X秒,则终止主线程并报告回用户代码。不,我不完全知道如何与V8一起编写此代码。