共用方式為


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

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

在這個逐步解說中,您會逐步執行程式碼分析程序,以分析您的 C/C++ 程式碼是否有潛在的程式碼缺失。

您將完成下列步驟:

  • 在機器碼上執行程式碼分析。

  • 分析程式碼缺失警告。

  • 視警告為錯誤。

  • 為原始程式碼加註,以改善程式碼缺失分析。

必要條件

  • Visual Studio Premium 或 Visual Studio Ultimate。

  • 示範範例的複本。

  • 對 C/C++ 的基本了解。

若要在機器碼上執行程式碼缺失分析

  1. 開啟 Visual Studio 中的 Demo 方案。

    Demo 方案隨即填入 [方案總管] 中。

  2. 在 [建置] 功能表上,按一下 [重建方案]。

    隨即會建置方案,而不會出現任何錯誤或警告。

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

  4. 在 [專案] 功能表上,按一下 [屬性]。

    [CodeDefects 屬性頁] 對話方塊隨即出現。

  5. 按一下 [程式碼分析]。

  6. 按一下 [建置時啟用 C/C++ 的程式碼分析] 核取方塊。

  7. 重建 CodeDefects 專案。

    程式碼分析警告隨即顯示在 [錯誤清單] 中。

若要分析程式碼缺失警告

  1. 在 [檢視] 功能表上,按一下 [錯誤清單]。

    根據 Visual Studio 中所選擇的程式開發人員設定檔,您可能必須指向 [檢視] 功能表上的 [其他視窗],然後按一下 [錯誤清單]。

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

    警告 C6230: 語意不相同的整數型別之間發生隱含轉型: 在布林內容中使用 HRESULT。

    程式碼編輯器會顯示在函式 boolProcessDomain() 中引發警告的程式碼行。這個警告表示必須是布林結果的 'if' 陳述式將要使用 HRESULT。

  3. 使用 SUCCEEDED 巨集修正這個警告。您的程式碼應該與下列程式碼相似:

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

    警告 C6282: 不正確的運算子: 在文字內容中指派常數。Was == intended?

  5. 測試等式以改正這個警告。您的程式碼看起來應該像下列程式碼:

    if ((len == ACCOUNT_DOMAIN_LEN) || (g_userAccount[len] != '\\'))
    

若要視警告為錯誤

  1. 在 Bug.cpp 檔中,將下列 #pragma 陳述式加入至檔案的開頭,以便將警告 C6001 視為錯誤:

    #pragma warning (error: 6001)
    
  2. 重建 CodeDefects 專案。

    在 [錯誤清單] 中,C6001 即顯示為錯誤。

  3. 將 i 和 j 初始化為 0,以修正 [錯誤清單] 中其餘兩個 C6001 錯誤。

  4. 重建 CodeDefects 專案。

    專案便開始建置,並且不會有任何警告或錯誤。

若要在 annotation.c 中修正原始程式碼附註警告

  1. 在 [方案總管] 中,選取附註專案。

  2. 在 [專案] 功能表上,按一下 [屬性]。

    [附註屬性頁] 對話方塊隨即出現。

  3. 按一下 [程式碼分析]。

  4. 選取 [建置時啟用 C/C++ 的程式碼分析] 核取方塊。

  5. 重建附註專案。

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

    警告 C6011: 取值 NULL 指標 'newNode'。

    這個警告表示呼叫端引發失敗,以檢查傳回值。在這個情況中,呼叫 AllocateNode 可能會傳回 NULL 值 (如需 AllocateNode 函式宣告,請參閱 annotations.h 標頭檔)。

  7. 開啟 annotations.cpp 檔。

  8. 若要修正這個警告,請使用 'if' 陳述式測試傳回值。您的程式碼應該與下列程式碼相似:

    if (NULL != newNode)

    {

    newNode->data = value;

    newNode->next = 0;

    node->next = newNode;

    }

  9. 重建附註專案。

    專案便開始建置,並且不會有任何警告或錯誤。

若要使用原始程式碼附註

  1. 藉由使用 Pre 和 Post 條件,為型式參數和函式 AddTail 的傳回值加註,如下列範例所示:

    [returnvalue:SA_Post (Null=SA_Maybe)] LinkedList* AddTail

    (

        [SA_Pre(Null=SA_Maybe)] LinkedList* node,

        int value

     )

  2. 重建附註專案。

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

    警告 C6011: 取值 NULL 指標 'node'。

    這則警告指出傳入函式中的節點可能為 null,並顯示引發警告所在之處的行號。

  4. 若要修正這個警告,請使用 'if' 陳述式測試傳回值。您的程式碼應該與下列程式碼相似:

      . . .
      LinkedList *newNode = NULL; 
      if (NULL == node)
      {
           return NULL;
          . . .
      }
    
  5. 重建附註專案。

    專案便開始建置,並且不會有任何警告或錯誤。

請參閱

工作

逐步解說:分析 Managed 程式碼中的程式碼缺失