Frama-C多行宏定义语法错误

时间:2018-06-20 22:27:17

标签: frama-c

我是Frama-C的新手,我正试图正式验证包含大量如下所示的多行宏定义的代码库:

#define vector_setElement(w,x,i)                  \
  _Generic                                        \
  (                                               \
    (x),                                          \
    const int8_t    : vector_setElement_INT8   ,  \
          int8_t    : vector_setElement_INT8   ,  \
    const uint8_t   : vector_setElement_UINT8  ,  \
          uint8_t   : vector_setElement_UINT8  ,  \
    const int16_t   : vector_setElement_INT16  ,  \
          int16_t   : vector_setElement_INT16  ,  \
    const uint16_t  : vector_setElement_UINT16 ,  \
          uint16_t  : vector_setElement_UINT16 ,  \
    const int32_t   : vector_setElement_INT32  ,  \
          int32_t   : vector_setElement_INT32  ,  \
    const uint32_t  : vector_setElement_UINT32 ,  \
          uint32_t  : vector_setElement_UINT32 ,  \
    const int64_t   : vector_setElement_INT64  ,  \
          int64_t   : vector_setElement_INT64  ,  \
    const uint64_t  : vector_setElement_UINT64 ,  \
          uint64_t  : vector_setElement_UINT64 ,  \
  )                                               \
  (w, x, i)

但是,当我使用此宏定义运行Frama-C时,在使用宏定义的位置出现解析器语法错误。我尝试使用许多不同的多行宏定义进行此操作,并且在使用宏定义的位置总是发生解析器语法错误。

所以,我的问题是:

Frama-C是否支持多行宏定义?如果是这样,我该怎么做才能解决解析器错误?

另外,我知道Frama-C支持某些C11构造,包括_Generic吗?

***更新-解决方案***

事实证明_Generic是使用多行宏定义的语法错误的原因。我认为多行宏定义不使用_Generic,实际上确实在其他一些函数和宏调用下使用了它。无需_Generic解析的多行宏定义就可以了。

2 个答案:

答案 0 :(得分:2)

Frama-C依靠外部预处理器(在编译时默认由相应的autoconf宏指定)来执行宏扩展,因此多行宏应该不是问题(如果有的话) ,这与您的预处理器有关,而与Frama-C无关)。另一方面,_Generic确实不属于Frama-C目前支持的C11功能。

答案 1 :(得分:0)

Frama-C是C,因此它确实支持C,尽管不确定_Generics,这可能是为什么在这种情况下转义不起作用的原因。