警告 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 ...
}
不小心使用 malloc
和 free
會導致記憶體流失和例外狀況。 若要將這類洩漏和例外狀況問題完全降到最低,請避免自行配置原始記憶體。 請改用 C++ 標準程式庫 (STL) 所提供的機制。 這些包括 shared_ptr
、 unique_ptr
和 vector
。 如需詳細資訊,請參閱 智慧型指標 和 C++ 標準程式庫 。
啟發學習法
用來減少舊版程式碼中警告數目的啟發學習法會假設指標不是 , NULL
除非有證據表明它是 NULL
。 在到目前為止我們所看到的範例中,或 傳回 malloc
的 new
指標可能是 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 區塊內的行來修正警告。