首页 > 解决方案 > 调用 globfree() 时出现分段错误

问题描述

[使用 arm-hisiv300-linux-gcc 编译基于 Linux 的 Target board]

调用此函数时出现分段错误。

uint32_t dir_disp(void)
{
    uint32_t        err;
    uint32_t        i;
    size_t          cnt;
    char            *str;
    char            **p;

    glob_t          glob_results;   

    err = glob("/home/2019-11-12/H*", GLOB_MARK, 0, &glob_results);

    p = glob_results.gl_pathv;
    cnt = glob_results.gl_pathc;

    for (i=0; i<cnt; i++)
    {
        printf("[DEBUG] dir_disp: %s\n",p[i]);
    }

    globfree(&glob_results);
    return 0;
}

上面的函数只从线程函数中调用一次,只有当有超过~100个项目匹配模式“ /home/2019-11-12/H*”时才会发生分段错误

在以下情况下不会发生分段错误:

[编辑]

对不起,但我忘了提到只有在打印所有与模式匹配的项目后才会发生段错误。

我检查了 ret valglob()并发现它为零。不改变原来的问题。

标签: csegmentation-faultglob

解决方案


根据 Linux 手册页,glob()不是 MT 安全的,因此“在多线程程序中调用是不安全的”

可能值得注意的是,Posix 确实需要glob()MT 安全,因此该属性特定于 glibc 中的 Gnu 实现,并且可能与 Gnu 扩展有关,例如波浪号扩展选项。尽管如此,您应该注意警告。

根据您报告的症状,可能的问题是堆栈溢出,可能与实施中的allocaVLA的使用有关glob。(不过,我没有检查源代码;我没有特别证据表明实际使用了这些功能。)多线程代码中的默认堆栈大小往往非常小,在非 MT 环境中运行良好的代码很容易超过默认线程的堆栈大小。您可以在创建调用的线程时尝试增加堆栈大小glob


推荐阅读