c-json_tokener_parse,分段错误


void TestSegFunction(void)
{
int i = 0;
char *str = ""{"loop_number":1}""; // line 410
char *str = "{"loop_number":1}"; // line 411
json_object *pstObj = NULL;
json_object *sonPstObj = NULL;
pstObj = json_tokener_parse(str);    // line 414
if (NULL == pstObj)
{
printf("%s : json_tokener_parse failed.n", __FUNCTION__);
}
else
{
json_object_object_foreach(pstObj, key1, val1) 
{
if (0 == strcmp(key1, LOOP_NUMBER))
{
i = json_object_get_int(val1);
printf("i = %dn", i);
}
}
}
}

如第 410 行和 411 行所示,如果使用 410 行代码,则 414 行函数调用中会出现段错误。如果使用 411 行代码,则 414 行不会有错误,因为此函数由其他人调用,他们可能会输入错误字符串。我不想看到段错误来停止程序。有没有办法避免这种段落错误?

问题是我正在尝试迭代不属于json_type_object类型的东西。 我需要添加一个像

if (json_object_get_type(pstObj) != json_type_object) {
...handle error...
}

json_object_object_foreach之前.

这个答案来自 https://github.com/json-c/json-c/issues/623。

代码行 410 不起作用,而 411 不起作用是有道理的。

char *str = ""{"loop_number":1}"";

这不是有效的JSON,因为JSON不能以"开头,这个代码行实际上在做什么。它为您提供字符串"{"loop_number": 1}}"。只需使用 c 的打印功能即可验证。但是 JSON 可以从{开始。

char *str = "{"loop_number":1}";

这给了你字符串{"loop_number": 1}(见,{ }周围没有"(。

我希望这有所帮助。

编辑

当代码在第 414 行中断时,您可以直接使用json_tokener_parse_ex。事实上,json_tokener_parse似乎只是简单地包装json_tokener_parse_ex.因此,如果您按照文档中和此处的说明直接使用它,您可能会解决此问题。然而,这很奇怪,因为这个答案建议以你的方式解决你的问题。也许它已经过时了?

相关内容

  • 没有找到相关文章

最新更新