PORTING.BITFIELDS
结构中的位字段
PORTING 检查器会标识那些可能依赖于不同编译器中特定实施细则的代码。PORTING.BITFIELDS 检查器检测结构内位字段的使用情况。
漏洞与风险
在使用位字段定义数据结构的情况下,您在内存中对该结构进行布局时,将依照特定芯片上特定编译器的基础字节顺序表示法。将应用程序移动到不同编译器(例如用于数据传输或永久存储)很容易改变该布局,从而导致在将数据结构投影到字节缓冲区时出现问题。
缓解与预防
为了避免这些移植问题,请定义一些明确针对特定字节顺序体系结构而布局的结构变体,并使用适当的 BIG_ENDIAN 或 LITTLE_ENDIAN 宏来保护每个变体。
漏洞代码示例
复制
struct
{
unsigned short f1 : 4;
unsigned short f2 : 5;
unsigned short f3 : 7;
} myPackedLayout;
本示例中的问题是,当字节顺序体系结构出现移动时,结构的运行时布局会发生变化,根据芯片和工具链,f3 可能会在 f1 之前或之后发生。
修正代码示例
复制
#if BIG_ENDIAN
struct
{
unsigned short f1 : 4;
unsigned short f2 : 5;
unsigned short f3 : 7;
} myPackedLayout;
#endif
在经修复的示例中,我们了解到在使用相同体系结构的芯片上,布局将始终以相同方式工作,并且我们还可以针对未共享该体系结构的芯片定义备选的封装布局。在这种情况下,布局由编程人员定义,而不依靠工具链的芯片组。