我在启用 MISRA 2004 检查的 PC-Lint 在线演示网站上的代码片段下方进行 linting
#include <stdint.h>
//enable some of MISRA 2004 Rules
//lint +e960
static uint8_t printf_(uint8_t a, void * b, ...);
static uint8_t printf_(uint8_t a, void * b, ...)
{
(void) a;
(void) b;
return 0U;
}
static const uint8_t (*func)(uint8_t a, void * b, ...) = printf_;
int main(void)
{
uint8_t data[8U] = {0};
(void) func(1U, &data[0], 2U);
return 0;
}
PC Lint 然后告诉我,我违反了 MISRA 2004 规则:
注释 960:违反 MISRA 2004 所需规则 16.1,函数具有可变数量的参数:
printf_
注释 960:违反 MISRA 2004 所需规则 16.9,使用不带“&”或带括号的参数列表的函数标识符:
printf_
如何仅抑制 MISRA 2004 规则 16.1 的功能printf_
?
到目前为止,我已经尝试了以下解决方案,以下都不适合我:
-esym(960, 16.1)
禁止所有其他符号的 MISRA 规则 16.1-estring(960, "printf_")
禁止printf_
符号的所有其他 MISRA 规则,例如规则 16.9-estring(960, "function has variable number of arguments: 'printf_'")
根据手册假设可以工作,但我无法实现-estring(960, "function has variable number of arguments:", "printf_")
来自以下网站的一些实验性提示Matthias Kraaz 的博客也不起作用
我现在得到的最好的是:
- 放入
printf_
block of-esym(960, 16.1) ... +esym(960, 16.1)
,但是这会将 MISRA 2004 警告提升到错误级别,并在将发生另一次违规时停止编译。
我期待着你的想法。