Поделиться через


Пример проекта C++ для анализа кода

В следующих процедурах показано, как создать пример для пошагового руководства. Анализ кода C/C++ для дефектов. Эти процедуры создают следующее:

  • Решение Visual Studio с именем CppDemo.

  • Проект статической библиотеки с именем CodeDefects.

  • Проект статической библиотеки с именем Annotations.

Кроме того, эти процедуры предоставляют код для заголовка и CPP-файлов для статических библиотек.

Создание решения CppDemo и проекта CodeDefects

  1. Откройте Visual Studio и выберите "Создать проект"

  2. В диалоговом окне "Создание проекта" измените языковой фильтр на C++.

  3. Выберите мастер рабочего стола Windows и нажмите кнопку "Далее ".

  4. На странице "Настройка нового проекта" в текстовом поле "Имя проекта" введите CodeDefects.

  5. В текстовом поле "Имя решения" введите CppDemo.

  6. Выберите Создать.

  7. В диалоговом окне "Проект рабочего стола Windows" измените тип приложения на статическую библиотеку (LIB).

  8. В поле Дополнительные параметрывыберите Пустой проект.

  9. Нажмите кнопку "ОК ", чтобы создать решение и проект.

  1. Откройте Visual Studio. В строке меню выберите Файл >Создать >Проект.

  2. В диалоговом окне "Создать проект" выберите Visual C++>Windows Desktop.

  3. Выберите мастер рабочего стола Windows.

  4. В текстовом поле "Имя" введите CodeDefects.

  5. В текстовом поле "Имя решения" введите CppDemo.

  6. Выберите OK.

  7. В диалоговом окне "Проект рабочего стола Windows" измените тип приложения на статическую библиотеку (LIB).

  8. В поле Дополнительные параметрывыберите Пустой проект.

  9. Нажмите кнопку "ОК ", чтобы создать решение и проект.

  1. Откройте Visual Studio. В строке меню выберите Файл >Создать >Проект.

  2. В диалоговом окне "Создать проект" выберите шаблоны>Visual C++>Win32.

  3. Выберите консольное приложение Win32.

  4. В текстовом поле "Имя" введите CodeDefects.

  5. В текстовом поле "Имя решения" введите CppDemo.

  6. Выберите OK.

  7. В диалоговом окне мастера приложений Win32 нажмите кнопку "Далее".

  8. Измените тип приложения на статическую библиотеку.

  9. В разделе "Дополнительные параметры" отмените выбор предкомпилированного заголовка.

  10. Нажмите кнопку " Готово ", чтобы создать решение и проект.

Добавление заголовка и исходного файла в проект CodeDefects

  1. В Обозреватель решений разверните codeDefects.

  2. Щелкните правой кнопкой мыши, чтобы открыть контекстное меню для файлов заголовков. Нажмите кнопку "Добавить>новый элемент".

  3. В диалоговом окне "Добавить новый элемент" выберите Visual C++>Code и выберите файл заголовка (.h).

  4. В поле "Имя" введите Bug.h и нажмите кнопку "Добавить".

  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. В Обозреватель решений щелкните правой кнопкой мыши контекстное меню для исходных файлов. Нажмите кнопку "Добавить>новый элемент".

  8. В диалоговом окне Добавление нового элемента выберите Файл C++ (.cpp).

  9. В поле "Имя" введите Bug.cpp и нажмите кнопку "Добавить".

  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. В диалоговом окне "Добавление нового проекта" выберите мастер рабочего стола Windows и нажмите кнопку "Далее".

  3. На странице "Настройка нового проекта" в текстовом поле "Имя проекта" введите заметки и нажмите кнопку "Создать".

  4. В диалоговом окне "Проект рабочего стола Windows" измените тип приложения на статическую библиотеку (LIB).

  5. В поле Дополнительные параметрывыберите Пустой проект.

  6. Нажмите кнопку ОК, чтобы создать проект.

  1. В Обозреватель решений щелкните правой кнопкой мыши CppDemo, чтобы открыть контекстное меню. Выберите Добавить>Новый проект.

  2. В диалоговом окне "Добавление нового проекта" выберите Visual C++>Windows Desktop.

  3. Выберите мастер рабочего стола Windows.

  4. В текстовом поле "Имя" введите заметки и нажмите кнопку "ОК".

  5. В диалоговом окне "Проект рабочего стола Windows" измените тип приложения на статическую библиотеку (LIB).

  6. В поле Дополнительные параметрывыберите Пустой проект.

  7. Нажмите кнопку ОК, чтобы создать проект.

  1. В Обозреватель решений щелкните правой кнопкой мыши CppDemo, чтобы открыть контекстное меню. Выберите Добавить>Новый проект.

  2. В диалоговом окне "Добавление нового проекта" выберите Visual C++>Win32.

  3. Выберите консольное приложение Win32.

  4. В текстовом поле "Имя" введите заметки.

  5. Выберите OK.

  6. В диалоговом окне мастера приложений Win32 нажмите кнопку "Далее".

  7. Измените тип приложения на статическую библиотеку.

  8. В разделе "Дополнительные параметры" отмените выбор предкомпилированного заголовка.

  9. Чтобы создать проект, нажмите кнопку Готово.

Добавление файла заголовка и исходного файла в проект Annotations

  1. В Обозреватель решений разверните заметки.

  2. Щелкните правой кнопкой мыши, чтобы открыть контекстное меню для файлов заголовков в разделе "Заметки". Нажмите кнопку "Добавить>новый элемент".

  3. В диалоговом окне "Добавить новый элемент" выберите Visual C++>Code и выберите файл заголовка (.h).

  4. В поле "Имя" введите заметки.h и нажмите кнопку "Добавить".

  5. В окне редактирования для заметки.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. В Обозреватель решений щелкните правой кнопкой мыши контекстное меню исходных файлов в разделе "Заметки". Нажмите кнопку "Добавить>новый элемент".

  8. В диалоговом окне Добавление нового элемента выберите Файл C++ (.cpp).

  9. В поле "Имя" введите заметки.cpp и нажмите кнопку "Добавить".

  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. В строке меню выберите Файл>Сохранить все.

Теперь решение завершено и должно создаться без ошибок.

Примечание.

В Visual Studio 2017 в обработчике IntelliSense может отображаться предупреждение.E1097 unknown attribute "no_init_all" Это предупреждение можно проигнорировать.