コード分析のためのサンプル C++ プロジェクト
次の手順では、「チュートリアル: C/C ++ コードを分析して欠陥を分析する」のサンプルを作成する方法について説明します。 この手順で次が作成されます。
CppDemo という名前の Visual Studio ソリューション。
CodeDefects という名前のスタティック ライブラリ プロジェクト。
Annotations という名前のスタティック ライブラリ プロジェクト。
この手順では、スタティック ライブラリのヘッダー ファイルと .cpp ファイルのコードも作成されます。
CppDemo ソリューションと CodeDefects プロジェクトを作成する
Visual Studio を開始し、[Create a new project (新しいプロジェクトの作成)] を選択します
[Create a new project (新しいプロジェクトの作成)] ダイアログで、言語フィルターを C++ に変更します。
Windows デスクトップ ウィザードを選択し、[Next (次へ)] をクリックします。
[Configure your new project (新しいプロジェクトの構成)] ページで、[Project name (プロジェクト名)] ボックスに CodeDefects を入力します。
[ソリューション名] テキスト ボックスに「CppDemo」と入力します。
[作成] を選択します。
[Windows Desktop Project (Windows デスクトップ プロジェクト)] ダイアログの [Application type (アプリケーションの種類)] の下で、[スタティック ライブラリ (.lib)] を選択します。
[追加のオプション]の [空のプロジェクト]を選択します。
[OK] を選択して、ソリューションとプロジェクトを作成します。
Visual Studio を開きます。 メニュー バーで、 [ファイル]>[新規作成]>[プロジェクト] を選択します。
[New Project (新しいプロジェクト)] ダイアログ ボックスで、[Visual C++]>[Windows Desktop (Windows デスクトップ)] の順に選択します。
Windows デスクトップ ウィザードを選択します。
[名前] テキスト ボックスに「CodeDefects」と入力します。
[ソリューション名] テキスト ボックスに「CppDemo」と入力します。
OK を選択します。
[Windows Desktop Project (Windows デスクトップ プロジェクト)] ダイアログの [Application type (アプリケーションの種類)] の下で、[スタティック ライブラリ (.lib)] を選択します。
[追加のオプション]の [空のプロジェクト]を選択します。
[OK] を選択して、ソリューションとプロジェクトを作成します。
Visual Studio を開きます。 メニュー バーで、 [ファイル]>[新規作成]>[プロジェクト] を選択します。
[New Project (新しいプロジェクト)] ダイアログ ボックスで、[Templates (テンプレート)]>[Visual C++]>[Win32] の順に選択します。
[Win32 Console Application (Win32 コンソール アプリケーション)] を選択します。
[名前] テキスト ボックスに「CodeDefects」と入力します。
[ソリューション名] テキスト ボックスに「CppDemo」と入力します。
OK を選択します。
[Win32 Application Wizard (Win32 アプリケーション ウィザード)] ダイアログで、[Next (次へ)] を選択します。
アプリケーションの種類をスタティック ライブラリに変更します。
[Additional options (追加オプション)] で、[Precompiled header (プリコンパイル済みヘッダー)] チェック ボックスをオフにします。
[Finish (完了)] を選択して、ソリューションとプロジェクトを作成します。
CodeDefects プロジェクトにヘッダーとソース ファイルを追加する
ソリューション エクスプローラーで、CodeDefects を展開します。
右クリックして、ヘッダー ファイルのコンテキスト メニューを開きます。 [追加]>[新しい項目] の順に選択します。
[Add New Item (新しい項目の追加)] ダイアログ ボックスで、[Visual C++] > [Code (コード)]、[ヘッダー ファイル (.h)] の順に選択します。
[Name (名前)] 編集ボックスに Bug.h と入力し、[Add (追加)] を選択します。
Bug.h の編集ウィンドウで、内容を選択し、削除します。
次のコードをコピーし、エディターで 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;
ソリューション エクスプローラーで右クリックして、[Source Files (ソース ファイル)] のコンテキスト メニューを開きます。 [追加]>[新しい項目] の順に選択します。
[新しい項目の追加] ダイアログ ボックスで、 [C++ ファイル (.cpp)]をクリックします。
[Name (名前)] 編集ボックスに Bug.cpp と入力し、[Add (追加)] を選択します。
次のコードをコピーし、エディターで 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; }
メニュー バーで、[ファイル]>[すべてを保存] の順に選択します。
Annotations プロジェクトを追加し、それをスタティック ライブラリとして構成する
ソリューション エクスプローラーで CppDemo を右クリックし、コンテキスト メニューを開きます。 [追加]>[新しいプロジェクト] の順に選択します。
[Add a new project (新しいプロジェクトの追加)] ダイアログボックスで、[Windows Desktop Wizard (Windows デスクトップ ウィザード)] を選択し、[Next (次へ)] をクリックします。
[Configure your new project (新しいプロジェクトの構成)] ページで、[Project name (プロジェクト名)] テキスト ボックスに Annotations を入力し、[作成する] を選択します。
[Windows Desktop Project (Windows デスクトップ プロジェクト)] ダイアログの [Application type (アプリケーションの種類)] の下で、[スタティック ライブラリ (.lib)] を選択します。
[追加のオプション]の [空のプロジェクト]を選択します。
[OK] を選択して、プロジェクトを作成します。
ソリューション エクスプローラーで CppDemo を右クリックし、コンテキスト メニューを開きます。 [追加]>[新しいプロジェクト] の順に選択します。
[Add New Project (新しいプロジェクトの追加)] ダイアログで、[Visual C++]>[Windows Desktop (Windows デスクトップ)] の順に選択します。
Windows デスクトップ ウィザードを選択します。
[Name (名前)] ボックスに Annotations と入力して、[OK] を選択します。
[Windows Desktop Project (Windows デスクトップ プロジェクト)] ダイアログの [Application type (アプリケーションの種類)] の下で、[スタティック ライブラリ (.lib)] を選択します。
[追加のオプション]の [空のプロジェクト]を選択します。
[OK] を選択して、プロジェクトを作成します。
ソリューション エクスプローラーで CppDemo を右クリックし、コンテキスト メニューを開きます。 [追加]>[新しいプロジェクト] の順に選択します。
[Add New Project (新しいプロジェクトの追加)] ダイアログで、[Visual C++]>[Win32] の順に選択します。
[Win32 Console Application (Win32 コンソール アプリケーション)] を選択します。
[Name (名前)] テキスト ボックスに Annotations と入力します。
OK を選択します。
[Win32 Application Wizard (Win32 アプリケーション ウィザード)] ダイアログで、[Next (次へ)] を選択します。
アプリケーションの種類をスタティック ライブラリに変更します。
[Additional options (追加オプション)] で、[Precompiled header (プリコンパイル済みヘッダー)] チェック ボックスをオフにします。
[完了] を選択して、プロジェクトを作成します。
ヘッダー ファイルとソース ファイルを注釈プロジェクトに追加する
ソリューション エクスプローラーで、Annotations を展開します。
右クリックで [ヘッダー ファイル] のコンテキスト メニューを Annotations の下に表示します。 [追加]>[新しい項目] の順に選択します。
[Add New Item (新しい項目の追加)] ダイアログ ボックスで、[Visual C++] > [Code (コード)]、[ヘッダー ファイル (.h)] の順に選択します。
[Name (名前)] 編集ボックスに annotations.h と入力し、[Add (追加)] を選択します。
annotations.h の編集ウィンドウで、内容を選択し、削除します。
次のコードをコピーし、エディターで annotations.h ファイルに貼り付けます。
#pragma once #include <sal.h> struct LinkedList { struct LinkedList* next; int data; }; typedef struct LinkedList LinkedList; _Ret_maybenull_ LinkedList* AllocateNode();
ソリューション エクスプローラーで、右クリックして [Source Files (ソース ファイル)] のコンテキスト メニューを [Annotations (アノテーション)] の下に開きます。 [追加]>[新しい項目] の順に選択します。
[新しい項目の追加] ダイアログ ボックスで、 [C++ ファイル (.cpp)]をクリックします。
[Name (名前)] 編集ボックスに annotations.cpp と入力し、[Add (追加)] を選択します。
次のコードをコピーし、エディターで 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; }
メニュー バーで、[ファイル]>[すべてを保存] の順に選択します。
これでソリューションが完成し、エラーなしでビルドされるはずです。
Note
Visual Studio 2017 では、IntelliSense エンジンで誤った警告 E1097 unknown attribute "no_init_all"
が表示されることがあります。 この警告は無視しても問題ありません。