当初始化返回变量时,读缓冲区为零;

时间:2015-08-21 12:19:45

标签: c initialization posix fuse

这是一个真正的WTF情况......我生气了吗??

我注意到我的FUSE读取操作在我更新代码以阻止我的linter抱怨之后开始用零填充缓冲区:

int cramp_read(const char* path, char* buf, size_t size, off_t offset, struct fuse_file_info* fi) {
  int res = 0;

  struct my_filep* f = get_filep(fi);
  (void)path;

  if (f) {
    switch (f->type) {
      case fd_normal:
        if (pread(f->filep, buf, size, offset) == -1) {
          res = -errno;
        }
        break;

      case fd_special:
        if (my_read(f->specialp, buf, size, offset) == -1) {
          res = -errno;
        }
        break;

      default:
        res = -EPERM;
    }
  } else {
    res = -EBADF;
  }

  return res;
}

也就是说,特别是pread分支(我还没写my_read)。但是,调试显示pread正确地将缓冲区设置为文件内容...经过一些挖掘,我发现错误是在我初始化变量时:即int res = 0;似乎导致了这个问题行为。如果我将其更改回int res;,它会再次开始工作。

更奇怪的是:当我将变量保留为未初始化并在最后return之前将其打印到stderr时 - 即,在完成所有工作之后 - {{1} }失败,我收到pread错误。

有人能解释一下这里发生了什么吗?我已经在其他地方根据我的要求初始化了我的变量,现在我担心我已经引入了大量等待被发现的定时炸弹!

1 个答案:

答案 0 :(得分:0)

好的,我是个白痴!在阅读FUSE文档后,我发现read实现应该返回读取字节数,而不是通常的FUSE接口为0表示成功,而-errno表示失败。

以下修复了问题,同时保留了初始化:

...
if ((res = pread(f->filep, buf, size, offset)) == -1) {
...

(同样适用于我尚未实施的my_read分支。)