デモのサンプル
次の手順では、「チュートリアル : C/C++ コード分析による障害の検出」のサンプルを作成する方法について説明します。 この手順では次のものが作成されます。
CppDemo という名前の Visual Studio ソリューション。
CodeDefects という名前のスタティック ライブラリ プロジェクト。
Annotations という名前のスタティック ライブラリ プロジェクト。
この手順では、スタティック ライブラリ用のヘッダー ファイルと .cpp ファイルのコードも提供されます。
CppDemo ソリューションと CodeDefects プロジェクトを作成する
[ファイル] メニューをクリックし、[新規作成] をポイントし、[新しいプロジェクト] をクリックします。
[プロジェクトの種類] ツリー リストで、Visual C++ が VS の既定の言語ではない場合は、[他の言語] を展開します。
[Visual C#] を展開し、[全般] をクリックします。
[テンプレート] で [空のプロジェクト] をクリックします。
[名前] ボックスに「CodeDefects」と入力します。
[ソリューションのディレクトリを作成] チェック ボックスをオンにします。
[ソリューション名] ボックスに「CppDemo」と入力します。
CodeDefects プロジェクトをスタティック ライブラリとして構成する
ソリューション エクスプローラーで [CodeDefects] を右クリックし、[プロパティ] をクリックします。
[構成プロパティ] を展開し、[全般] をクリックします。
[全般] の一覧で、[ターゲットの拡張子] の横の列のテキストを選択し、「.lib」と入力します。
[プロジェクトの既定値] で、[構成の種類] の横の列をクリックし、[スタティック ライブラリ (.lib)] をクリックします。
CodeDefects プロジェクトにヘッダー ファイルとソース ファイルを追加する
ソリューション エクスプローラーで [CodeDefects] を展開し、[ヘッダー ファイル] を右クリックして [追加] をクリックし、[新しい項目] をクリックします。
[新しい項目の追加] ダイアログ ボックスの [コード] をクリックし、[ヘッダー ファイル] をクリックします。
[ファイル名] ボックスに「Bug.cpp」と入力し、[追加] をクリックします。
次のコードをコピーし、Visual Studio エディターで Bug.cpp ファイルに貼り付けます。
#include <windows.h> // //These 3 functions are consumed by the sample // but are not defined. This project cannot be linked! // bool CheckDomain( LPCSTR ); 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;
ソリューション エクスプローラーで [ソース ファイル] を右クリックし、[新規作成] をポイントして、[新しい項目] をクリックします。
[新しい項目の追加] ダイアログ ボックスで、[C++ ファイル (.cpp)] をクリックします。
[ファイル名] ボックスに「Bug.cpp」と入力し、[追加] をクリックします。
次のコードをコピーし、Visual Studio エディターで Bug.h ファイルに貼り付けます。
#include <stdlib.h> #include "Bug.h" // the user account TCHAR g_userAccount[USER_ACCOUNT_LEN] = ""; int len = 0; bool ProcessDomain() { TCHAR* domain = new TCHAR[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] != '\0') ; len++ ) { if ( g_userAccount[len] == '\\' ) { // Stops copying on the domain and user separator ('\') break; } domain[len] = g_userAccount[len]; } if((len= ACCOUNT_DOMAIN_LEN) || (g_userAccount[len] != '\\')) { // '\' was not found. Invalid domain\user string. delete [] domain; return false; } else { domain[len]='\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] をクリックし、[追加] をポイントして [新しいプロジェクト] をクリックします。
[新しいプロジェクトの追加] ダイアログ ボックスで Visual C++ を展開し、[全般] をクリックして [空のプロジェクト] をクリックします。
[名前] ボックスに「Annotations」と入力し、[追加] をクリックします。
ソリューション エクスプローラーで [Annotations] を右クリックし、[プロパティ] をクリックします。
[構成プロパティ] を展開し、[全般] をクリックします。
[全般] の一覧で、[ターゲットの拡張子] の横の列のテキストを選択し、「.lib」と入力します。
[プロジェクトの既定値] で、[構成の種類] の横の列をクリックし、[スタティック ライブラリ (.lib)] をクリックします。
Annotations プロジェクトにヘッダー ファイルとソース ファイルを追加する
ソリューション エクスプローラーで [Annotations] を展開し、[ヘッダー ファイル] を右クリックして [追加] をクリックし、[新しい項目] をクリックします。
[新しい項目の追加] ダイアログ ボックスで、[ヘッダー ファイル (.h)] をクリックします。
[ファイル名] ボックスに「annotations.h」と入力し、[追加] をクリックします。
次のコードをコピーし、Visual Studio エディターで [annotations.h] ファイルに貼り付けます。
#include <CodeAnalysis/SourceAnnotations.h> struct LinkedList { struct LinkedList* next; int data; }; typedef struct LinkedList LinkedList; [returnvalue:SA_Post( Null=SA_Maybe )] LinkedList* AllocateNode();
ソリューション エクスプローラーで [ソース ファイル] を右クリックし、[新規作成] をポイントして、[新しい項目] をクリックします。
[新しい項目の追加] ダイアログ ボックスの [コード] をクリックし、[C++ ファイル (.cpp)] をクリックします。
[ファイル名] ボックスに「annotations.cpp」と入力し、[追加] をクリックします。
次のコードをコピーし、Visual Studio エディターで [annotations.cpp] ファイルに貼り付けます。
#include <CodeAnalysis/SourceAnnotations.h> #include <windows.h> #include <stdlib.h> #include "annotations.h" LinkedList* AddTail( LinkedList *node, int value ) { LinkedList *newNode = NULL; // finds the last node while ( node->next != NULL ) { node = node->next; } // appends the new node newNode = AllocateNode(); newNode->data = value; newNode->next = 0; node->next = newNode; return newNode; }
[ファイル] メニューをクリックし、[すべてを保存] をクリックします。