使用 libconfig 传递组元素时出现分段错误

Posted

技术标签:

【中文标题】使用 libconfig 传递组元素时出现分段错误【英文标题】:Segmentation fault when parsing group elemnt with libconfig 【发布时间】:2021-05-24 06:59:23 【问题描述】:

我正在尝试编写 C 代码来使用 libconfig 解析配置文件

配置文件包含一个简单元素和一个组。一个组由多个设置组成,每个设置都有一个唯一的名称。 ref

配置文件:

host_name = "HOST";
device_settings:

   rcu1:
   
     product_id  = 0x0001;
     vendor_id = 0x0217;
  ,
  rcu2:
  
   product_id  = 0x0001;
   vendor_id = 0x0218;
  

我想解析所有 RCU 数据并将其存储在一个数据结构中(存储部分暂时没有问题)。

所以我使用的简单步骤:

    将该组存储在名为config_setting_t * 的部分中。 在名为 len 的变量中获取节的长度 迭代 len 时间以读取 RCU 数据。

问题是当我想读取 RCU 数据时,我遇到了 seg 错误。

代码:

#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:在函数“main”中:parse.c:46:14:警告:分配给 'config_setting_t *' aka 'struct config_setting_t *' 来自'int' 从整数生成指针而不进行强制转换 [-Wint-conversion] if(device = config_setting_get_elem(section, i) != NULL)

GDB 输出:

程序收到信号SIGSEGV,分段错误。 config_setting_get_member () 中的 0x00007ffff7da78a0 来自 /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)。因为!= 的优先级高于=。顺便说一句,您为section 做的正确。 那是因为我从 example.c 中复制了第一部分。很好看,如果您可以将其发布为答案,那么我可以接受它。 【参考方案1】:
if (device = config_setting_get_elem(section, i) != NULL)

需要

if ((device = config_setting_get_elem(section, i)) != NULL)

因为!= 的优先级高于=

【讨论】:

以上是关于使用 libconfig 传递组元素时出现分段错误的主要内容,如果未能解决你的问题,请参考以下文章

尝试连接二维数组的元素时出现分段错误

在 C++ 中使用向量时出现分段错误?

处理删除命令时出现分段错误

在 C 中创建大型数组时出现分段错误

擦除矢量时出现分段错误

返回指针时出现分段错误[关闭]