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

标签 c gcc enums arm sizeof

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

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

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

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

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

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

最佳答案

Is it possible that such mismatch wreaks havoc with memory allocation?

哦,是的。

How do I force the enum to be 4 bytes large on ARM too?

C 标准规定枚举变量可以具有几乎任何整数类型,大小和符号是实现定义的。由于这个原因,使用枚举通常会有问题,特别是在嵌入式系统中。这是 C 语言的一个已知缺陷。

您可以强制枚举为特定编译器的特定大小,但这只是一个快速且肮脏的修复。

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

关于平台之间的 C 枚举大小不匹配有潜在危险,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39167542/

相关文章:

c++ - gcc 4.9.2 -Wmissing-field-initializers 中的错误?

python - 元组实例在枚举类中没有成员(pylint no-member)

c - 在 Windows Phone 8 上的 taskhost 下运行的进程

c - 在C中创建和理解结构的链接列表

C 解析/proc/stat 以计算每个核心的当前 CPU 使用率

c - 避免预处理#includes

c++ - 编译文件时无法在ubuntu上找到一些boost库

java - 在 Java 中嵌套枚举

java - FreeMarker 模板中的枚举错误

c - 卡西欧 FX-9860GII C SDK 加载项中的系统错误