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