QuickJS:可能由于修改函数原型而导致内存泄漏



我在QuickJS JavaScript引擎中遇到了一个bug。我已经提交了一个GitHub问题,但我也在这里询问是否可能是用户错误,和/或了解其他人是否遇到过类似的问题。

以下测试代码:

#include <string>
#include "quickjs.h"
int main() {
auto runtime = JS_NewRuntime();
auto context = JS_NewContext(runtime);
std::string source =
"function foo() {}n"
"foo.prototype.bar = function() {};";
JS_Eval(context, source.c_str(), source.size(), "", JS_EVAL_TYPE_GLOBAL);
JS_FreeContext(context);
JS_FreeRuntime(runtime);
}

产生断言:

Assertion failed: (list_empty(&rt->gc_obj_list)), function JS_FreeRuntime

使用"转储泄漏"功能输出以下内容:

Object leaks:
ADDRESS REFS SHRF          PROTO      CLASS PROPS
0x1071d4bc0    1   0*    0x1071c5510   Function { length: 0, name: 14'', prototype: [autoinit 0x1071c4e80 0 0x0] }

这似乎表明修改函数原型会导致内存泄漏。(如果未修改功能原型,则不会发生这种情况。(

我的测试代码有什么明显的错误吗?也许是滥用API?如果没有,是否有其他人在QuickJS中遇到此问题或类似问题?

对于将来可能会偶然发现这一点的人来说,这是由于API使用不正确。泄漏不是由于JavaScript代码本身,而是因为JS_Eval()返回了一个JSValue,需要使用JS_FreeValue()释放它。

最新更新