CERT.FILE_PTR.DEREF.INDIRECT

FILE オブジェクトへのポインターは、システム関数によって、たとえば memcpy または memcmp の呼び出しによって、間接的に逆参照されてはなりません。

脆弱性とリスク

システム関数によって、たとえば memcpy または memcmp の呼び出しによって、FILE オブジェクトへのポインターを間接的に逆参照すると、予期しない動作が発生する可能性があります。

軽減と防止

システム関数を使用することで FILE オブジェクトへのポインターを間接的に逆参照しないようにします。

脆弱コード例

コピー
   #include <cstring>
   #include <wchar.h>
   #include <iostream>
  
   typedef FILE file4;
   typedef file4 file3;
   typedef file3 file2;
   typedef file2 file;
   file *pf1;
 
  #define FILE_ALIAS FILE
  FILE_ALIAS *pf2;
 
  typedef FILE *file_pointer;
  file_pointer pf3;
 
  typedef int *int_alias2;
  typedef int_alias2 int_alias1;
  typedef int_alias1 int_alias;
  int_alias pf4;
  
  void func5_memcpy_function ( void )
  {
      memset((void *)pf1, '-', 0);      
      memset((void *)pf2, '-', 0);      
      wmemset((void *)pf3, '-', 0);     
      memset((void *)pf4, '-', 0);      
     
      memset((void*)pf1, '-', 9);      
      memset((void *)pf2, '-', 9);      
      memset((void *)pf4, '-', 9);      
  }

この非準拠の例では、Klocwork は 30 行目と 31 行目で CERT.FILE_PTR.DEREF.INDIRECT を報告します。これは、システム関数 'memcpy' を使用することで FILE オブジェクトへのポインターを間接的に逆参照しており、予期しない動作が発生する可能性があるためです。

修正コード例

コピー
   #include <cstring>
   #include <wchar.h>
   #include <iostream>
  
   typedef FILE file4;
   typedef file4 file3;
   typedef file3 file2;
   typedef file2 file;
   file pf1;
 
  #define FILE_ALIAS FILE
  FILE_ALIAS pf2;
 
  typedef FILE file_pointer;
  file_pointer pf3;
 
  typedef int *int_alias2;
  typedef int_alias2 int_alias1;
  typedef int_alias1 int_alias;
  int_alias pf4;
 
  void func5_memcpy_function ( void )
  {
      memset((void *)pf1, '-', 0);      
      memset((void *)pf2, '-', 0);      
      wmemset((void *)pf3, '-', 0);     
      memset((void *)pf4, '-', 0);      
      memset((void *)pf4, '-', 9);     
  }

上記の例は、FILE オブジェクトへのポインターを逆参照するためにどのシステム関数も使用されていないため、準拠の例となっています。

関連チェッカー

  • MISRA.FILE_PTR.DEREF.INDIRECT.2012

外部参考資料