为什么frama-c会对此产生语法错误?

时间:2014-04-29 16:54:18

标签: c frama-c

这是一个快速测试案例,从一个更大的程序中减少,该程序产生了与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的某个子集中?

1 个答案:

答案 0 :(得分:1)

Clang和GCC接受

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仅限于函数参数的非奇怪抽象声明符的子集。这可能是一个简单的遗漏,如果您报告它可能会被修复。