syb*_*0rg 6 c parsing json token segmentation-fault
我正在使用jsmn JSON解析器(源代码)从JSON获取一些文本.jsmn将数据存储在令牌中,但令牌不包含任何数据,它们只是指向JSON字符串中的令牌边界.例如,jsmn将创建令牌,如:
此方法用于检索这些值之间的实际字符(对于字符串对象):
char* getTextFromJSON(const char *json)
{
if (!json) return NULL;
json_parser p;
#define N_TOKENS 15 // this normally would be at the start of the file
jsontok_t tokens[N_TOKENS];
initJsonParser(&p);
int err parseJson(&p, json, tokens, N_TOKENS);
if (err) {
fprintf(stdout, "Error parsing JSON: %d\n", err);
return NULL;
}
for (int i = 0; i < N_TOKENS; ++i) {
jsontok_t *key = &tokens[i];
if (!memcmp("utterance", &json[key->start], (size_t) (key->end - key->start))) {
++key;
return strndup(&json[key->start], (size_t)(key->end - key->start));
}
}
return NULL;
}
Run Code Online (Sandbox Code Playgroud)
以下是一些将被引入解析器的JSON示例:
{"status":0,"id":"432eac38858968c108899cc6c3a4bade-1","hypotheses":[{"utterance":"test","confidence":0.84134156}]}{"status":5,"id":"695118aaa3d01dc2ac4aa8054d1e5bb0-1","hypotheses":[]}在将第一个示例JSON传递给方法时,我得到了从该方法返回的期望值"test".但是,在将空JSON传递给方法时,我for在条件if语句的循环的第8次迭代中得到了Segmentation错误.
有什么建议?
以下是十六进制值:
key->start: 0x00000000
key->end - key->start: 0x00000046
key->start: 0x00000002
key->end - key->start: 0x00000006
key->start: 0x0000000A
key->end - key->start: 0x00000001
key->start: 0x0000000D
key->end - key->start: 0x00000002
key->start: 0x00000012
key->end - key->start: 0x00000022
key->start: 0x00000037
key->end - key->start: 0x0000000A
key->start: 0x00000043
key->end - key->start: 0x00000002
key->start: 0x3A7B3188
key->end - key->start: 0x7A0F0766
Run Code Online (Sandbox Code Playgroud)
您的tokens[]数组在传递给 之前尚未初始化parseJson(),因此一旦您迭代超出最后一个标记(第二个示例中的第七个标记),您就会尝试memcmp()在未初始化的无意义地址值上运行。这就是导致你的段错误的原因。初始化tokens[]一些内容,然后在循环期间检查开始/结束字段中的初始化值for()。
例如,我可能会初始化tokens[]为零(via memset(&tokens, 0, sizeof(tokens));),并在循环的每次迭代期间检查长度为零(key->end - key->start)以查看令牌在传递给之前是否实际上有效memcmp()。break;如果令牌长度为零,则使用 a 退出循环。
(或者,如果令牌可以具有合法的零长度,请使用其他值。)