Aracılığıyla paylaş


Kod analizi için örnek C++ projesi

Aşağıdaki yordamlarda, İzlenecek Yol için örneğin nasıl oluşturulacağı gösterilmektedir: Hatalara yönelik C/C++ kodunu analiz etme. Yordamlar aşağıdakileri oluşturur:

  • CppDemo adlı bir Visual Studio çözümü.

  • CodeDefects adlı statik kitaplık projesi.

  • Ek Açıklamalar adlı statik kitaplık projesi.

Yordamlar ayrıca statik kitaplıklar için üst bilgi ve .cpp dosyalarının kodunu da sağlar.

CppDemo çözümünü ve CodeDefects projesini oluşturma

  1. Visual Studio'yu açın ve Yeni proje oluştur'u seçin

  2. Yeni proje oluştur iletişim kutusunda dil filtresini C++ olarak değiştirin.

  3. Windows Masaüstü Sihirbazı'nı ve ardından İleri düğmesini seçin.

  4. Yeni projenizi yapılandırın sayfasındaki Proje adı metin kutusuna CodeDefects yazın.

  5. Çözüm adı metin kutusuna CppDemo girin.

  6. Oluştur’u seçin.

  7. Windows Masaüstü Projesi iletişim kutusunda Uygulama türünü Statik Kitaplık (.lib) olarak değiştirin.

  8. Ek seçenekler'in altında Projeyi boşalt'ı seçin.

  9. Çözümü ve projeyi oluşturmak için Tamam'ı seçin.

  1. Visual Studio'yu açın. Menü çubuğunda Dosya Yeni Proje'yi> seçin.>

  2. Yeni Proje iletişim kutusunda Visual C++>Windows Masaüstü'nü seçin.

  3. Windows Masaüstü Sihirbazı'nı seçin.

  4. Ad metin kutusuna CodeDefects yazın.

  5. Çözüm adı metin kutusuna CppDemo girin.

  6. Tamam'ı seçin.

  7. Windows Masaüstü Projesi iletişim kutusunda Uygulama türünü Statik Kitaplık (.lib) olarak değiştirin.

  8. Ek seçenekler'in altında Projeyi boşalt'ı seçin.

  9. Çözümü ve projeyi oluşturmak için Tamam'ı seçin.

  1. Visual Studio'yu açın. Menü çubuğunda Dosya Yeni Proje'yi> seçin.>

  2. Yeni Proje iletişim kutusunda Şablonlar>Visual C++>Win32'yi seçin.

  3. Win32 Konsol Uygulaması'nu seçin.

  4. Ad metin kutusuna CodeDefects yazın.

  5. Çözüm adı metin kutusuna CppDemo girin.

  6. Tamam'ı seçin.

  7. Win32 Uygulama Sihirbazı iletişim kutusunda İleri düğmesini seçin.

  8. Uygulama türünü Statik kitaplık olarak değiştirin.

  9. Ek seçenekler'in altında, Önceden derlenmiş üst bilgi seçimini kaldırın.

  10. Çözümü ve projeyi oluşturmak için Son'u seçin.

CodeDefects projesine üst bilgi ve kaynak dosya ekleme

  1. Çözüm Gezgini'da CodeDefects'ı genişletin.

  2. Üst Bilgi Dosyaları bağlam menüsünü açmak için sağ tıklayın. Yeni Öğe Ekle'yi>seçin.

  3. Yeni Öğe Ekle iletişim kutusunda Visual C++>Code'ı ve ardından Üst Bilgi Dosyası (.h) öğesini seçin.

  4. Ad düzenleme kutusuna Bug.h yazın ve Ekle düğmesini seçin.

  5. Bug.h dosyasının düzenleme penceresinde içeriği seçip silin.

  6. Aşağıdaki kodu kopyalayın ve düzenleyicideki Bug.h dosyasına yapıştırın.

    #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. Çözüm Gezgini'da sağ tıklayarak Kaynak Dosyalar bağlam menüsünü açın. Yeni Öğe Ekle'yi>seçin.

  8. Yeni Öğe Ekle iletişim kutusunda C++ Dosyası (.cpp) öğesini seçin.

  9. Ad düzenleme kutusuna Bug.cpp yazın ve Ekle düğmesini seçin.

  10. Aşağıdaki kodu kopyalayın ve düzenleyicideki Bug.cpp dosyasına yapıştırın.

    #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. Menü çubuğunda Dosya>Tümünü Kaydet'i seçin.

