警告 C6011
NULL ポインター 'pointer-name' を逆参照します。
解説
この警告は、コードが Null ポインターを逆参照している可能性があることを示します。 ポインターの値が無効な場合、結果は未定義になります。 この問題を解決するには、ポインターを使用前に検証します。
コード分析名: DEREF_NULL_PTR
例
次に示すコードでは、十分なメモリ容量を使用できない場合に malloc
を呼び出すと null が返される可能性があるため、この警告が生成されます。
#include <malloc.h>
void f( )
{
char *p = ( char * ) malloc( 10 );
*p = '\0';
// code ...
free( p );
}
この警告を修正するには、次のコードに示すように null 値に対するポインターをチェックします。
#include <malloc.h>
void f( )
{
char *p = ( char * )malloc ( 10 );
if ( p )
{
*p = '\0';
// code ...
free( p );
}
}
関数では、Pre
条件に Null
プロパティを使用してパラメーターに注釈を付けることができます。 パラメーターを逆参照する前に、これらの関数内部にメモリを割り当てます。 次に示すコードでは、最初にメモリを割り当てる前に、関数内部での null ポインター (pc
) を逆参照しようとするため、警告 C6011 が生成されます。
#include <sal.h>
using namespace vc_attributes;
void f([Pre(Null=Yes)] char* pc)
{
*pc='\0'; // warning C6011 - pc is null
// code ...
}
malloc
と free
の不注意な使用により、メモリ リークと例外が発生します。 これらの種類のリークと例外の問題を最小限に抑えるには、生メモリを自分で割り当てないようにします。 代わりに、C++ 標準ライブラリ (STL) が提供するメカニズムを使用してください。 これらには、 shared_ptr
、 unique_ptr
、および vector
が含まれます。 詳細については、「スマート ポインター」および「C++ 標準ライブラリ」を参照してください。
ヒューリスティック
レガシ コードの警告の数を減らすために使用されるヒューリスティックでは、ポインターが存在するNULL
証拠がない限り、ポインターが非NULL
であると想定されます。 ここまでに示した例では、ポインターは割り当てが失敗する可能性があるため、または返されるmalloc
new
可能性がありますNULL
。 分析エンジンが null 許容の証拠として使用するもう 1 つの特性は、プログラムが明示的にチェックかどうかNULL
です。 これは、次の例に示されています。
void f(int* n)
{
*n = 1; // Does not warn, n is assumed to be non-null
}
void f(int* n)
{
if (n) {
(*n)++;
}
*n = 1; // Warns because the earlier conditional shows that n might be null
}
2 番目のケースでは、ユーザーは if ブロック内の行を *n = 1
移動することで警告を修正できます。
関連項目
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示