valgrind是否通过驱动程序跟踪内存初始化?

bst*_*rre 4 c linux valgrind initialization driver

valgrind报告来自以下代码的未初始化的内存错误:

unsigned char buf[100];
struct driver_command cmd;
cmd.len = sizeof(buf);
cmd.buf = buf;
ioctl(my_driver_fd, READ, &cmd);

for(i = 0; i < sizeof(buf); i++)
{
    foo(buf[i]); /* <<--- uninit use error from valgrind */
}
Run Code Online (Sandbox Code Playgroud)

如果我在驱动程序调用之前memset()buf,则错误消失.

valgrind可以检测linux驱动程序是否正确写入缓冲区?(我查看了驱动程序代码,它似乎是正确的,但也许我错过了一些东西.)

或者只是通过驱动程序调用,无法知道缓冲区已写入内核?

谢谢.

zwo*_*wol 7

Valgrind显然无法跟踪执行内核,但它确实知道大多数系统调用的可见语义.但ioctl太难以预测了.如果你已经对你的驱动程序进行了编码,那么这就是一个read电话,那就可以了.无论如何,这是更好的做法.

  • 我想提一下你可以包含`memcheck.h`,然后使用`VALGRIND_MAKE_MEM_DEFINED`而不是`memset`.那会更快. (3认同)