如果捕获此空指针取消引用,为什么不呢?

问题描述

我正在使用内核模块,该模块在插入时会导致空指针取消引用。我已经在swnode.c(不是内核模块的一部分,而是由模块调用)中将错误跟踪到this function

static struct fwnode_handle *
software_node_get_next_child(const struct fwnode_handle *fwnode,struct fwnode_handle *child)
{
    struct swnode *p = to_swnode(fwnode);
    struct swnode *c = to_swnode(child);

    if (!p || list_empty(&p->children) ||
        (c && list_is_last(&c->entry,&p->children)))
        return NULL;

    if (c) {
        c = list_next_entry(c,entry);
        if (c->node)
                pr_info("child node named %s\n",c->node->name);
    } else {
        c = list_first_entry(&p->children,struct swnode,entry);
    }

    return fwnode_handle_get(&c->fwnode);
}

我添加了pr_info("child node named %s\n",c->node->name);调试调用,该行导致空指针取消引用。在此之前,错误是与return fwnode_handle_get(&c->fwnode)有关,这引起了哎呀抱怨我正在NX内存中执行事情;显然c-> fwnode为NULL,所以我可以尝试找出原因,我只是想知道为什么我的调试打印也会引起错误。

这种情况使我感到困惑;我明确检查了cc->node是否为 null,我认为应该防止这种错误(基于{{3} })。取消引用操作针对c(因为据我所知,c->member等效于(*c).member)和c->node。所以;为什么给定pr_info的调用仅在cc->node null的情况下进行评估,这会导致对null指针的取消引用?

编辑:

亲密的选民需要更仔细地阅读问题和话题。此问题不是是由错字引起的。原始示例中缺少的花括号(此后已被编辑为包括花括号)不是问题的原因。

解决方法

您的代码

if (c)
    c = list_next_entry(c,entry);
    if (c->node)
            pr_info("child node named %s\n",c->node->name);
else
    c = list_first_entry(&p->children,struct swnode,entry);

等同于

if (c) {
    c = list_next_entry(c,entry);
}
if (c->node) {
    pr_info("child node named %s\n",c->node->name);
} else {
    c = list_first_entry(&p->children,entry);
}

因此,无论c->node是否为c,都将对NULL进行评估。

添加括号以检查c是否正常工作。

if (c) { /* add a brace */
    c = list_next_entry(c,c->node->name);
} /* add a brace */
else
    c = list_first_entry(&p->children,entry);

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...