1

我在启用 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 警告提升到错误级别,并在将发生另一次违规时停止编译。

我期待着你的想法。

4

0 回答 0