C++ 两次调用JS_NewStringCopyN时发出SIGSEGV

C++ 两次调用JS_NewStringCopyN时发出SIGSEGV,c++,javascript-objects,seamonkey,C++,Javascript Objects,Seamonkey,我一直在尝试使用Ubuntu 16.04.3 LTS附带的Mozilla/SeaMonkey JavaScript库,mozjs185-1.0,但是当我尝试调用JS_NewStringCopyN两次从char*字符串分配两个JSString对象时,我遇到了一个SIGSEGV 我的示例代码如下: #include <js/jsapi.h> #include <js/jscntxt.h> #include <js/jscompartment.h> size_t

我一直在尝试使用Ubuntu 16.04.3 LTS附带的Mozilla/SeaMonkey JavaScript库,
mozjs185-1.0
,但是当我尝试调用
JS_NewStringCopyN
两次从
char*
字符串分配两个
JSString
对象时,我遇到了一个
SIGSEGV

我的示例代码如下:

#include <js/jsapi.h>
#include <js/jscntxt.h>
#include <js/jscompartment.h>

size_t gStackChunkSize = 8192;

static void
my_ErrorReporter(JSContext *cx, const char *message, JSErrorReport *report)
{ }

int main(int argc, char *argv[]) {
    JSRuntime *rt = JS_NewRuntime(256L * 1024L * 1024L);
    if (!rt)
       return -1;

    JSCompartment compartment(rt);
    JSContext *cx = JS_NewContext(rt, gStackChunkSize);
    if (!cx)
        return -2;
    JS_SetErrorReporter(cx, my_ErrorReporter);
    cx->compartment = &compartment;

    const char data[] = "PScript5.dll Version 5.2.2";
    const char data2[] = "Thom Parker";

    JSString *str = JS_NewStringCopyN(cx, data, sizeof(data));
    JSString *str2 = JS_NewStringCopyN(cx, data2, sizeof(data2));

    return 0;
}
当我运行
/mdntest
时,它会生成一个
SIGSEGV
并崩溃。调试了Mozilla JavaScript库的1.8.5版本后,我知道在第二次调用
JS_NewStringCopyN
期间发生的事情是,垃圾收集器被调用(
JS_gc
),它试图在某个地方进行标记和扫描传递,但正在访问一些无效内存,通过调用
js::gc::ArenaBitmap::markIfUnmarked
,在后台跟踪中深入30个级别


我的理论是,在调用第一个
JS_NewStringCopyN
之后,我忘记了做一些未记录的事情。如果您能提供任何建议或帮助,我们将不胜感激。

在上面的示例代码中,我发现的问题是
jspackage
必须在使用前手动初始化

因此,加入:

compartment.init();

js隔间(rt)中建造隔间之后
调用这两个
JS_NewStringCopyN
时没有错误,垃圾收集器
JS_gc
运行时没有错误。我无法理解为什么
js隔间
没有在其构造函数中调用
js隔间::init()
,为什么没有清楚地记录这一点。

在上面的示例代码中,我发现的问题是
js隔间
必须在使用前手动初始化

因此,加入:

compartment.init();

js隔间(rt)中建造隔间之后
调用这两个
JS_NewStringCopyN
时没有错误,垃圾收集器
JS_gc
运行时没有错误。我无法理解为什么
jschainer
没有在其构造函数中调用
jschainer::init()
,为什么没有清楚地记录这一点。

作为记录,尽管我在下面有一个解决方案,但我需要解决的问题在JavaScript中的内存池损坏方面有点细微差别,与提交的数据结构相关,没有适当的终止符元素,导致JavaScript内存损坏,垃圾收集器崩溃。记录在案,尽管我在下面有一个解决方案,但我需要解决的问题在JavaScript内存池损坏方面有点微妙,与未使用适当的终止符元素提交的数据结构有关,导致JavaScript内存损坏和垃圾收集器崩溃。