平台之间的枚举大小不匹配有潜在危险

mfl*_*ris 2 c enums gcc arm sizeof

我正在从Linux x86机器上的工作编译开始将net-snmp移植到ARM平台(ThreadX OS,而不是linux)

现在程序在init_snmp()函数内崩溃,因为在某些时候内存会发生可怕的事情.

然后我面对sizeof()所有数据类型,发现enum在Linux x86上是4个字节,在ARM上是1个字节.

是否有可能这种不匹配会对内存分配造成严重破坏?尝试将字符串写入内存时程序崩溃.

如何在ARM上强制枚举为4字节大?

我正在用gcc arm-none-eabi编译

Lun*_*din 7

是否有可能这种不匹配会对内存分配造成严重破坏?

哦,是的.

如何在ARM上强制枚举为4字节大?

C标准表示枚举变量可能具有任何几乎任何整数类型,大小和签名是实现定义的.因此,枚举通常是有问题的,特别是在嵌入式系统中.这是C语言的一个已知缺陷.

您可以强制enum具有特定编译器的特定大小,但这只是一个快速而肮脏的修复.

专业的长期解决方案是重写所有代码,以便在任何地方都不依赖于枚举的大小或签名.