c - 为什么 MISRA-C 检查器提供错误检查 STM32 HAL?
问题描述
我已经使用 stm32cubemx 开始了一个包含 HAL 库的项目,但似乎存在 HAL 和 MISRA-C 合规性问题。
我正在使用 Keil 进行软件开发,并且添加了 PC-Lint (MISRA-C checker) 来检查 C 标准。当我运行 PC-lint 检查 MISRA-C 规则时,我收到了许多由 HAL 命令产生的 MISRA-C 2012 违规规则。
注意,除了stm32cube生成的源文件,我没有输入任何源文件。
例如,生成的文件包含以下两行:
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
__attribute__((section(".revsh_text"))) __STATIC_INLINE __ASM int16_t __REVSH(int16_t value)
但我因此收到这些错误:
: Note 934: Taking address of near auto variable 'GPIO_InitStruct' (arg. no. 2) [MISRA 2012 Rule 1.3, required]
__attribute__((section(".revsh_text"))) __STATIC_INLINE __ASM int16_t __REVSH(int16_t value)
我还收到很多其他错误。据此, HAL 符合 MISRA C 2012。有什么问题?
解决方案
大多数板级支持包会导致违反 MISRA C 规则。
这是因为,通常,这些 BSP 正在做的事情(大多数时候)不是好主意。有时,它们是必要的(例如,内存映射寄存器需要将整数转换为指针,尽管这可以在链接器中完成)
它们通常还包含许多特定于编译器的魔法(因此规则 1.1、规则 1.2 和指令 1.1 值得适当审查!)
因此,您需要将您的违规行为分为三组。
- 纠正需要修复的违规行为
- 需要偏离的必要违规行为
- 您可以接受的建议违规行为(并记录您的推理)
请记住:偏差是 MISRA 合规性的可接受方面!任何说您不允许偏差的剪贴板监视器都需要一些再教育。
对于第 2 组,MISRA 发布了一些偏差许可来帮助您...
免责声明:见简介
PS:为了拯救@Lundin 发表评论,尽管我的专业背景,PC-Lint 并不是分析仪的最佳选择。
-- 已编辑 --
据此,HAL 符合 MISRA C 2012。
根据(现在添加的)链接
HAL 和 LL API 可用于生产,按照 MISRA-C®:2012 指南开发并使用 CodeSonar 静态分析工具进行检查。报告可按需提供。
你需要索取这些报告,看看他们怎么说。我很想亲自去问他们......
由于他们声称符合 MISRA C 2012,因此将有一份指南合规摘要(以及其他一些内容)......如果没有,他们就不合规。
推荐阅读
- list - 如何使用 Lisp 编写设置封面代码?(包括算法)
- julia - 选择结构数组或多个数组的指南
- python - 在表示从一个项目到另一个项目的相对距离的数据集上使用 K 均值聚类意味着什么?
- angular7 - 角料粘柱多于1列
- javascript - 在获取父元素的 id 时附加一个元素
- php - php通过自定义命令调用scrapy
- html - 找不到缺少的结束 div 标签
- mysql - 根据条件从表中检索结果
- django - Django,使用 sqlite 处理静态内容,使用 postgresql 处理其他所有内容
- c - 字符串中间的'\0'是否可以在C中被识别为字符串的结尾?