如何为 stat() 函数编写函数存根?

How can I write a function stub for stat() function?

我正在尝试为 中的函数 stat() 编写存根。 我能够使用以下代码为 fstat 成功执行此操作:

static int fstat_count;
static int fstat_fail_instance;
int my_fstat(const int fd, struct stat * st) {
  fstat_count ++;
  if (fstat_count == fstat_fail_instance) {
    return EINVAL;
  }
  st->st_size = ST_SIZE;
  return EOK;
}
#undef fstat
#define fstat my_fstat

当我尝试使用 stat 执行此操作时,出现如下错误:

mkqfs_file_test.c:28:20: error: storage size of ‘sb’ isn’t known
  const struct stat sb;

我相信这是因为当我做 #undef stat #define stat my_stat 就像我对 fstat 所做的那样,它取消定义了 struct stat 而不是函数。 知道如何解决这个问题,即只有 undefine/redefine 功能吗?

[...] I get errors like:

mkqfs_file_test.c:28:20: error: storage size of ‘sb’ isn’t known
  const struct stat sb;

which i believe is because when I do the #undef stat #define stat my_stat like i do for fstat, it is undefining the struct stat not the function.

不,#undef stat 不会取消定义任何函数或任何结构类型。它取消定义任何以前使用该名称定义的 预处理器宏 。因此,它可能是不必要的,最坏的情况下它是无害的。然而,在不太可能存在这样一个宏定义的情况下,符合规范的程序确实需要在重新定义它之前取消定义它。

问题出在 #define 上。如果 stat 宏的定义在您的结构声明出现的地方可见,那么它将在该标识符用作结构标记的地方展开。结果,这...

  const struct stat sb;

...扩展为...

  const struct my_stat sb;

。范围内没有可见类型 struct my_struct 的定义,因此不允许该声明。正如编译器所说,它不知道为 struct my_stat 提供多少 space,它也无法使用,因为编译器也不知道它的任何成员是什么。请注意,这不会阻止声明或使用指向 struct my_stat 的指针,但这有其自身的问题。

Any idea how I can resolve this, ie only undefine/redefine function?

同样,您没有取消定义任何函数。由于 stat 在不同的名称 space 中用于相关目的,因此没有完全干净的方法来使用宏替换 my_stat() 代替 stat()。您可以做三件主要的事情:

  1. 改用 function-like 宏:

    #define stat(p,b) my_stat((p),(b))
    

    在这种情况下,您必须确保不会尝试计算指向 stat 的指针。这可能是您最好的选择。

  2. 一并省略#undefine#define,并将替换函数命名为stat(),与原来的相同。这依赖于链接器选择您的 locally-defined 版本而不是库版本,它可能会这样做。但是,这可能会产生比您预期的更广泛的影响。

  3. #undefine之前为struct stat声明一个typedef:

    typedef struct stat struct_stat;
    #undefine stat
    #define stat my_stat
    

    然后在您的宏定义可见的任何地方使用 typedef 而不是键入 struct stat

    struct_stat sb;