宏扩展时的 Frama-c 语法错误

Frama-c syntax error on macro expansion

我收到以下语法错误:

../stat-time.h:58:[kernel] user error: Cannot find field st_atim

这在 Paul Eggert 的 gnu stat-time.h 中。这是导致错误的代码段:

#define STAT_TIMESPEC(st, st_xtim) ((st)->st_xtim)

long int get_stat_atime_ns(struct stat const *st) {
  ...
  // 58:
  return STAT_TIMESPEC(st, st_atim).tv_nsec;
  ...
}

我尝试先预处理文件,然后 运行 frama-c 对预处理文件进行处理,但这没有帮助。 Frama-c在同一个位置还是报同样的错误,即使文件预处理正确,宏也正确展开!我如下调用 gcc 进行预处理:

gcc -E -C -I. -dD -nostdinc -D__FC_MACHDEP_X86_32 -I/usr/local/share/frama-c/libc

有什么想法吗?

我想出了解决办法。显然,/usr/local/share/frama-c/libc/__fc_define_stat.h 中的 frama-c header 缺少 struct stat 中的 nsec 粒度字段。我将以下字段添加到 struct stat 以解决问题:


    unsigned long int st_atimensec;
    unsigned long int st_mtimensec;
    unsigned long int st_ctimensec;

此外,确保在配置时使用 frama-c header,例如 configure CPP='gcc -E -C -dD -nostdinc -I/usr/local/share/frama-c/libc。如果没有,您将需要 取消定义 以下两个宏: HAVE_STRUCT_STAT_ST_ATIM_TV_NSECHAVE_STRUCT_STAT_ST_ATIMESPEC_TV_NSEC 定义 以下宏:HAVE_STRUCT_STAT_ST_ATIMENSEC 在 header 文件中,并将其包含在 config.h__fc_define_stat.h