逐步解說:分析 C/C++ 程式代碼是否有缺陷
本逐步解說示範如何分析 C/C++ 程式代碼是否有潛在的程式代碼缺失。 它會使用 C/C++ 程式代碼的程式碼分析工具。
在本逐步解說中,您將:
- 在機器碼上執行程式代碼分析。
- 分析程式代碼瑕疵警告。
- 將警告視為錯誤。
- 標註原始碼以改善程式碼瑕疵分析。
必要條件
- CppDemo 範例的複本。
- 對 C/C++ 的基本瞭解。
在機器碼上執行程式代碼分析
在機器碼上執行程式代碼瑕疵分析
在 Visual Studio 中開啟 CppDemo 解決方案。
CppDemo 解決方案現在會填入 方案總管。
在 [建置] 功能表上,選擇 [重建解決方案]。
解決方案會建置,而不會發生任何錯誤或警告。
在 方案總管 中,選取 CodeDefects 專案。
在 [ 專案 ] 功能表上,選擇 [ 屬性]。
[ CodeDefects 屬性頁 ] 對話框隨即顯示。
選取 [ 程序代碼分析 ] 屬性頁。
將 [ 建置 時啟用程序代碼分析] 屬性變更為 [是]。 選取 [確定] 儲存您的變更。
重建 CodeDefects 專案。
程式代碼分析警告會顯示在 [ 錯誤清單 ] 視窗中。
在 Visual Studio 中開啟 CppDemo 解決方案。
CppDemo 解決方案現在會填入 方案總管。
在 [建置] 功能表上,選擇 [重建解決方案]。
解決方案會建置,而不會發生任何錯誤或警告。
注意
在 Visual Studio 2017 中,您可能會在 IntelliSense 引擎中看到虛假警告
E1097 unknown attribute "no_init_all"
。 您可以放心忽略這個警告。在 方案總管 中,選取 CodeDefects 專案。
在 [ 專案 ] 功能表上,選擇 [ 屬性]。
[ CodeDefects 屬性頁 ] 對話框隨即顯示。
選取 [ 程序代碼分析 ] 屬性頁。
選取 [ 在建置時啟用程式代碼分析] 複選框。 選取 [確定] 儲存您的變更。
重建 CodeDefects 專案。
程式代碼分析警告會顯示在 [ 錯誤清單 ] 視窗中。
分析程式代碼瑕疵警告
在 [檢視] 功能表上,選擇 [錯誤清單]。
此功能表項可能無法顯示。 這取決於您在 Visual Studio 中選擇的開發人員配置檔。 您可能必須指向 [檢視] 功能表上的 [其他 Windows],然後選擇 [錯誤列表]。
在 [ 錯誤清單 ] 視窗中,按兩下列警告:
C6230:語意上不同類型的隱含轉換:在布爾值內容中使用 HRESULT。
程式代碼編輯器會顯示在函式 內造成警告的
bool ProcessDomain()
行。 這個警告表示HRESULT
在預期布林結果的 'if' 語句中使用 。 這通常是一個錯誤,因為當S_OK
HRESULT 從函式傳回時,它會指出成功,但當轉換成布爾值時,它會評估為false
。使用
SUCCEEDED
巨集更正此警告,當傳回值指出成功時HRESULT
,會轉換成true
。 您的程式代碼應該類似下列程式代碼:if (SUCCEEDED(ReadUserAccount()))
在 [ 錯誤清單] 中,按兩下列警告:
C6282:不正確的運算符:布爾值內容中的常數指派。 請考慮改用 『==』。
藉由測試是否相等來更正此警告。 您的程式代碼看起來應該類似下列程式代碼:
if ((len == ACCOUNT_DOMAIN_LEN) || (g_userAccount[len] != L'\\'))
將 和
j
初始化i
為 0,以更正錯誤清單中的其餘 C6001 警告。重建 CodeDefects 專案。
專案建置時沒有任何警告或錯誤。
更正原始程式碼批註警告
若要在 annotation.c 中啟用原始程式碼註釋警告
在 方案總管 中,選取 [批注] 專案。
在 [ 專案 ] 功能表上,選擇 [ 屬性]。
[ 批注屬性頁 ] 對話框隨即顯示。
選取 [ 程序代碼分析 ] 屬性頁。
將 [ 建置 時啟用程序代碼分析] 屬性變更為 [是]。 選取 [確定] 儲存您的變更。
在 方案總管 中,選取 [批注] 專案。
在 [ 專案 ] 功能表上,選擇 [ 屬性]。
[ 批注屬性頁 ] 對話框隨即顯示。
選取 [ 程序代碼分析 ] 屬性頁。
選取 [ 在建置時啟用程式代碼分析] 複選框。 選取 [確定] 儲存您的變更。
若要更正 annotation.c 中的原始程式碼批註警告
重建 Annotations 專案。
在 [建置] 功能表上,選擇 [對批注執行程序代碼分析]。
在 [ 錯誤清單] 中,按兩下列警告:
C6011:取消參考 NULL 指標 'newNode'。
此警告表示呼叫端無法檢查傳回值。 在此情況下,對
AllocateNode
的呼叫可能會傳回 NULL 值。 如需 的函式宣告AllocateNode
,請參閱 annotations.h 頭檔。游標位於 annotations.cpp 檔案中發生警告的位置。
若要更正此警告,請使用 'if' 語句來測試傳回值。 您的程式代碼應該類似下列程式代碼:
LinkedList* newNode = AllocateNode(); if (nullptr != newNode) { newNode->data = value; newNode->next = 0; node->next = newNode; }
重建 Annotations 專案。
專案建置時沒有任何警告或錯誤。
使用原始碼註釋來探索更多問題
使用原始程式碼批註
標註函式的
AddTail
正式參數和傳回值,以指出指標值可能是 Null:_Ret_maybenull_ LinkedList* AddTail(_Maybenull_ LinkedList* node, int value)
在 [建置] 功能表上,選擇 [針對方案執行程式碼分析]。
在 [ 錯誤清單] 中,按兩下列警告:
C6011:取值 NULL 指標 'node'。
這個警告表示傳入函式的節點可能是 Null。
若要更正此警告,請使用函式開頭的 'if' 語句來測試傳入的值。 您的程式代碼應該類似下列程式代碼:
if (nullptr == node) { return nullptr; }
在 [建置] 功能表上,選擇 [針對方案執行程式碼分析]。
項目現在會建置,而不會有任何警告或錯誤。