コード分析のためのサンプル C++ プロジェクト

次の手順では、「チュートリアル: C/C ++ コードを分析して欠陥を分析する」のサンプルを作成する方法について説明します。 この手順で次が作成されます。

  • CppDemo という名前の Visual Studio ソリューション。

  • CodeDefects という名前のスタティック ライブラリ プロジェクト。

  • Annotations という名前のスタティック ライブラリ プロジェクト。

この手順では、スタティック ライブラリのヘッダー ファイルと .cpp ファイルのコードも作成されます。

CppDemo ソリューションと CodeDefects プロジェクトを作成する

  1. Visual Studio を開始し、[Create a new project (新しいプロジェクトの作成)] を選択します

  2. [Create a new project (新しいプロジェクトの作成)] ダイアログで、言語フィルターを C++ に変更します。

  3. Windows デスクトップ ウィザードを選択し、[Next (次へ)] をクリックします。

  4. [Configure your new project (新しいプロジェクトの構成)] ページで、[Project name (プロジェクト名)] ボックスに CodeDefects を入力します。

  5. [ソリューション名] テキスト ボックスに「CppDemo」と入力します。

  6. [作成] を選択します。

  7. [Windows Desktop Project (Windows デスクトップ プロジェクト)] ダイアログの [Application type (アプリケーションの種類)] の下で、[スタティック ライブラリ (.lib)] を選択します。

  8. [追加のオプション][空のプロジェクト]を選択します。

  9. [OK] を選択して、ソリューションとプロジェクトを作成します。

  1. Visual Studio を開きます。 メニュー バーで、 [ファイル]>[新規作成]>[プロジェクト] を選択します。

  2. [New Project (新しいプロジェクト)] ダイアログ ボックスで、[Visual C++]>[Windows Desktop (Windows デスクトップ)] の順に選択します。

  3. Windows デスクトップ ウィザードを選択します。

  4. [名前] テキスト ボックスに「CodeDefects」と入力します。

  5. [ソリューション名] テキスト ボックスに「CppDemo」と入力します。

  6. OK を選択します。

  7. [Windows Desktop Project (Windows デスクトップ プロジェクト)] ダイアログの [Application type (アプリケーションの種類)] の下で、[スタティック ライブラリ (.lib)] を選択します。

  8. [追加のオプション][空のプロジェクト]を選択します。

  9. [OK] を選択して、ソリューションとプロジェクトを作成します。

  1. Visual Studio を開きます。 メニュー バーで、 [ファイル]>[新規作成]>[プロジェクト] を選択します。

  2. [New Project (新しいプロジェクト)] ダイアログ ボックスで、[Templates (テンプレート)]>[Visual C++]>[Win32] の順に選択します。

  3. [Win32 Console Application (Win32 コンソール アプリケーション)] を選択します。

  4. [名前] テキスト ボックスに「CodeDefects」と入力します。

  5. [ソリューション名] テキスト ボックスに「CppDemo」と入力します。

  6. OK を選択します。

  7. [Win32 Application Wizard (Win32 アプリケーション ウィザード)] ダイアログで、[Next (次へ)] を選択します。

  8. アプリケーションの種類スタティック ライブラリに変更します。

  9. [Additional options (追加オプション)] で、[Precompiled header (プリコンパイル済みヘッダー)] チェック ボックスをオフにします。

  10. [Finish (完了)] を選択して、ソリューションとプロジェクトを作成します。

