IAR CSTAT 分析中的 UNION 类型双关错误

问题描述 投票:0回答:1

我在 example.h 文件中有一个这样的类型结构:

typedef union{
uint16_t valNum;
struct{
uint8_t valNumH;
uint8_t valNumL;
};
} valueExp;

我在 example.c 文件中使用这个结构:

uint16_t myFunction(uint16_t tempData){
uint8_t myData[8];
ValueExp mainValue;
mainValue.valNum=tempData;
myData[5]=mainValue.valNumH;

}

当我分析 IAR-CSTAT 分析此函数时,我收到此错误:

Union mainValue is written as valNum then read as another field - UNION-type punning

如何解决此消息?

c static-analysis iar
1个回答
2
投票

使用 C 中的静态代码分析器将呈现“安全”编码标准(C 语言子集),这有助于防止通常由特定编译器实现引起的未定义行为。另一方面,C 语言提供的可能性范围与需要它的嵌入式应用程序的安全级别之间存在权衡。

虽然违反了 MISRA C:2004(需要受版权保护的材料),但

UNION-type-punning
是 IAR C-STAT 默认交叉检查,也包含在其他标准中,例如公开可用的 CERT EXP39-C 解释:

如果用于读取联合对象内容的成员与最后用于在对象中存储值的成员不同,则该值的对象表示形式的适当部分将被重新解释为新类型中的对象表示形式,如 6.2.6 中所述(该过程有时称为“类型双关”)。这可能是一个陷阱表示。

所提供的代码片段生成的完整警告消息如下所示:

"main.c",18 Severity-Medium[UNION-type-punning]:Union 'mainValue' is written as 'valNum', then read as another field.
    "main.c",17: ! - Write to union field: mainValue.valNum = tempData
    "main.c",18: ! - Read from union field: mainValue.

针对

myFunction()
片段中的规则(需要 8 位访问权限)的一项补救措施可能是:

uint16_t myFunction(uint16_t tempData) {
  uint8_t myData[8];
  valueExp mainValue;
  mainValue.valNumH=((tempData & 0xFF00U) >> 8);
  mainValue.valNumL=(tempData & 0x00FFU);
  myData[5]=mainValue.valNumH;
/* .... */

一种解决方法是禁止对受影响的行进行此检查,其中

valNumH
myFunction()
:

中读取
uint16_t myFunction(uint16_t tempData) {
  uint8_t myData[8];
  valueExp mainValue;
  mainValue.valNum=tempData;
#pragma cstat_suppress="UNION-type-punning"
  myData[5]=mainValue.valNumH;
/* ... */
© www.soinside.com 2019 - 2024. All rights reserved.