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

在经修复的示例中,我们了解到在使用相同体系结构的芯片上,布局将始终以相同方式工作,并且我们还可以针对未共享该体系结构的芯片定义备选的封装布局。在这种情况下,布局由编程人员定义,而不依靠工具链的芯片组。

相关检查器