Пример проекта C++ для анализа кода
В следующих процедурах показано, как создать пример для пошагового руководства. Анализ кода C/C++ для дефектов. Эти процедуры создают следующее:
Решение Visual Studio с именем CppDemo.
Проект статической библиотеки с именем CodeDefects.
Проект статической библиотеки с именем Annotations.
Кроме того, эти процедуры предоставляют код для заголовка и CPP-файлов для статических библиотек.
Создание решения CppDemo и проекта CodeDefects
Откройте Visual Studio и выберите "Создать проект"
В диалоговом окне "Создание проекта" измените языковой фильтр на C++.
Выберите мастер рабочего стола Windows и нажмите кнопку "Далее ".
На странице "Настройка нового проекта" в текстовом поле "Имя проекта" введите CodeDefects.
В текстовом поле "Имя решения" введите CppDemo.
Выберите Создать.
В диалоговом окне "Проект рабочего стола Windows" измените тип приложения на статическую библиотеку (LIB).
В поле Дополнительные параметрывыберите Пустой проект.
Нажмите кнопку "ОК ", чтобы создать решение и проект.
Откройте Visual Studio. В строке меню выберите Файл >Создать >Проект.
В диалоговом окне "Создать проект" выберите Visual C++>Windows Desktop.
Выберите мастер рабочего стола Windows.
В текстовом поле "Имя" введите CodeDefects.
В текстовом поле "Имя решения" введите CppDemo.
Выберите OK.
В диалоговом окне "Проект рабочего стола Windows" измените тип приложения на статическую библиотеку (LIB).
В поле Дополнительные параметрывыберите Пустой проект.
Нажмите кнопку "ОК ", чтобы создать решение и проект.
Откройте Visual Studio. В строке меню выберите Файл >Создать >Проект.
В диалоговом окне "Создать проект" выберите шаблоны>Visual C++>Win32.
Выберите консольное приложение Win32.
В текстовом поле "Имя" введите CodeDefects.
В текстовом поле "Имя решения" введите CppDemo.
Выберите OK.
В диалоговом окне мастера приложений Win32 нажмите кнопку "Далее".
Измените тип приложения на статическую библиотеку.
В разделе "Дополнительные параметры" отмените выбор предкомпилированного заголовка.
Нажмите кнопку " Готово ", чтобы создать решение и проект.
Добавление заголовка и исходного файла в проект CodeDefects
В Обозреватель решений разверните codeDefects.
Щелкните правой кнопкой мыши, чтобы открыть контекстное меню для файлов заголовков. Нажмите кнопку "Добавить>новый элемент".
В диалоговом окне "Добавить новый элемент" выберите Visual C++>Code и выберите файл заголовка (.h).
В поле "Имя" введите Bug.h и нажмите кнопку "Добавить".
В окне редактирования для 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;
В Обозреватель решений щелкните правой кнопкой мыши контекстное меню для исходных файлов. Нажмите кнопку "Добавить>новый элемент".
В диалоговом окне Добавление нового элемента выберите Файл C++ (.cpp).
В поле "Имя" введите Bug.cpp и нажмите кнопку "Добавить".
Скопируйте приведенный ниже код и вставьте его в файл 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, чтобы открыть контекстное меню. Выберите Добавить>Новый проект.
В диалоговом окне "Добавление нового проекта" выберите мастер рабочего стола Windows и нажмите кнопку "Далее".
На странице "Настройка нового проекта" в текстовом поле "Имя проекта" введите заметки и нажмите кнопку "Создать".
В диалоговом окне "Проект рабочего стола Windows" измените тип приложения на статическую библиотеку (LIB).
В поле Дополнительные параметрывыберите Пустой проект.
Нажмите кнопку ОК, чтобы создать проект.
В Обозреватель решений щелкните правой кнопкой мыши CppDemo, чтобы открыть контекстное меню. Выберите Добавить>Новый проект.
В диалоговом окне "Добавление нового проекта" выберите Visual C++>Windows Desktop.
Выберите мастер рабочего стола Windows.
В текстовом поле "Имя" введите заметки и нажмите кнопку "ОК".
В диалоговом окне "Проект рабочего стола Windows" измените тип приложения на статическую библиотеку (LIB).
В поле Дополнительные параметрывыберите Пустой проект.
Нажмите кнопку ОК, чтобы создать проект.
В Обозреватель решений щелкните правой кнопкой мыши CppDemo, чтобы открыть контекстное меню. Выберите Добавить>Новый проект.
В диалоговом окне "Добавление нового проекта" выберите Visual C++>Win32.
Выберите консольное приложение Win32.
В текстовом поле "Имя" введите заметки.
Выберите OK.
В диалоговом окне мастера приложений Win32 нажмите кнопку "Далее".
Измените тип приложения на статическую библиотеку.
В разделе "Дополнительные параметры" отмените выбор предкомпилированного заголовка.
Чтобы создать проект, нажмите кнопку Готово.
Добавление файла заголовка и исходного файла в проект Annotations
В Обозреватель решений разверните заметки.
Щелкните правой кнопкой мыши, чтобы открыть контекстное меню для файлов заголовков в разделе "Заметки". Нажмите кнопку "Добавить>новый элемент".
В диалоговом окне "Добавить новый элемент" выберите Visual C++>Code и выберите файл заголовка (.h).
В поле "Имя" введите заметки.h и нажмите кнопку "Добавить".
В окне редактирования для заметки.h выберите и удалите содержимое.
Скопируйте приведенный ниже код и вставьте его в файл annotations.h в редакторе.
#pragma once #include <sal.h> struct LinkedList { struct LinkedList* next; int data; }; typedef struct LinkedList LinkedList; _Ret_maybenull_ LinkedList* AllocateNode();
В Обозреватель решений щелкните правой кнопкой мыши контекстное меню исходных файлов в разделе "Заметки". Нажмите кнопку "Добавить>новый элемент".
В диалоговом окне Добавление нового элемента выберите Файл C++ (.cpp).
В поле "Имя" введите заметки.cpp и нажмите кнопку "Добавить".
Скопируйте приведенный ниже код и вставьте его в файл 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; }
В строке меню выберите Файл>Сохранить все.
Теперь решение завершено и должно создаться без ошибок.
Примечание.
В Visual Studio 2017 в обработчике IntelliSense может отображаться предупреждение.E1097 unknown attribute "no_init_all"
Это предупреждение можно проигнорировать.