CodeDefects プロジェクトにヘッダーとソース ファイルを追加する

  1. ソリューション エクスプローラーで、CodeDefects を展開します。

  2. 右クリックして、ヘッダー ファイルのコンテキスト メニューを開きます。 [追加]>[新しい項目] の順に選択します。

  3. [Add New Item (新しい項目の追加)] ダイアログ ボックスで、[Visual C++] > [Code (コード)][ヘッダー ファイル (.h)] の順に選択します。

  4. [Name (名前)] 編集ボックスに Bug.h と入力し、[Add (追加)] を選択します。

  5. Bug.h の編集ウィンドウで、内容を選択し、削除します。

  6. 次のコードをコピーし、エディターで Bug.h ファイルに貼り付けます。

    #pragma once
    
    #include <windows.h>
    
    // Function prototypes
    bool CheckDomain(wchar_t const *);
    HRESULT ReadUserAccount();
    
    // These constants define the common sizes of the
    // user account information throughout the program
    const int USER_ACCOUNT_LEN = 256;
    const int ACCOUNT_DOMAIN_LEN = 128;
    
  7. ソリューション エクスプローラーで右クリックして、[Source Files (ソース ファイル)] のコンテキスト メニューを開きます。 [追加]>[新しい項目] の順に選択します。

  8. [新しい項目の追加] ダイアログ ボックスで、 [C++ ファイル (.cpp)]をクリックします。

  9. [Name (名前)] 編集ボックスに Bug.cpp と入力し、[Add (追加)] を選択します。

  10. 次のコードをコピーし、エディターで Bug.cpp ファイルに貼り付けます。

    #include "Bug.h"
    
    // the user account
    wchar_t g_userAccount[USER_ACCOUNT_LEN] = { L"domain\\user" };
    int len = 0;
    
    bool CheckDomain(wchar_t const* domain)
    {
        return (wcsnlen_s(domain, USER_ACCOUNT_LEN) > 0);
    }
    
    HRESULT ReadUserAccount()
    {
        return S_OK;
    }
    
    bool ProcessDomain()
    {
        wchar_t* domain = new wchar_t[ACCOUNT_DOMAIN_LEN];
        // ReadUserAccount gets a 'domain\user' input from
        //the user into the global 'g_userAccount'
        if (ReadUserAccount())
        {
            // Copies part of the string prior to the '\'
            // character onto the 'domain' buffer
            for (len = 0; (len < ACCOUNT_DOMAIN_LEN) && (g_userAccount[len] != L'\0'); len++)
            {
                if (g_userAccount[len] == L'\\')
                {
                    // Stops copying on the domain and user separator ('\')
                    break;
                }
                domain[len] = g_userAccount[len];
            }
            if ((len = ACCOUNT_DOMAIN_LEN) || (g_userAccount[len] != L'\\'))
            {
                // '\' was not found. Invalid domain\user string.
                delete[] domain;
                return false;
            }
            else
            {
                domain[len] = L'\0';
            }
            // Process domain string
            bool result = CheckDomain(domain);
    
            delete[] domain;
            return result;
        }
        return false;
    }
    
    int path_dependent(int n)
    {
        int i;
        int j;
        if (n == 0)
            i = 1;
        else
            j = 1;
        return i + j;
    }
    
  11. メニュー バーで、[ファイル]>[すべてを保存] の順に選択します。

