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