这是一个快速测试案例,从一个更大的程序中减少,该程序产生了与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的某个子集中?
答案 0 :(得分:1)
void list_merge(int(int));
,
但被http://cdecl.org/
它似乎是有效的语法(相关的是在C11中6.7.7:1的abstract-declarator的定义):
abstract-declarator: pointer pointeropt direct-abstract-declarator direct-abstract-declarator: ( abstract-declarator ) direct-abstract-declaratoropt [ type-qualifier-listopt assignment-expressionopt ] direct-abstract-declaratoropt [ static type-qualifier-listopt assignment-expression ] direct-abstract-declaratoropt [ type-qualifier-list static assignment-expression ] direct-abstract-declaratoropt [ * ] direct-abstract-declaratoropt ( parameter-type-listopt )
换句话说,是的,似乎Frama-C仅限于函数参数的非奇怪抽象声明符的子集。这可能是一个简单的遗漏,如果您报告它可能会被修复。