【问题标题】:Pc lint "-egrep" option [duplicate]Pc lint“-egrep”选项[重复]
【发布时间】:2022-01-05 15:53:25
【问题描述】:

我正在尝试使用 Pc-lint 清除我的代码中的 misra 违规行为。

其中之一是违反本规范中的规则 11.4。

GPIO_PinState level = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_6);

GPIOB的定义是

#define GPIOB               ((GPIO_TypeDef *) GPIOB_BASE)

违规如下:*[9078] 对象指针类型“GPIO_TypeDef ”和整数类型“unsigned long”之间的转换[MISRA 2012 Rule 11.4,咨询]

由于我无法修改此文件(并且位于内存映射寄存器上),我正在尝试使用 Pc-lint 命令“egrep”来避免此“警告”。

我试过了

//lint -egrep(9078, "type 'GPIO_TypeDef *' and integer type 'unsigned long'")

但它不起作用。

我不想使用这个命令

//lint -e9078

因为我只想排除这种特殊的违规行为。

提前感谢您的帮助。

【问题讨论】:

  • 您需要在正则表达式中转义 * 以使其文字化。
  • 我相信链接的帖子是完全重复的。如果它没有回答问题,请告诉我。 TL;DR:在处理硬件寄存器映射时,您必须跳过此建议规则。但一定有一个不稳定的地方。
  • 嗨@Lundin,我的问题与如何在Pc-lint 中使用“egrep”选项有关。我知道这是一条建议性规则,它将被放弃,但为了以更好的方式分析我的代码,我想排除无用的警告。

标签: c stm32 misra pc-lint


【解决方案1】:

意法半导体发布的 HAL 驱动程序包含数百行代码;没有规定不会干扰 HAL 驱动程序;我在行业中多次目睹 HAL 驱动程序受到干扰。

你可以使用指针算法来解决这个问题。 Keil RTOS v2 包中分享了类似的案例研究:

__STATIC_INLINE mem_block_t *MemBlockPtr (void *mem, uint32_t offset) {
  uint32_t     addr;
  mem_block_t *ptr;

  //lint --e{923} --e{9078} "cast between pointer and unsigned int" [MISRA Note 8]
  addr = (uint32_t)mem + offset;
  ptr  = (mem_block_t *)addr;

  return ptr;
}

参考文献

【讨论】:

  • 由于 ST 据称声称符合 MISRA,因此在某处应该有文档列出偏差或被忽略的咨询规则。
猜你喜欢
  • 2011-11-25
  • 2013-02-01
  • 2011-11-23
  • 2013-02-17
  • 1970-01-01
  • 2019-06-16
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
相关资源
最近更新 更多