首页 > 解决方案 > MISRA C 2012 21.1

问题描述

#define 并且#undef不得用于保留的标识符或保留的宏名称。

我违反了此代码的此规则

"#define _POSIX_C_SOURCE 200809L". 

_POSIX_C_SOURCE是宏的保留标识符。

此代码的正式偏差是什么?

标签: cmisra

解决方案


这不仅是 MISRA 违规,也是标准 C 违规。参见例如 C11 7.1.3:

  • 以下划线和大写字母或另一个下划线开头的所有标识符始终保留用于任何用途。

其中“保留用于任何用途”是指为编译器/库实现保留。

问题在于标识符的 Glibc 命名。如果实现支持此标识符,那么您应该能够使用它。

但这里有个问题:让 Glibc MISRA 兼容是不可能完成的任务。并且专业的 MISRA-C 实现不允许使用不兼容的库。

如果您仍然坚持使用这些库,则必须为整个标准库创建一些大规模的、项目范围的偏差。这里的问题是,大量的 Glibc 代码依赖于 gcc 非标准扩展,例如编写在库实现之外具有不良定义行为的代码——为了编写一个标准库,而普通 C 规则没有不适用。从 MISRA-C 的角度来看,您不可能提出这样的代码值得信任的论点。

我会问打电话在同一个项目中结合 POSIX、Glibc 和 MISRA-C 的人如何从这里继续......


推荐阅读