共用方式為


警告 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 參數。 在取值 參數之前,請先配置這些函式內的記憶體。 下列程式碼會產生警告 C6011,因為嘗試在函式內取值 null 指標 ( pc ) 而不需先配置記憶體:

#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_ptrvector 。 如需詳細資訊,請參閱 智慧型指標 C++ 標準程式庫

啟發學習法

用來減少舊版程式碼中警告數目的啟發學習法會假設指標不是 , NULL 除非有證據表明它是 NULL 。 在到目前為止我們所看到的範例中,或 傳回 mallocnew 指標可能是 NULL 因為配置可能會失敗。 分析引擎作為可為 Null 性辨識項的另一個特性是,如果程式明確檢查 是否為 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
}

在第二個案例中,使用者可以移動 *n = 1 if 區塊內的行來修正警告。

另請參閱