很偶然地偶然发现了内核丛林中的一些代码,有些困惑。 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;
}
[我的困惑是,在“ tools”目录中使用的“ fake” kmalloc()
可以返回NULL指针。同样,看起来memset()
实现不检查NULL指针,因此可能存在NULL指针取消引用。是错误还是我错过了什么?
标头主要用于用户空间测试,例如virtio_test
。
来自tools/virtio/virtio_test.c
的git-log:
这是该工具的用户空间部分:它包括一堆用于linux API,有点类似于linuxsched。这样就可以在用户空间中重新编译铃声代码。
实现了一个小测试示例,将其与vhost_test结合在一起模块。
所以是的,代码有点不安全(干净的编码会在NULL
之前测试memset()
指针,并通过适当的错误消息进行纾困),但是由于它只是一个测试工具,因此似乎具有被认为无关紧要跳过此测试。