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 驱动程序是否正确写入缓冲区? (我查看了驱动程序代码,它似乎是正确的,但也许我遗漏了什么。)
还是它只是通过了驱动程序调用而无法知道缓冲区已写入内核?
谢谢。
最佳答案
Valgrind 显然无法追踪到内核的执行,但它确实知道大多数系统调用的可见语义。但是 ioctl
太不可预测了。如果您对驱动程序进行了编码,使其成为一个read
调用,它就会正确执行。无论如何,这是更好的做法。
关于c - valgrind 是否通过驱动程序跟踪内存初始化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3233174/