逐步解說:分析 C/C++ 程式碼的缺失
這個逐步解說示範如何使用 C/C++ 程式碼的程式碼分析工具,分析 C/C++ 程式碼是否有潛在的程式碼缺失。
在這個逐步解說中,您會逐步執行程式碼分析程序,以分析您的 C/C++ 程式碼是否有潛在的程式碼缺失。
您將完成下列步驟:
在機器碼上執行程式碼分析。
分析程式碼缺失警告。
視警告為錯誤。
為原始程式碼加註,以改善程式碼缺失分析。
必要條件
Visual Studio Premium 或 Visual Studio Ultimate。
示範範例的複本。
對 C/C++ 的基本了解。
若要在機器碼上執行程式碼缺失分析
開啟 Visual Studio 中的 Demo 方案。
Demo 方案隨即填入 [方案總管] 中。
在 [建置] 功能表上,按一下 [重建方案]。
隨即會建置方案,而不會出現任何錯誤或警告。
在 [方案總管] 中,選取 CodeDefects 專案。
在 [專案] 功能表上,按一下 [屬性]。
[CodeDefects 屬性頁] 對話方塊隨即出現。
按一下 [程式碼分析]。
按一下 [建置時啟用 C/C++ 的程式碼分析] 核取方塊。
重建 CodeDefects 專案。
程式碼分析警告隨即顯示在 [錯誤清單] 中。
若要分析程式碼缺失警告
在 [檢視] 功能表上,按一下 [錯誤清單]。
根據 Visual Studio 中所選擇的程式開發人員設定檔,您可能必須指向 [檢視] 功能表上的 [其他視窗],然後按一下 [錯誤清單]。
請在 [錯誤清單] 中,按兩下下列警告:
警告 C6230: 語意不相同的整數型別之間發生隱含轉型: 在布林內容中使用 HRESULT。
程式碼編輯器會顯示在函式 bool ProcessDomain() 中引發警告的程式碼行。 這個警告表示必須是布林結果的 'if' 陳述式將要使用 HRESULT。
使用 SUCCEEDED 巨集修正這個警告。 您的程式碼應該與下列程式碼相似:
if (SUCCEEDED (ReadUserAccount()) )
請在 [錯誤清單] 中,按兩下下列警告:
警告 C6282: 不正確的運算子: 在文字內容中指派常數。 Was == intended?
測試等式以改正這個警告。 您的程式碼看起來應該像下列程式碼:
if ((len == ACCOUNT_DOMAIN_LEN) || (g_userAccount[len] != '\\'))
若要視警告為錯誤
在 Bug.cpp 檔中,將下列 #pragma 陳述式加入至檔案的開頭,以便將警告 C6001 視為錯誤:
#pragma warning (error: 6001)
重建 CodeDefects 專案。
在 [錯誤清單] 中,C6001 即顯示為錯誤。
將 i 和 j 初始化為 0,以修正 [錯誤清單] 中其餘兩個 C6001 錯誤。
重建 CodeDefects 專案。
專案便開始建置,並且不會有任何警告或錯誤。
若要在 annotation.c 中修正原始程式碼附註警告
在 [方案總管] 中,選取附註專案。
在 [專案] 功能表上,按一下 [屬性]。
[附註屬性頁] 對話方塊隨即出現。
按一下 [程式碼分析]。
選取 [建置時啟用 C/C++ 的程式碼分析] 核取方塊。
重建附註專案。
請在 [錯誤清單] 中,按兩下下列警告:
警告 C6011: 取值 NULL 指標 'newNode'。
這個警告表示呼叫端引發失敗,以檢查傳回值。 在這個情況中,呼叫 AllocateNode 可能會傳回 NULL 值 (如需 AllocateNode 函式宣告,請參閱 annotations.h 標頭檔)。
開啟 annotations.cpp 檔。
若要修正這個警告,請使用 'if' 陳述式測試傳回值。 您的程式碼應該與下列程式碼相似:
if (NULL != newNode)
{
newNode->data = value;
newNode->next = 0;
node->next = newNode;
}
重建附註專案。
專案便開始建置,並且不會有任何警告或錯誤。
若要使用原始程式碼附註
藉由使用 Pre 和 Post 條件,為型式參數和函式 AddTail 的傳回值加註,如下列範例所示:
[returnvalue:SA_Post (Null=SA_Maybe)] LinkedList* AddTail
(
[SA_Pre(Null=SA_Maybe)] LinkedList* node,
int value
)
重建附註專案。
請在 [錯誤清單] 中,按兩下下列警告:
警告 C6011: 取值 NULL 指標 'node'。
這則警告指出傳入函式中的節點可能為 null,並顯示引發警告所在之處的行號。
若要修正這個警告,請使用 'if' 陳述式測試傳回值。 您的程式碼應該與下列程式碼相似:
. . . LinkedList *newNode = NULL; if (NULL == node) { return NULL; . . . }
重建附註專案。
專案便開始建置,並且不會有任何警告或錯誤。