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 */
}
如果我在驱动程序调用之前memset()buf,则错误消失。
valgrind可以检测linux驱动程序是否正确写入缓冲区? (我查看了驱动程序代码,它似乎是正确的,但也许我错过了一些东西。)
或者只是通过驱动程序调用并且无法知道缓冲区是否已写入内核?
感谢。
答案 0 :(得分:7)
Valgrind显然无法跟踪执行内核,但它确实知道大多数系统调用的可见语义。但ioctl
太不可预测了。如果您已将驱动程序编码为read
调用,那么它就会正确。无论如何,这是更好的做法。