小编she*_*les的帖子

如何在嵌入式系统中安全地执行类型惩罚

我们的团队目前正在使用从旧架构到基于ARM Cortex M3平台的新产品的一些移植代码,使用定制版本的GCC 4.5.1.我们正在从通信链接读取数据,并尝试将原始字节数组转换为结构以干净地解析数据.在将指针强制转换为结构并解除引用后,我们收到一条警告:"取消引用类型惩罚指针将破坏严格别名规则".

经过一些研究,我意识到由于char数组没有对齐规则,并且结构必须是字对齐的,因此转换指针会导致未定义的行为(一件坏事).我想知道是否有更好的方法来做我们正在尝试的事情.

我知道我们可以使用GCC的" 属性((aligned(4)))" 明确地对齐char数组.我相信这将使我们的代码"更安全",但警告仍然会使我们的构建变得混乱,并且我不想在出现这种情况时禁用警告.我们想要的是一种安全地做我们正在尝试的方法,如果我们稍后尝试在另一个地方做一些不安全的事情,它仍会告诉我们.由于这是一个嵌入式系统,RAM的使用和闪存使用在某种程度上很重要.

可移植性(编译器和体系结构)不是一个大问题,这仅适用于一种产品.但是,如果存在便携式解决方案,则优选.

这是我们目前正在做的一个(非常简化的)示例:

#define MESSAGE_TYPE_A 0
#define MESSAGE_TYPE_B 1

typedef struct MessageA __attribute__((__packed__))
{
    unsigned char  messageType;
    unsigned short data1;
    unsigned int   data2;
}

typedef struct MessageB __attribute__((__packed__))
{
    unsigned char  messageType;
    unsigned char  data3;
    unsigned char  data4;
}


// This gets filled by the comm system, assume from a UART interrupt or similar
unsigned char data[100];


// Assume this gets called once we receive a full message
void ProcessMessage()
{
    MessageA* …
Run Code Online (Sandbox Code Playgroud)

c embedded gcc strict-aliasing type-punning

6
推荐指数
2
解决办法
2406
查看次数

标签 统计

c ×1

embedded ×1

gcc ×1

strict-aliasing ×1

type-punning ×1