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