Пример Demo
В следующих процедурах демонстрируется создание образца для раздела Пошаговое руководство. Проверка кода C/C++ на наличие дефектов.В процедурах создаются следующие объекты:
решение Visual Studio с именем CppDemo;
проект статической библиотеки с именем CodeDefects;
проект статической библиотеки с именем Annotations.
В процедурах также предусмотрен код для заголовка и CPP-файлов статических библиотек.
Создание решения CppDemo и проекта CodeDefects
В меню Файл последовательно выберите пункты Создать, Новый проект.
Если Visual C++ не используется в VS в качестве языка по умолчанию, разверните в списке дерева Типы проектов узел Другие языки.
Разверните узел Visual C++ и выберите Общие.
В поле Шаблоны выберите Пустой проект.
В текстовом поле Имя введите CodeDefects.
Установите флажок Создать каталог для решения.
В текстовом поле Имя решения введите CppDemo.
Настройка проекта CodeDefects в качестве статической библиотеки
Щелкните правой кнопкой проект CodeDefects в обозревателе решений и выберите пункт Свойства.
Разверните узел Свойства конфигурации и выберите Общие.
В списке Общие выберите текст в столбце рядом с надписью Конечное расширение, а затем введите .lib.
В области Значения по умолчанию для проекта щелкните столбец рядом с надписью Тип конфигурации, а затем выберите Статическая библиотека (.lib).
Добавление заголовка и файла исходного кода в проект CodeDefects
В обозревателе решений разверните узел CodeDefects, щелкните правой кнопкой мыши папку Заголовочные файлы и последовательно выберите пункты Добавить и Новый элемент.
В диалоговом окне Добавление нового элемента выделите поле Код и выберите Заголовочный файл (.h).
В окне Имя введите Bug.cpp и нажмите кнопку Добавить.
Скопируйте приведенный ниже код и вставьте его в файл Bug.cpp в редакторе Visual Studio.
#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 и нажмите кнопку Добавить.
Скопируйте приведенный ниже код и вставьте его в файл Bug.h в редакторе Visual Studio.
#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 и нажмите кнопку Добавить.
Скопируйте приведенный ниже код и вставьте его в файл annotations.h в редакторе Visual Studio.
#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 и нажмите кнопку Добавить.
Скопируйте приведенный ниже код и вставьте его в файл annotations.cpp в редакторе Visual Studio.
#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; }
Откройте меню Файл, а затем выберите команду Сохранить все.