2

这是一个从一个更大的程序减少的快速测试用例,该程序使用 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 的某个子集?

4

1 回答 1

1

void list_merge(int(int));被 Clang 和 GCC 接受,但被http://cdecl.org/拒绝

它似乎是有效的语法(相关的是 C11 中 6.7.7:1 的抽象声明符的定义):

抽象声明器:
    指针
    指针选择直接抽象声明符
直接抽象声明符:
    (抽象声明者)
    直接抽象声明器选择[类型限定符列表选择赋值表达式选择]
    直接抽象声明器opt [ 静态类型限定符列表opt赋值表达式 ]
    直接抽象声明器opt [类型限定符列表静态赋值表达式]
    直接抽象声明器选择[*] 直接抽象声明器选择(参数类型列表选择

换句话说,是的,似乎 Frama-C 仅限于函数参数的非奇怪抽象声明符的子集。这可能是一个简单的遗漏,如果您报告它可能会得到修复。

于 2014-04-30T10:25:29.407 回答