下面是一个快速测试用例,它是从一个大得多的程序中简化而来,该程序在使用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的抽象声明符定义):
抽象声明人:
指针
pointeropt直接抽象声明符
直接抽象声明:
(抽象声明者)
直接抽象声明opt[类型限定符listopt赋值表达式opt]
直接抽象declaratoropt[静态类型限定符listopt赋值表达式]
直接抽象declaratoropt[类型限定符列表静态赋值表达式]
直接抽象声明opt[*]直接抽象声明opt(参数类型listopt)
换句话说,是的,Frama-C似乎仅限于函数参数的非奇异抽象声明符的子集这可能是一个简单的遗漏,如果您报告它,可能可以修复。

关于c - 为什么frama-c会对此产生语法错误?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23370750/

10-11 07:29