我意识到DUK_USE_EXEC_TIMEOUT_CHECK
的使用是实验性的(从1.5开始),但我不清楚如何最好地利用它。我试图做的是严格限制操作码执行,以防止坏脚本通过无限循环,大型处理块等来杀死我的进程。我已经定义了我认为合适的东西,即:< / p>
#define DUK_OPT_INTERRUPT_COUNTER
#define DUK_OPT_EXEC_TIMEOUT_CHECK duk_my_exec_timeout
int duk_my_exec_timeout( void *udata ) {
return stop_processing ? 1 : 0;
}
问题:我有很多背景,但udata
并不足以将它们区分为尽可能接近。但是,这可能不是我的需要所必需的。
问题:该功能会在意外的地方被调用,例如在duk_create_heap
甚至是简单的duk_peval_string
来电时,我无法知道原因。
通过修改duk__executor_interrupt
代码以传递线程/上下文interrupt_init
成员,我现在已经将我认为让我了解的内容如此:
if (DUK_USE_EXEC_TIMEOUT_CHECK(thr->interrupt_init, thr->heap->heap_udata)) {
...
}
似乎当它非零时,我已达到一些内部操作码处理限制。听起来不错吗?
我的超时程序如下:
int duk_my_exec_timeout( int interrupt, void *udata ) {
if ( interrupt ) {
return 1;
}
else {
return 0;
}
}
谢谢!
答案 0 :(得分:0)
中断检查宏旨在被调用&#34;偶尔&#34;通过引擎,所以没有一个固定的地方,你应该期望它被调用。典型的解决方案是在开始操作时记录开始时间戳,并在宏中检查当前时间与开始时间(实际上,宏调用的函数)。当差异足够大时,可以指示超时,这会导致RangeError传播出引擎。