Share via


逐步解說:分析 C/C++ 程式代碼是否有缺陷

本逐步解說示範如何分析 C/C++ 程式代碼是否有潛在的程式代碼缺失。 它會使用 C/C++ 程式代碼的程式碼分析工具。

在本逐步解說中,您將:

  • 在機器碼上執行程式代碼分析。
  • 分析程式代碼瑕疵警告。
  • 將警告視為錯誤。
  • 標註原始碼以改善程式碼瑕疵分析。

必要條件

  • CppDemo 範例複本。
  • 對 C/C++ 的基本瞭解。

在機器碼上執行程式代碼分析

在機器碼上執行程式代碼瑕疵分析

  1. 在 Visual Studio 中開啟 CppDemo 解決方案。

    CppDemo 解決方案現在會填入 方案總管

  2. 在 [建置] 功能表上,選擇 [重建解決方案]

    解決方案會建置,而不會發生任何錯誤或警告。

  3. 方案總管 中,選取 CodeDefects 專案。

  4. 在 [ 專案 ] 功能表上,選擇 [ 屬性]。

    [ CodeDefects 屬性頁 ] 對話框隨即顯示。

  5. 選取 [ 程序代碼分析 ] 屬性頁。

  6. 將 [ 建置 時啟用程序代碼分析] 屬性變更為 [是]。 選取 [確定] 儲存您的變更。

  7. 重建 CodeDefects 專案。

    程式代碼分析警告會顯示在 [ 錯誤清單 ] 視窗中。

  1. 在 Visual Studio 中開啟 CppDemo 解決方案。

    CppDemo 解決方案現在會填入 方案總管

  2. 在 [建置] 功能表上,選擇 [重建解決方案]

    解決方案會建置,而不會發生任何錯誤或警告。

    注意

    在 Visual Studio 2017 中,您可能會在 IntelliSense 引擎中看到虛假警告 E1097 unknown attribute "no_init_all" 。 您可以放心忽略這個警告。

  3. 方案總管 中,選取 CodeDefects 專案。

  4. 在 [ 專案 ] 功能表上,選擇 [ 屬性]。

    [ CodeDefects 屬性頁 ] 對話框隨即顯示。

  5. 選取 [ 程序代碼分析 ] 屬性頁。

  6. 選取 [ 在建置時啟用程式代碼分析] 複選框。 選取 [確定] 儲存您的變更。

  7. 重建 CodeDefects 專案。

    程式代碼分析警告會顯示在 [ 錯誤清單 ] 視窗中。

分析程式代碼瑕疵警告

  1. 在 [檢視] 功能表上,選擇 [錯誤清單]

    此功能表項可能無法顯示。 這取決於您在 Visual Studio 中選擇的開發人員配置檔。 您可能必須指向 [檢視] 功能表上的 [其他 Windows],然後選擇 [錯誤列表]。

  2. 在 [ 錯誤清單 ] 視窗中,按兩下列警告:

    C6230:語意上不同類型的隱含轉換:在布爾值內容中使用 HRESULT。

    程式代碼編輯器會顯示在函式 內造成警告的 bool ProcessDomain()行。 這個警告表示 HRESULT 在預期布林結果的 'if' 語句中使用 。 這通常是一個錯誤,因為當 S_OK HRESULT 從函式傳回時,它會指出成功,但當轉換成布爾值時,它會評估為 false

  3. 使用 SUCCEEDED 巨集更正此警告,當傳回值指出成功時HRESULT,會轉換成 true 。 您的程式代碼應該類似下列程式代碼:

    if (SUCCEEDED(ReadUserAccount()))
    
  4. 在 [ 錯誤清單] 中,按兩下列警告:

    C6282:不正確的運算符:布爾值內容中的常數指派。 請考慮改用 『==』。

  5. 藉由測試是否相等來更正此警告。 您的程式代碼看起來應該類似下列程式代碼:

    if ((len == ACCOUNT_DOMAIN_LEN) || (g_userAccount[len] != L'\\'))
    
  6. 將 和 j 初始化i為 0,以更正錯誤清單中的其餘 C6001 警告

  7. 重建 CodeDefects 專案。

    專案建置時沒有任何警告或錯誤。

更正原始程式碼批註警告

若要在 annotation.c 中啟用原始程式碼註釋警告

  1. 在 方案總管 中,選取 [批注] 專案。

  2. 在 [ 專案 ] 功能表上,選擇 [ 屬性]。

    [ 批注屬性頁 ] 對話框隨即顯示。

  3. 選取 [ 程序代碼分析 ] 屬性頁。

  4. 將 [ 建置 時啟用程序代碼分析] 屬性變更為 [是]。 選取 [確定] 儲存您的變更。

  1. 在 方案總管 中,選取 [批注] 專案。

  2. 在 [ 專案 ] 功能表上,選擇 [ 屬性]。

    [ 批注屬性頁 ] 對話框隨即顯示。

  3. 選取 [ 程序代碼分析 ] 屬性頁。

  4. 選取 [ 在建置時啟用程式代碼分析] 複選框。 選取 [確定] 儲存您的變更。

若要更正 annotation.c 中的原始程式碼批註警告

  1. 重建 Annotations 專案。

  2. 在 [建置] 功能表上,選擇 [對批注執行程序代碼分析]。

  3. 在 [ 錯誤清單] 中,按兩下列警告:

    C6011:取消參考 NULL 指標 'newNode'。

    此警告表示呼叫端無法檢查傳回值。 在此情況下,對 AllocateNode 的呼叫可能會傳回 NULL 值。 如需 的函式宣告 AllocateNode,請參閱 annotations.h 頭檔。

  4. 游標位於 annotations.cpp 檔案中發生警告的位置。

  5. 若要更正此警告,請使用 'if' 語句來測試傳回值。 您的程式代碼應該類似下列程式代碼:

    LinkedList* newNode = AllocateNode();
    if (nullptr != newNode)
    {
        newNode->data = value;
        newNode->next = 0;
        node->next = newNode;
    }
    
  6. 重建 Annotations 專案。

    專案建置時沒有任何警告或錯誤。

使用原始碼註釋來探索更多問題

使用原始程式碼批註

  1. 標註函式的 AddTail 正式參數和傳回值,以指出指標值可能是 Null:

    _Ret_maybenull_ LinkedList* AddTail(_Maybenull_ LinkedList* node, int value)
    
  2. 在 [建置] 功能表上,選擇 [針對方案執行程式碼分析]

  3. 在 [ 錯誤清單] 中,按兩下列警告:

    C6011:取值 NULL 指標 'node'。

    這個警告表示傳入函式的節點可能是 Null。

  4. 若要更正此警告,請使用函式開頭的 'if' 語句來測試傳入的值。 您的程式代碼應該類似下列程式代碼:

    if (nullptr == node)
    {
         return nullptr;
    }
    
  5. 在 [建置] 功能表上,選擇 [針對方案執行程式碼分析]

    項目現在會建置,而不會有任何警告或錯誤。

另請參閱

逐步解說:分析 Managed 程式碼中的程式碼缺失
C/C++ 的程式代碼分析