使用 libconfig 解析组元素时出现分段错误
Segmentation fault when parsing group elemnt with libconfig
我正在尝试编写 C 代码以使用 libconfig
解析配置文件
配置文件包含一个简单元素和一个组。一个组由多个设置组成,每个设置都有一个唯一的名称。 ref
配置文件:
host_name = "HOST";
device_settings:
{
rcu1:
{
product_id = 0x0001;
vendor_id = 0x0217;
},
rcu2:
{
product_id = 0x0001;
vendor_id = 0x0218;
}
}
我想解析所有的RCUs数据并将其存储在一个数据结构中(存储部分暂时没有问题)。
所以我使用以下简单步骤:
- 将组存储在
config_setting_t *
调用的部分。
- 在名为 len 的变量中获取部分的长度
- 迭代 len 时间以读取 RCU 数据。
问题是当我想读取 RCU 数据时出现段错误。
代码:
#include <libconfig.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main()
{
config_t cfg;
config_setting_t *root;
config_setting_t *section;
config_setting_t *elem;
int d, len;
config_init(&cfg);
if (config_read_file(&cfg,"./config.cfg") != CONFIG_TRUE) {
printf("[%s:%d] %s \n", config_error_file(&cfg),
config_error_line(&cfg), config_error_text(&cfg));
config_destroy(&cfg);
return -1;
}
if ((root = config_root_setting(&cfg)) == NULL) {
printf ("[%s:%d] %s \n", config_error_file(&cfg),
config_error_line(&cfg), config_error_text(&cfg));
config_destroy(&cfg);
return -1;
}
/* Device settings */
if ((section = config_setting_get_member(root, "device_settings")) != NULL)
{
len = config_setting_length(section);
printf("len = %d \n",len);
}
int i;
const char* device_id;
config_setting_t *device = NULL;
printf("device_settings %s a group \n",config_setting_is_group(section)?"is":"isn't");
for(i=0;i<len;i++) {
printf("iteration i = %d \n",i);
//device
if(device = config_setting_get_elem(section, i) != NULL) {
/*device id*/
if ((d = config_setting_lookup_string(device, "device_id",&device_id) != CONFIG_FALSE)) /*seg fault here*/
{
// Do stuff
}
}
}
return 0;
}
我注意到一些奇怪的事情是当我编译代码时我收到这个警告:
parse.c: In function ‘main’: parse.c:46:14: warning: assignment to
‘config_setting_t *’ {aka ‘struct config_setting_t *’} from ‘int’
makes pointer from integer without a cast [-Wint-conversion]
if(device = config_setting_get_elem(section, i) != NULL) {
GDB 输出:
Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7da78a0 in config_setting_get_member () from
/lib/x86_64-linux-gnu/libconfig.so.9
ref 到 config_setting_get_elem(..)
我找不到我做错了什么。在我看来一切都是正确的。
有人能看出段错误发生的原因吗?
if (device = config_setting_get_elem(section, i) != NULL)
需要
if ((device = config_setting_get_elem(section, i)) != NULL)
因为!=
的优先级高于=
。
我正在尝试编写 C 代码以使用 libconfig
解析配置文件配置文件包含一个简单元素和一个组。一个组由多个设置组成,每个设置都有一个唯一的名称。 ref
配置文件:
host_name = "HOST";
device_settings:
{
rcu1:
{
product_id = 0x0001;
vendor_id = 0x0217;
},
rcu2:
{
product_id = 0x0001;
vendor_id = 0x0218;
}
}
我想解析所有的RCUs数据并将其存储在一个数据结构中(存储部分暂时没有问题)。
所以我使用以下简单步骤:
- 将组存储在
config_setting_t *
调用的部分。 - 在名为 len 的变量中获取部分的长度
- 迭代 len 时间以读取 RCU 数据。
问题是当我想读取 RCU 数据时出现段错误。
代码:
#include <libconfig.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main()
{
config_t cfg;
config_setting_t *root;
config_setting_t *section;
config_setting_t *elem;
int d, len;
config_init(&cfg);
if (config_read_file(&cfg,"./config.cfg") != CONFIG_TRUE) {
printf("[%s:%d] %s \n", config_error_file(&cfg),
config_error_line(&cfg), config_error_text(&cfg));
config_destroy(&cfg);
return -1;
}
if ((root = config_root_setting(&cfg)) == NULL) {
printf ("[%s:%d] %s \n", config_error_file(&cfg),
config_error_line(&cfg), config_error_text(&cfg));
config_destroy(&cfg);
return -1;
}
/* Device settings */
if ((section = config_setting_get_member(root, "device_settings")) != NULL)
{
len = config_setting_length(section);
printf("len = %d \n",len);
}
int i;
const char* device_id;
config_setting_t *device = NULL;
printf("device_settings %s a group \n",config_setting_is_group(section)?"is":"isn't");
for(i=0;i<len;i++) {
printf("iteration i = %d \n",i);
//device
if(device = config_setting_get_elem(section, i) != NULL) {
/*device id*/
if ((d = config_setting_lookup_string(device, "device_id",&device_id) != CONFIG_FALSE)) /*seg fault here*/
{
// Do stuff
}
}
}
return 0;
}
我注意到一些奇怪的事情是当我编译代码时我收到这个警告:
parse.c: In function ‘main’: parse.c:46:14: warning: assignment to ‘config_setting_t *’ {aka ‘struct config_setting_t *’} from ‘int’ makes pointer from integer without a cast [-Wint-conversion] if(device = config_setting_get_elem(section, i) != NULL) {
GDB 输出:
Program received signal SIGSEGV, Segmentation fault. 0x00007ffff7da78a0 in config_setting_get_member () from /lib/x86_64-linux-gnu/libconfig.so.9
ref 到 config_setting_get_elem(..)
我找不到我做错了什么。在我看来一切都是正确的。
有人能看出段错误发生的原因吗?
if (device = config_setting_get_elem(section, i) != NULL)
需要
if ((device = config_setting_get_elem(section, i)) != NULL)
因为!=
的优先级高于=
。