C valgrind是否通过驱动程序跟踪内存初始化?
valgrind报告的未初始化内存错误如下:C valgrind是否通过驱动程序跟踪内存初始化?,c,linux,driver,valgrind,initialization,C,Linux,Driver,Valgrind,Initialization,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
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 */
}
无符号字符buf[100];
结构驱动程序命令cmd;
cmd.len=sizeof(buf);
cmd.buf=buf;
ioctl(我的驱动程序fd、READ和cmd);
对于(i=0;i foo(buf[i])显然,Valgrind无法将执行跟踪到内核,但它确实知道大多数系统调用的可见语义。但是,ioctl
太不可预测了。如果您对驱动程序进行了编码,使其成为一个read
调用,那么它会正确执行。无论如何,这是更好的做法。谢谢Zack,这就是我所想的代码的上下文稍微多了一点,read()就没什么意义了。(虽然它不是我的驱动程序,我也不能真正更改它。)我想说的是,你可以包含memcheck.h
,然后使用VALGRIND\u make\u MEM\u DEFINED
而不是memset
。这样会更快。除非ioctl做memset(或类似)valgrind在此报告正确。@ezpz:驱动程序应该将100字节写入buf…ioctl是执行读取()的一种笨拙方式。(这里没有发布更多涉及的设置。)啊,我第一次读到时错过了read
。