问题描述
我正在使用内核模块,该模块在插入时会导致空指针取消引用。我已经在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,所以我可以尝试找出原因,我只是想知道为什么我的调试打印也会引起错误。
这种情况使我感到困惑;我明确检查了c
和c->node
是否为非 null,我认为应该防止这种错误(基于{{3} })。取消引用操作针对c(因为据我所知,c->member
等效于(*c).member
)和c->node
。所以;为什么给定pr_info
的调用仅在c
和c->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);