red*_*0ct 7 c linux memset linux-kernel kmalloc
很偶然地在内核丛林中偶然发现了一些代码并且有点困惑。有两种实现kzalloc():在tools/virtio/linux/kernel.h 中,主要的在linux/slab.h 中。显然,在大多数情况下,使用第二个。但有时使用“virtio” kzalloc()。
“virtio”kzalloc()看起来像这样:
static inline void *kzalloc(size_t s, gfp_t gfp)
{
void *p = kmalloc(s, gfp);
memset(p, 0, s);
return p;
}
Run Code Online (Sandbox Code Playgroud)
我的困惑是kmalloc()在“tools”目录中使用的“fake”会返回 NULL 指针。此外,该memset()实现似乎不检查 NULL 指针,因此可能存在 NULL 指针取消引用。这是一个错误还是我错过了什么?
是的,这看起来确实像一个错误。
该tools/子目录是用户空间工具的集合(顾名思义)。您还可以通过包含多个 C 标准库头文件来看到这一点。所以这当然不是一个内核错误(那会非常糟糕),只是virtio测试工具中的一个小疏忽。
该virtio测试工具似乎重新定义了一些内核 API 来模拟它们在用户空间中的行为。但该函数似乎从未在实践中使用过,只是定义了而已。
marco:~/git/linux/tools/virtio$ grep -r kzalloc
linux/kernel.h:static inline void *kzalloc(size_t s, gfp_t gfp)
ringtest/ptr_ring.c:static inline void *kzalloc(unsigned size, gfp_t flags)
marco:~/git/linux/tools/virtio$
Run Code Online (Sandbox Code Playgroud)
它可能是供那些希望在用户空间测试某些 virtio 内核代码的人使用的。
无论如何,您可以尝试报告该错误。脚本get_mantainer.pl建议:
marco:~/git/linux/tools/virtio$ grep -r kzalloc
linux/kernel.h:static inline void *kzalloc(size_t s, gfp_t gfp)
ringtest/ptr_ring.c:static inline void *kzalloc(unsigned size, gfp_t flags)
marco:~/git/linux/tools/virtio$
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
485 次 |
| 最近记录: |