MISRA C:2012 规则 21.1 是否与 C11 相矛盾?

Does MISRA C:2012 rule 21.1 contradict with C11?

MISRA C:2012,规则 21.1:

#define and #undef shall not be used on a reserved identifier or reserved macro name.

但是,C11 允许定义,例如,__STDC_WANT_LIB_EXT1__

示例:

#define __STDC_WANT_LIB_EXT1__ 1       /* violation of MISRA C:2012, rule 21.1 */
#include <stdio.h>
#ifdef __STDC_LIB_EXT1__
/* tmpfile_s is available */
#endif

这是否意味着规则 21.1 与 C11 相矛盾?


更新。任何符合 MISRA-C 的项目都不能使用 Annex K。这是因为根据 MISRA C:2012 修正案 2:

Other than defining __STDC_WANT_LIB_EXT1__ to '0', the facilities of Annex K (Bounds-checking interfaces) shall not be used.

原来的MISRA-C:2012只涵盖了C90和C99。

您显然已经发现,关于 C11 兼容性的 MISRA C:2012 AMD2 几乎禁止所有突出的 C11 功能(规则 1.4 AMD2.30),包括附件 K bounds-checking 接口。

我完全不知道为什么会有人想要 #define __STDC_WANT_LIB_EXT1__ 1,更不用说在 safety-related 应用程序中了。 bounds-checking 接口甚至在 WG14 C 委员会内部也受到了很多批评。您不需要规则来告诉您它在 MISRA C 应用程序中没有位置 - 常识会让您走得很远。

至于规则 21.1,基本原理是人们不应该 运行 去创建他们自己的魔法包装器,在标准库函数等周围有令人惊讶的行为。像 #define strcpy(dst, src) strcpy(src, dst) 或类似的宏疯狂喜欢发明自己的“本地车库标准”宏语言的人可能会想出。

尽管您打算使用 __STDC_WANT_LIB_EXT1__ 的具体细节,但规则 20.1 旨在防止意外或故意(重新)定义保留宏。

任何预期的(重新)定义都允许通过偏差进行 - 这需要用户证明他们正在做的事情。

如果您真的想要使用附件 K(并且@Lundin 已经解决了您可能不应该使用的原因),您可以这样做 - 通过偏离规则 20.1 重新定义__STDC_WANT_LIB_EXT1__ 和规则 1.4 撤销当前实施的一揽子限制。这种偏差将需要 you 来表明您理解 Annex K 的问题,以及 you 正在做什么来防止可疑行为。

作为脚注,MISRA C WG 的当前立场是对附件 K 的限制可能会继续存在,至少要等到 wg14 就前进的道路达成一致。

免责声明:查看我的从属关系资料