You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用switch处理Shell内置命令时出现Segmentation fault问题求助

问题原因&修复方案

核心问题出在hsh_execute函数的两个逻辑疏漏:

  1. 内置命令字符串数组无终止哨兵,导致for循环越界访问
    你当前定义的builtin_str数组仅包含3个有效字符串元素,没有显式添加NULL作为结束标记,C语言不会自动给这种初始化的数组补NULL。你的for循环判断条件为builtin_str[i],当i等于3时会访问数组外的内存,属于未定义行为,可能触发非法内存访问导致段错误。你之前用函数指针实现的版本大概率是加了NULL哨兵,所以没有这个问题。

  2. 未做空输入校验直接访问args[0]
    如果用户输入空行,tokenize函数返回的args数组的第一个元素args[0]会是NULL,你直接传入strcmp会触发非法指针访问,导致段错误。


修复后代码

int hsh_execute(char **args)
{
    int i = 0;
    // 新增空输入校验
    if (args == NULL || args[0] == NULL) {
        return 1;
    }
    // 数组末尾添加NULL作为哨兵
    char *builtin_str[] = {
        "cd",
        "help",
        "exit",
        NULL
    };

    for (i = 0; builtin_str[i]; i++)
    {
        if (strcmp(builtin_str[i], args[0]) == 0)
            break;
    }
    switch (i)
    {
        case 0:
            hsh_cd(args);
            break;
        case 1:
            hsh_help();
            break;
        case 2:
            hsh_exit();
            break;
        default:
            launch_child(args);
            break;
    }
    return 1;
}

如果修改后仍有问题,可以检查hsh_cd函数是否处理了不带参数的cd场景,避免访问args[1]时出现空指针解引用。

内容的提问来源于stack exchange,提问作者seahorse-code

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 22:54:03