警告 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 ...
}

mallocfree の不注意な使用により、メモリ リークと例外が発生します。 これらの種類のリークと例外の問題を最小限に抑えるには、生メモリを自分で割り当てないようにします。 代わりに、C++ 標準ライブラリ (STL) が提供するメカニズムを使用してください。 これらには、 shared_ptrunique_ptr 、および vector が含まれます。 詳細については、「スマート ポインター」および「C++ 標準ライブラリ」を参照してください。

ヒューリスティック

レガシ コードの警告の数を減らすために使用されるヒューリスティックでは、ポインターが存在するNULL証拠がない限り、ポインターが非NULLであると想定されます。 ここまでに示した例では、ポインターは割り当てが失敗する可能性があるため、または返されるmallocnew可能性があります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 移動することで警告を修正できます。

関連項目