Ek Açıklamalar projesini ekleme ve statik kitaplık olarak yapılandırma

  1. Çözüm Gezgini'da, bağlam menüsünü açmak için CppDemo'ya sağ tıklayın. Yeni Proje Ekle'yi>seçin.

  2. Yeni proje ekle iletişim kutusunda Windows Masaüstü Sihirbazı'nı ve ardından İleri düğmesini seçin.

  3. Yeni projenizi yapılandırın sayfasında, Proje adı metin kutusuna Ek Açıklamalar yazın ve Oluştur'u seçin.

  4. Windows Masaüstü Projesi iletişim kutusunda Uygulama türünü Statik Kitaplık (.lib) olarak değiştirin.

  5. Ek seçenekler'in altında Projeyi boşalt'ı seçin.

  6. Projeyi oluşturmak için Tamam'ı seçin.

  1. Çözüm Gezgini'da, bağlam menüsünü açmak için CppDemo'ya sağ tıklayın. Yeni Proje Ekle'yi>seçin.

  2. Yeni Proje Ekle iletişim kutusunda Visual C++>Windows Masaüstü'nü seçin.

  3. Windows Masaüstü Sihirbazı'nı seçin.

  4. Ad metin kutusuna Ek Açıklamalar yazın ve Tamam'ı seçin.

  5. Windows Masaüstü Projesi iletişim kutusunda Uygulama türünü Statik Kitaplık (.lib) olarak değiştirin.

  6. Ek seçenekler'in altında Projeyi boşalt'ı seçin.

  7. Projeyi oluşturmak için Tamam'ı seçin.

  1. Çözüm Gezgini'da, bağlam menüsünü açmak için CppDemo'ya sağ tıklayın. Yeni Proje Ekle'yi>seçin.

  2. Yeni Proje Ekle iletişim kutusunda Visual C++>Win32'yi seçin.

  3. Win32 Konsol Uygulaması'nu seçin.

  4. Ad metin kutusuna Ek Açıklamalar yazın.

  5. Tamam'ı seçin.

  6. Win32 Uygulama Sihirbazı iletişim kutusunda İleri düğmesini seçin.

  7. Uygulama türünü Statik kitaplık olarak değiştirin.

  8. Ek seçenekler'in altında, Önceden derlenmiş üst bilgi seçimini kaldırın.

  9. Projeyi oluşturmak için Son'u seçin.

Üst bilgi dosyasını ve kaynak dosyayı Ek Açıklamalar projesine ekleme

  1. Çözüm Gezgini'da Ek Açıklamalar'ı genişletin.

  2. Ek Açıklamalar'ın altında Üst Bilgi Dosyaları bağlam menüsünü açmak için sağ tıklayın. Yeni Öğe Ekle'yi>seçin.

  3. Yeni Öğe Ekle iletişim kutusunda Visual C++>Code'ı ve ardından Üst Bilgi Dosyası (.h) öğesini seçin.

  4. Ad düzenleme kutusuna annotations.h yazın ve Ekle düğmesini seçin.

  5. annotations.h dosyasının düzenleme penceresinde içeriği seçin ve silin.

  6. Aşağıdaki kodu kopyalayın ve düzenleyicideki annotations.h dosyasına yapıştırın.

    #pragma once
    #include <sal.h>
    
    struct LinkedList
    {
        struct LinkedList* next;
        int data;
    };
    
    typedef struct LinkedList LinkedList;
    
    _Ret_maybenull_ LinkedList* AllocateNode();
    
  7. Çözüm Gezgini sağ tıklayarak Ek Açıklamalar'ın altındaki Kaynak Dosyalar bağlam menüsünü açın. Yeni Öğe Ekle'yi>seçin.

  8. Yeni Öğe Ekle iletişim kutusunda C++ Dosyası (.cpp) öğesini seçin.

  9. Ad düzenleme kutusuna annotations.cpp yazın ve Ekle düğmesini seçin.

  10. Aşağıdaki kodu kopyalayın ve düzenleyicideki annotations.cpp dosyasına yapıştırın.

    #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. Menü çubuğunda Dosya>Tümünü Kaydet'i seçin.

Çözüm artık tamamlandı ve hatasız derlenmelidir.

Dekont

Visual Studio 2017'de IntelliSense altyapısında sahte bir uyarı E1097 unknown attribute "no_init_all" görebilirsiniz. Bu uyarıyı güvenle yoksayabilirsiniz.