Annotations プロジェクトを追加し、それをスタティック ライブラリとして構成する

  1. ソリューション エクスプローラーで CppDemo を右クリックし、コンテキスト メニューを開きます。 [追加]>[新しいプロジェクト] の順に選択します。

  2. [Add a new project (新しいプロジェクトの追加)] ダイアログボックスで、[Windows Desktop Wizard (Windows デスクトップ ウィザード)] を選択し、[Next (次へ)] をクリックします。

  3. [Configure your new project (新しいプロジェクトの構成)] ページで、[Project name (プロジェクト名)] テキスト ボックスに Annotations を入力し、[作成する] を選択します。

  4. [Windows Desktop Project (Windows デスクトップ プロジェクト)] ダイアログの [Application type (アプリケーションの種類)] の下で、[スタティック ライブラリ (.lib)] を選択します。

  5. [追加のオプション][空のプロジェクト]を選択します。

  6. [OK] を選択して、プロジェクトを作成します。

  1. ソリューション エクスプローラーで CppDemo を右クリックし、コンテキスト メニューを開きます。 [追加]>[新しいプロジェクト] の順に選択します。

  2. [Add New Project (新しいプロジェクトの追加)] ダイアログで、[Visual C++]>[Windows Desktop (Windows デスクトップ)] の順に選択します。

  3. Windows デスクトップ ウィザードを選択します。

  4. [Name (名前)] ボックスに Annotations と入力して、[OK] を選択します。

  5. [Windows Desktop Project (Windows デスクトップ プロジェクト)] ダイアログの [Application type (アプリケーションの種類)] の下で、[スタティック ライブラリ (.lib)] を選択します。

  6. [追加のオプション][空のプロジェクト]を選択します。

  7. [OK] を選択して、プロジェクトを作成します。

  1. ソリューション エクスプローラーで CppDemo を右クリックし、コンテキスト メニューを開きます。 [追加]>[新しいプロジェクト] の順に選択します。

  2. [Add New Project (新しいプロジェクトの追加)] ダイアログで、[Visual C++]>[Win32] の順に選択します。

  3. [Win32 Console Application (Win32 コンソール アプリケーション)] を選択します。

  4. [Name (名前)] テキスト ボックスに Annotations と入力します。

  5. OK を選択します。

  6. [Win32 Application Wizard (Win32 アプリケーション ウィザード)] ダイアログで、[Next (次へ)] を選択します。

  7. アプリケーションの種類スタティック ライブラリに変更します。

  8. [Additional options (追加オプション)] で、[Precompiled header (プリコンパイル済みヘッダー)] チェック ボックスをオフにします。

  9. [完了] を選択して、プロジェクトを作成します。

ヘッダー ファイルとソース ファイルを注釈プロジェクトに追加する

  1. ソリューション エクスプローラーで、Annotations を展開します。

  2. 右クリックで [ヘッダー ファイル] のコンテキスト メニューを Annotations の下に表示します。 [追加]>[新しい項目] の順に選択します。

  3. [Add New Item (新しい項目の追加)] ダイアログ ボックスで、[Visual C++] > [Code (コード)][ヘッダー ファイル (.h)] の順に選択します。

  4. [Name (名前)] 編集ボックスに annotations.h と入力し、[Add (追加)] を選択します。

  5. annotations.h の編集ウィンドウで、内容を選択し、削除します。

  6. 次のコードをコピーし、エディターで annotations.h ファイルに貼り付けます。

    #pragma once
    #include <sal.h>
    
    struct LinkedList
    {
        struct LinkedList* next;
        int data;
    };
    
    typedef struct LinkedList LinkedList;
    
    _Ret_maybenull_ LinkedList* AllocateNode();
    
  7. ソリューション エクスプローラーで、右クリックして [Source Files (ソース ファイル)] のコンテキスト メニューを [Annotations (アノテーション)] の下に開きます。 [追加]>[新しい項目] の順に選択します。

  8. [新しい項目の追加] ダイアログ ボックスで、 [C++ ファイル (.cpp)]をクリックします。

  9. [Name (名前)] 編集ボックスに annotations.cpp と入力し、[Add (追加)] を選択します。

  10. 次のコードをコピーし、エディターで annotations.cpp ファイルに貼り付けます。

    #include "annotations.h"
    #include <malloc.h>
    
    _Ret_maybenull_ LinkedList* AllocateNode()
    {
        LinkedList* result = static_cast<LinkedList*>(malloc(sizeof(LinkedList)));
        return result;
    }
    
    LinkedList* AddTail(LinkedList* node, int value)
    {
        // finds the last node
        while (node->next != nullptr)
        {
            node = node->next;
        }
    
        // appends the new node
        LinkedList* newNode = AllocateNode();
        newNode->data = value;
        newNode->next = 0;
        node->next = newNode;
    
        return newNode;
    }
    
  11. メニュー バーで、[ファイル]>[すべてを保存] の順に選択します。

これでソリューションが完成し、エラーなしでビルドされるはずです。

Note

Visual Studio 2017 では、IntelliSense エンジンで誤った警告 E1097 unknown attribute "no_init_all" が表示されることがあります。 この警告は無視しても問題ありません。