Projeto de C++ de exemplo para análise de código
Os procedimentos a seguir mostram como criar o exemplo de Passo a passo: analisar o código C/C++ em busca de defeitos. Os procedimentos criam:
Uma solução do Visual Studio chamada CppDemo.
Um projeto de biblioteca estática chamado CodeDefects.
Um projeto de biblioteca estática chamado Anotações.
Os procedimentos também fornecem o código para o cabeçalho e arquivos .cpp para as bibliotecas estáticas.
Criar a solução CppDemo e o projeto CodeDefects
Abra o Visual Studio e selecione Criar um projeto
Na caixa de diálogo Criar um projeto, altere o filtro de linguagem de programação para C++.
Selecione o Assistente para Área de Trabalho do Windows e escolha o botão Avançar.
Na página Configurar seu novo projeto, na caixa de texto Nome do Projeto, insira CodeDefects.
Na caixa de texto Nome da Solução, digite CppDemo.
Escolha Criar.
Na caixa de diálogo Projeto da Área de Trabalho do Windows, altere o Tipo de aplicativo para Biblioteca Estática (.lib).
Em Opções adicionais, selecione Projeto vazio.
Escolha OK para criar a solução e o projeto.
Abra o Visual Studio. Na barra de menus, escolha Arquivo>Novo>Projeto.
Na caixa de diálogo Novo Projeto, selecione Visual C++>Área de Trabalho do Windows.
Selecione Assistente da Área de Trabalho do Windows.
Na caixa de texto Nome, digite CodeDefects.
Na caixa de texto Nome da Solução, digite CppDemo.
Escolha OK.
Na caixa de diálogo Projeto da Área de Trabalho do Windows, altere o Tipo de aplicativo para Biblioteca Estática (.lib).
Em Opções adicionais, selecione Projeto vazio.
Escolha OK para criar a solução e o projeto.
Abra o Visual Studio. Na barra de menus, escolha Arquivo>Novo>Projeto.
Na caixa de diálogo Novo Projeto, selecione Modelos>Visual C++>Win32.
Selecione Aplicativo do Console Win32.
Na caixa de texto Nome, digite CodeDefects.
Na caixa de texto Nome da Solução, digite CppDemo.
Escolha OK.
Na caixa de diálogo Assistente de Aplicativo Win32, clique no botão Avançar.
Altere o Tipo de aplicativo para Biblioteca estática.
Em Opções adicionais, desmarque Cabeçalho pré-compilado.
Escolha Concluir para criar a solução e o projeto.
Adicionar o arquivo de cabeçalho e o código-fonte ao projeto CodeDefects
No Gerenciador de Soluções, expanda CodeDefects.
Clique com o botão direito do mouse para abrir o menu de contexto para Arquivos de Cabeçalho. Escolha Adicionar>Novo Item.
Na caixa de diálogo Adicionar Novo Item, selecione Visual C++>Código e depois Arquivo de Cabeçalho (.h).
Na caixa de edição Nome, insira Bug.h e escolha o botão Adicionar.
Na janela de edição de Bug.h, selecione e exclua o conteúdo.
Copie o código a seguir e cole-o no arquivo Bug.h no editor.
#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;
Em Gerenciador de Soluções, clique com o botão direito do mouse para abrir o menu de contexto dos Arquivos de Origem. Escolha Adicionar>Novo Item.
Na caixa de diálogo Adicionar Novo Item, selecione Arquivo C++ (.cpp).
Na caixa de edição Nome, insira Bug.cpp e escolha o botão Adicionar.
Copie o código a seguir e cole-o no arquivo Bug.cpp no editor.
#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; }
Na barra de menus, escolha Arquivo>Salvar Todos.
Adicionar o projeto Anotações e configurá-lo como uma biblioteca estática
Em Gerenciador de Soluções, clique com o botão direito do mouse em CppDemo para abrir o menu de contexto. Escolha Adicionar>Novo Projeto.
Na caixa de diálogo Adicionar um novo projeto, selecione Assistente para Área de Trabalho do Windows e escolha o botão Avançar.
Na página Configurar seu novo projeto, na caixa de texto Nome do Projeto, insira Anotações e escolha Criar.
Na caixa de diálogo Projeto da Área de Trabalho do Windows, altere o Tipo de aplicativo para Biblioteca Estática (.lib).
Em Opções adicionais, selecione Projeto vazio.
Clique em OK para criar o projeto.
Em Gerenciador de Soluções, clique com o botão direito do mouse em CppDemo para abrir o menu de contexto. Escolha Adicionar>Novo Projeto.
Na caixa de diálogo Adicionar Novo Projeto, selecione Visual C++>Área de Trabalho do Windows.
Selecione Assistente da Área de Trabalho do Windows.
Na caixa de texto Nome, insira Anotações e, em seguida, escolha o botão OK.
Na caixa de diálogo Projeto da Área de Trabalho do Windows, altere o Tipo de aplicativo para Biblioteca Estática (.lib).
Em Opções adicionais, selecione Projeto vazio.
Clique em OK para criar o projeto.
Em Gerenciador de Soluções, clique com o botão direito do mouse em CppDemo para abrir o menu de contexto. Escolha Adicionar>Novo Projeto.
Na caixa de diálogo Adicionar Novo Projeto, selecione Visual C++>Win32.
Selecione Aplicativo do Console Win32.
Na caixa de texto Nome, insira Anotações.
Escolha OK.
Na caixa de diálogo Assistente de Aplicativo Win32, clique no botão Avançar.
Altere o Tipo de aplicativo para Biblioteca estática.
Em Opções adicionais, desmarque Cabeçalho pré-compilado.
Selecione Concluir para criar o projeto.
Adicionar o arquivo de cabeçalho e o arquivo de origem ao projeto Anotações
No Gerenciador de Soluções, expanda Anotações.
Clique com o botão direito do mouse para abrir o menu de contexto para Arquivos de Cabeçalho em Anotações. Escolha Adicionar>Novo Item.
Na caixa de diálogo Adicionar Novo Item, selecione Visual C++>Código e depois Arquivo de Cabeçalho (.h).
Na caixa de edição Nome, insira annotations.h e escolha o botão Adicionar.
Na janela de edição de annotations.h, selecione e exclua o conteúdo.
Copie o código a seguir e cole-o no arquivo annotations.h no editor.
#pragma once #include <sal.h> struct LinkedList { struct LinkedList* next; int data; }; typedef struct LinkedList LinkedList; _Ret_maybenull_ LinkedList* AllocateNode();
Em Gerenciador de Soluções, clique com o botão direito do mouse para abrir o menu de contexto dos Arquivos de Origem em Anotações. Escolha Adicionar>Novo Item.
Na caixa de diálogo Adicionar Novo Item, selecione Arquivo C++ (.cpp).
Na caixa de edição Nome, insira annotations.cpp e escolha o botão Adicionar.
Copie o código a seguir e cole-o no arquivo annotations.cpp no editor.
#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; }
Na barra de menus, escolha Arquivo>Salvar Todos.
A solução agora está concluída e deve ser compilada sem erros.
Observação
No Visual Studio 2017, você pode ver um aviso E1097 unknown attribute "no_init_all"
espúrio no mecanismo IntelliSense. Ignore esse erro.