这是一个从一个更大的程序减少的快速测试用例,该程序使用 frama-c NEON 产生语法错误:
cat <<"EOF" > min.i
struct list;
typedef struct list list_t;
void list_merge(list_t *, list_t *, int (const void *, const void *));
EOF
frama-c -val min.i
frama-c 是否仅限于我在这里违反的 c99 的某个子集?
void list_merge(int(int));
被 Clang 和 GCC 接受,但被http://cdecl.org/拒绝
它似乎是有效的语法(相关的是 C11 中 6.7.7:1 的抽象声明符的定义):
抽象声明器: 指针 指针选择直接抽象声明符 直接抽象声明符: (抽象声明者) 直接抽象声明器选择[类型限定符列表选择赋值表达式选择] 直接抽象声明器opt [ 静态类型限定符列表opt赋值表达式 ] 直接抽象声明器opt [类型限定符列表静态赋值表达式] 直接抽象声明器选择[*] 直接抽象声明器选择(参数类型列表选择)
换句话说,是的,似乎 Frama-C 仅限于函数参数的非奇怪抽象声明符的子集。这可能是一个简单的遗漏,如果您报告它可能会得到修复。