CERT.FILE_PTR.DEREF.INDIRECT

系统函数不应间接取消引用指向 FILE 对象的指针,例如通过对 memcpy 或 memcmp 的调用。

漏洞与风险

系统函数间接取消引用指向 FILE 对象的指针,例如通过对 memcpy 或 memcmp 的调用,可能会导致意外的行为。

缓解与预防

不要使用系统函数来间接取消引用指向 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

外部指导