【问题标题】:Does valgrind track memory initialization through drivers?valgrind 是否通过驱动程序跟踪内存初始化?
【发布时间】:2010-07-12 23:54:41
【问题描述】:

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 驱动程序是否正确写入缓冲区? (我查看了驱动代码,似乎是正确的,但也许我遗漏了什么。)

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

谢谢。

【问题讨论】:

  • 除非 ioctl 没有 memset(或类似的)valgrind 在这里正确报告。
  • @ezpz:驱动程序应该将 100 个字节写入 buf ...... ioctl 是一种尴尬的 read() 方式。 (此处未发布更多设置。)
  • 啊,我第一次错过了READ

标签: c linux driver valgrind initialization


【解决方案1】:

Valgrind 显然无法将执行跟踪到内核中,但它确实知道大多数系统调用的可见语义。但是ioctl 太不可预测了。如果您已将驱动程序编码为read 调用,则它会正确。无论如何,这是更好的做法。

【讨论】:

  • 谢谢 Zack,这就是我的想法。代码周围有更多上下文, read() 没有多大意义。 (虽然它不是我的驱动程序,我也无法真正改变它。)
  • 我的意思是说您可以包含memcheck.h,然后使用VALGRIND_MAKE_MEM_DEFINED 而不是memset。这样会更快。
猜你喜欢
  • 1970-01-01
  • 2012-09-04
  • 1970-01-01
  • 2021-06-30
  • 2010-12-22
  • 2018-05-14
  • 1970-01-01
  • 2015-09-09
  • 2014-05-30
相关资源
最近更新 更多