CXX.CAST.OBJ_PTR_TO_OBJ_PTR

指向对象类型的指针与指向不同对象类型的指针之间的转换。

CXX.CAST.OBJ_PTR_TO_OBJ_PTR 检查器会标记其中代码将指向对象的指针转换为指向不同对象的指针的实例。

漏洞与风险

将指向对象的指针转换为指向不同对象的指针,可能会导致未正确对齐的指针,从而导致未定义的行为。

缓解与预防

避免在指向对象类型的指针与指向不同对象类型的指针之间进行转换。

漏洞代码示例

复制
  #include <stdio.h>
 
  void f(void)
  {
      if (sizeof(int) == sizeof(float)) {
          float f = 0.0f;
          int *ip = (int *)&f;
          (*ip)++;
          printf("float is %f\n", f);
         int i = 0;
         ip = (int *)&i;

     }
 }
 int main(int argc, char *argv[])
 {
     f();
     return 0;
 }

在此示例中,Klocwork 在第 7 行报告 CXX.CAST.OBJ_PTR_TO_OBJ_PTR 缺陷,因为通过不兼容类型的指针来访问对象可能会导致未定义的行为。

修正代码示例

复制
  #include <stdio.h>
 
  void f(void)
  {
      if (sizeof(int) == sizeof(float)) {
          float f = 0.0f;
          float *ip = &f;
          (*ip)++;
          printf("float is %f\n", f);
         int i = 0;

     }
 }
 int main(int argc, char *argv[])
 {
     f();
     return 0;
 }

在此修正代码示例中,不同对象类型的指针之间没有任何转换。

相关检查器

  • MISRA.CAST.OBJ_PTR_TO_PTR.2012