Penggunaan PVS-Studio saat Memeriksa Proyek Mesin Tidak Nyata pada OS Windows

Gambar 2

Artikel ini berfokus pada spesifik memeriksa proyek-proyek Unreal Engine dengan analisa statis PVS-Studio pada sistem operasi Windows: cara menginstal analisa, memeriksa proyek, di mana dan bagaimana melihat laporan kesalahan.

Bagian integral dari seri artikel kami adalah topik yang terkait dengan industri game. Periksa mesin yang sebenarnya digunakan dalam AAA-game - Anda dipersilakan , datang dengan kesalahan teratas di industri game - silakan , temukan bug di salah satu mesin permainan paling populer Unreal Engine (UE) - cukup mudah . Dalam pengembangan game, serta dengan aplikasi lain, kualitas kode tidak masalah. Kesalahan paling baik ditemukan sedini mungkin dan pilihan terbaik adalah melakukannya secara otomatis - di sinilah penganalisa kode statis membantu para programmer.

Pada artikel ini, saya akan mencoba untuk secara singkat berbicara tentang bagaimana Anda dapat menggunakan analisa statis PVS-Studio untuk memeriksa proyek yang dibuat di UE. PVS-Studio dapat membantu Anda membuat kode proyek Anda lebih baik dengan menemukan bug di dalamnya, sehingga memungkinkan Anda untuk mengurangi waktu yang Anda habiskan untuk meninjau kode.

Harap dicatat bahwa artikel ini adalah tambahan untuk dokumentasi yang ada pada analisis proyek UE dan tidak berfungsi menggantikannya, sebagian besar meminjam isi dokumentasi.

Instalasi PVS-Studio


Cara termudah untuk menginstal analyzer PVS-Studio adalah dengan mengunduh file instalasinya . Agar dapat menganalisis proyek yang dibuat di UE, Anda harus memilih komponen berikut ketika menginstal PVS-Studio: "Pemantauan Kompiler C dan C ++" dan "Integrasi dengan Microsoft Visual Studio (Visual C ++ / C #)." Poin terakhir bertanggung jawab untuk mengintegrasikan plugin PVS-Studio ke dalam Visual Studio IDE, yang dengannya nyaman untuk bekerja dengan log kesalahan dan dengan pengaturan umum dari penganalisis itu sendiri.

Untuk bekerja sepenuhnya dengan PVS-Studio, Anda harus memasukkan lisensi. Anda dapat melakukan ini dengan membuka IDE Visual Studio (VS) dan memasukkan lisensi di 'PVS-Studio | Pilihan ... | Pendaftaran'. Dalam VS 2019, menu PVS-Studio telah dipindahkan ke menu 'Ekstensi', jalur ke jendela entri lisensi terlihat seperti ini: 'Ekstensi' | 'PVS-Studio | Pilihan ... | Pendaftaran'. Lisensi tersedia di situs web kami.

Untuk membangun proyek UE, digunakan program UnrealBuildTool (UBT) khusus dari Epic Games, bukan sistem build standar, yang digunakan dalam VS (MSBuild). Dalam hal ini, plugin PVS-Studio tidak dapat menerapkan skenario biasa untuk memeriksa proyek C ++ / C #, dibuat dalam VS: "PVS-Studio -> Periksa -> Proyek Saat Ini". Ada beberapa solusi untuk menghindari batasan ini.

Melakukan Analisis dengan Sistem Pemantauan Kompilasi


Cara pertama dan termudah untuk memeriksa proyek UE adalah dengan menggunakan program C dan C ++ Compiler Monitoring (bernama Standalone.exe), yang terletak di direktori instalasi PVS-Studio. Prinsip kerjanya adalah bahwa ia memantau proses kompiler yang sesuai dengan kompiler target (dalam hal ini, cl.exe) dan mengumpulkan semua informasi yang diperlukan untuk preprocessing dan analisis lebih lanjut dari file sumber. Setelah Anda membuka C dan C ++ Pemantau Kompiler, gunakan menu "Alat" dan pilih opsi "Analisis File Anda (C dan C ++) ...". Tekan "Mulai Pemantauan" dan Anda akan melihat jendela di sudut kiri bawah yang memberi tahu Anda bahwa pemantauan panggilan kompiler sedang dalam proses:

Gambar 1

Selanjutnya, bangun proyek UE Anda dan tekan "Hentikan Pemantauan".

Setelah itu, analisis file sumber yang dikompilasi akan dimulai. Laporan peringatan yang ditemukan akan ditampilkan di jendela "Keluaran Penganalisa" dari program C dan C ++ Pemantau Kompiler.

Pemantauan panggilan kompiler serupa dan analisis selanjutnya dari file yang terdeteksi dapat dibuat menggunakan program konsol CLMonitor.exe, yang terletak di folder yang sama, tempat PVS-Studio diinstal. CLMonitor.exe memiliki dua mode operasi: mode server ketika peluncuran proses (sesuai dengan kompiler target) dimonitor dan mode klien (ketika file sumber, terdeteksi pada tahap pemantauan, dianalisis, diikuti oleh laporan hasil analisis) . Untuk menjalankan CLMonitor.exe dalam mode server, lakukan perintah berikut:

CLMonitor.exe monitor 

Setelah itu, bangun proyek UE Anda dan lakukan perintah di bawah ini:

 CLMonitor.exe analyze -l "c:\ptest.plog" 

Perintah "menganalisis" menjalankan CLMonitor.exe dalam mode klien dan menutup instance yang berjalan dari program ini, bekerja dalam mode server. Setelah melakukan perintah ini, CLMonitor.exe akan mulai menjalankan analisis file. Parameter untuk opsi "- l" adalah path ke file, di mana hasil analisis akan ditulis.

Melakukan Analisis dengan Kunci -StaticAnalyzer = PVSStudio


Pendekatan yang berbeda dan lebih nyaman untuk menganalisis proyek UE adalah integrasi langsung dengan sistem yang dibangun UBT. Untuk melakukan ini, buka jendela properti proyek UE Anda di VS dan pilih "NMake" dalam daftar "Configuration Properties". Tambahkan -StaticAnalyzer = PVSStudio di bidang teks dari properti "Build Command Line". Sebagai contoh, nilai bidang "Bangun Baris Perintah" mungkin terlihat sebagai berikut:

 C:\Program Files\Epic Games\UE_4.22\Engine\Build\BatchFiles\Build.bat" MyProject Win64 DebugGame -Project="$(SolutionDir)$(ProjectName).uproject" -WaitMutex -FromMsBuild -StaticAnalyzer=PVSStudio 

Harus dipertimbangkan bahwa ketika melakukan pembangunan proyek, itu hanya akan dianalisis, bukan dibangun. Skenario di mana proyek dibangun dan dianalisis akan diuraikan di bawah ini. Juga harus dicatat bahwa hanya file sumber yang telah diubah sejak pembangunan proyek terakhir yang akan dianalisis. Mengubah file .h apa pun yang disertakan bukan alasan untuk melakukan analisis selama pembuatan berikutnya. Untuk melakukan analisis penuh, Anda perlu menambahkan bendera yang sama di bidang teks dari properti "Rebuild All Command Line". Sekarang ketika membangun kembali proyek, Anda akan mendapatkan hasil menganalisis seluruh proyek.

Melakukan Analisis melalui Modifikasi file Paket


Sekarang mari kita pertimbangkan skenario lain dari penganalisa PVS-Studio yang terintegrasi ke dalam sistem build UBT. Saat melakukannya, analisis dimulai tepat setelah melakukan membangun / membangun kembali proyek. Dengan kata lain, Anda mendapatkan proyek yang dibangun dan file dengan hasil analisis. Anda mungkin telah mencatat bahwa bidang Build Command Line berisi lintasan ke file batch Build.bat, yang, pada gilirannya, berisi instruksi untuk menjalankan UBT dengan argumen yang diperlukan. Build.bat berjalan di awal pembuatan.

Intinya adalah untuk mengubah file batch sehingga pertama kali dapat menjalankan UBT dengan argumen build standar dan kemudian, jika build berhasil selesai, jalankan UBT yang sama, tetapi sudah dengan flag tambahan -StaticAnalyzer = PVSStudio. Untuk menerapkan skenario di atas, Anda dapat mengubah file batch Build.bat. Bahkan lebih baik untuk membuat salinannya bernama, misalnya, BuildAndAnalyze.bat. Inilah yang perlu Anda lakukan untuk mengimplementasikan skenario yang dijelaskan. Tepat setelah perintah popd, masukkan instruksi berikut:

 SET "UBT_ERR_LEVEL=!ERRORLEVEL!" SET "NEED_TO_PERFORM_ANALYSIS" IF "!UBT_ERR_LEVEL!"=="0" ( SET "NEED_TO_PERFORM_ANALYSIS=TRUE" ) IF "!UBT_ERR_LEVEL!"=="2" ( SET "NEED_TO_PERFORM_ANALYSIS=TRUE" ) IF DEFINED NEED_TO_PERFORM_ANALYSIS ( pushd "%~dp0\..\..\Source" ECHO Running static analysis ..\..\Engine\Binaries\DotNET\UnrealBuildTool.exe %* -StaticAnalyzer=PVSStudio -DEPLOY popd SET "UBT_ERR_LEVEL=!ERRORLEVEL!" ) 

Jika flag -StaticAnalyzer = PVSStudio sebelumnya dipasang di bidang Build Command Line di pengaturan proyek 'Properties | Configuration Properties | NMake', itu harus dihapus.

Masalah dengan pendekatan ini adalah bahwa hanya file yang dikompilasi selama membangun akan dianalisis. Artinya, Anda tidak akan menerima file laporan dengan pemeriksaan penuh proyek Anda. Selain itu, setiap perubahan yang dibuat untuk memasukkan file .h juga tidak akan diperhitungkan. Oleh karena itu, kami tidak dapat menyebut analisis ini inkremental, karena perubahan pada file header tidak akan memicu analisis selama pembuatan berikutnya. Dalam hal ini, Anda dapat membangun kembali proyek, mendapatkan hasil analisis untuk seluruh proyek. Namun, pengembangan penuh dapat memakan waktu lama, sehingga Anda dapat mengikuti skenario ini: membuat membangun, menghapus file cache ActionHistory.bin, jalankan pembangunan dengan flag -StaticAnalyzer = PVSStudio, pulihkan file cache. File ActionHistory.bin berisi informasi yang diperlukan untuk melakukan pengembangan tambahan serta riwayat menjalankan penganalisa untuk file yang diperiksa.

Pada pandangan pertama, skenario ini mungkin bukan yang termudah, jadi kami akan memberikan serangkaian instruksi lengkap tentang bagaimana Anda dapat mengubah file Build.bat yang asli. Perlu dicatat bahwa perubahan tersebut hanya relevan dengan Unreal Engine versi 4.21 dan yang lebih baru. Setelah perintah setlocal enabledelayedexpansion, deklarasikan variabel-variabel berikut:

 SET PROJECT_NAME=%1% SET PLATFORM=%2% SET UPROJECT_FILE=%~5 SET ACTIONHISTORY_FOLDER= %UPROJECT_FILE%\..\Intermediate\Build\%PLATFORM%\%PROJECT_NAME% SET ACTION_HISTORY=ActionHistory.bin SET ACTION_HISTORY_BAC=%ACTION_HISTORY%.bac SET ACTIONHISTORY_PATH="%ACTIONHISTORY_FOLDER%\%ACTION_HISTORY%" SET ACTIONHISTORY_BAC_PATH= "%ACTIONHISTORY_FOLDER%\%ACTION_HISTORY_BAC%" 

Tepat setelah instruksi popd, masukkan perintah ini:
 SET "UBT_ERR_LEVEL=!ERRORLEVEL!" SET "NEED_TO_PERFORM_ANALYSIS=" IF "!UBT_ERR_LEVEL!"=="0" ( SET "NEED_TO_PERFORM_ANALYSIS=TRUE" ) IF "!UBT_ERR_LEVEL!"=="2" ( SET "NEED_TO_PERFORM_ANALYSIS=TRUE" ) IF DEFINED NEED_TO_PERFORM_ANALYSIS ( pushd "%~dp0\..\..\Source" ECHO Running static analysis IF EXIST %ACTIONHISTORY_PATH% ( ECHO Copying %ACTION_HISTORY% to %ACTION_HISTORY_BAC% COPY %ACTIONHISTORY_PATH% %ACTIONHISTORY_BAC_PATH% ECHO Removing %ACTION_HISTORY%: %ACTIONHISTORY_PATH% DEL %ACTIONHISTORY_PATH% ) ..\..\Engine\Binaries\DotNET\UnrealBuildTool.exe %* -StaticAnalyzer=PVSStudio -DEPLOY popd SET "UBT_ERR_LEVEL=!ERRORLEVEL!" IF EXIST %ACTIONHISTORY_BAC_PATH% ( ECHO Recovering %ACTION_HISTORY% COPY %ACTIONHISTORY_BAC_PATH% %ACTIONHISTORY_PATH% ECHO Removing %ACTION_HISTORY_BAC%: %ACTIONHISTORY_BAC_PATH% DEL %ACTIONHISTORY_BAC_PATH% ) ) 

Perhatikan, bahwa variabel PROJECT_NAME, PLATFORM, dan UPROJECT_FILE, diperlukan untuk penentuan jalur path yang benar ke file cache, dapatkan nilainya dari argumen dari baris perintah Build.bat. Jika Anda memiliki urutan argumen yang berbeda, Anda harus mengubah inisialisasi ketiga variabel dengan tepat, yang dijelaskan di atas.

Analisis Proyek Tambahan melalui Modifikasi UBT


PVS-Studio dapat bekerja dalam mode analisis tambahan. Analisis tambahan dimaksudkan untuk memeriksa hanya file-file yang telah diubah sejak build terakhir. Dalam mode analisis tambahan, PVS-Studio secara otomatis dijalankan pada komputer pengembang dalam mode latar belakang tepat setelah kompilasi kode dan menganalisis semua file yang dimodifikasi. Anda dapat menemukan panduan yang lebih rinci tentang penggunaan PVS-Studio dalam mode analisis tambahan dalam dokumentasi kami.

Dengan penerapan mode analisis tambahan untuk proyek UE, semuanya sekali lagi sedikit lebih rumit daripada dalam skenario standar. Dalam hal ini, untuk dapat melakukan analisis tambahan (dengan mempertimbangkan perubahan akun dalam file .h yang disertakan), Anda harus memperkenalkan pengeditan di sistem build UBT sendiri. Untuk melakukan ini, dapatkan akses ke repositori UE di github.com dan clone ke mesin Anda. Untuk mengkustomisasi repositori hasil kloning lebih lanjut, Anda harus menyelesaikan langkah-langkah yang tercantum di bagian "Bangun dan jalankan", subbagian "Windows". Anda dapat menemukan bagian ini di halaman depan repositori resmi UE. Setelah menyiapkan repositori, Anda dapat mulai membuat perubahan di UBT. Untuk melakukan ini, ikuti jalan ini ke repositori yang dikloning: \ UnrealEngine \ Engine \ Source \ Programs \ UnrealBuildTool. Buka solusi UnrealBuildTool.sln dan temukan file PVSToolChain.cs di Solution Explorer. Dalam file ini, tambahkan baris kode berikut di kelas PVSApplicationSettings:

 /// <summary> /// Whether need incremental analysis or not /// </summary> public bool IncrementalAnalysis; 

Baris kode ini memungkinkan opsi IncrementalAnalysis dideeralisasi dari file pengaturan PVS-Studio. Jangan lupa untuk mengaktifkan mode analisis inkremental PVS-Studio itu sendiri. Untuk melakukan ini, di VS buka "Extensions" di menu utama, submenu "PVS-Studio", "Analysis after Build (Modified Files Only)", "Enabled". Sekarang tambahkan baris kode berikut setelah deklarasi variabel BaseFileName:

 // Get pvslog file FileReference OutputFileLocation = FileReference. Combine(OutputDir, BaseFileName + ".pvslog"); FileItem OutputFileItem = FileItem.GetItemByFileReference(OutputFileLocation); if (ApplicationSettings.IncrementalAnalysis && OutputFileItem.Exists) { // Get object file FileReference ObjectFileLocation = FileReference. Combine(OutputDir, BaseFileName + ".obj"); FileItem ObjectFileItem = FileItem.GetItemByFileReference(ObjectFileLocation); if (ObjectFileItem.Exists && (ObjectFileItem.LastWriteTimeUtc < OutputFileItem.LastWriteTimeUtc)) { continue; } } 

Kemudian hapus deklarasi variabel OutputFileLocation dan OutputFileItem sebelumnya di bawah ini.

Saat membangun proyek UE, file objek .obj dihasilkan untuk setiap file .cpp sumber. Analisis tambahan ini adalah semua tentang memeriksa hanya file .cpp sumber yang tanggal pembuatan / modifikasi file objeknya lebih lambat dari pada file laporan .pvslog. File .pvslog terpisah dihasilkan untuk setiap file sumber, di masa depan semua file .pvslog akan digabungkan dalam satu .pvslog final). Setelah Anda membuat perubahan di atas, buat UBT dan salin file biner yang baru dibangun ke lokasi UBT asli.

Sekarang semuanya siap, Anda akan menerima log laporan saat melakukan pembangunan proyek UE Anda, yang berisi hasil analisis hanya untuk file sumber yang dikompilasi. Ingatlah bahwa modifikasi UBT tersebut hanya masuk akal jika Anda telah memodifikasi file Build.bat sedemikian rupa sehingga menghapus file cache ActionHistory.bin (deskripsi terperinci dari skenario ini diberikan di atas). Untuk menonaktifkan mode analisis tambahan, cukup instal opsi "Analisis setelah Pembuatan (Hanya File yang Dimodifikasi)" yang dijelaskan di atas dalam mode "Nonaktif".

Izinkan saya mengingatkan Anda sekali lagi: jika Anda menginstal flag -StaticAnalyzer = PVSStudio di bidang Build Command Line di pengaturan proyek 'Properties | Configuration Properties | NMake', itu harus dihapus dalam skenario ini.

Membuka File Laporan Analyzer dan Pemuatan Otomatis ke Visual Studio


Secara default saat melakukan analisis proyek UE, file laporan tidak akan ditampilkan di jendela PVS-Studio di VS. Itu hanya disimpan relatif ke folder proyek dengan jalur berikut: \ YouProject \ Saved \ PVS-Studio \. Untuk membuka file ini dalam VS, Anda perlu menggunakan perintah berikut: 'PVS-Studio | Open / Save | Open Analysis Report' dan pilih jenis file 'Output yang tidak diurai'. Anda juga dapat membuka laporan file di program C dan C ++ Compiler Monitoring, dengan menggunakan perintah berikut: 'File | Open PVS-Studio Log' dan juga pilih jenis file 'Output yang tidak diurai'.

Ada pilihan lain yang lebih nyaman untuk membuka log laporan analisis, yang merupakan pemuatan otomatisnya di VS. Agar dapat memuat secara otomatis ke jendela PVS-Studio dalam VS setelah analisis selesai, Anda harus mengaktifkan opsi yang sesuai: 'PVS-Studio | Opsi | Pengaturan Analisis Spesifik | Hemat / Muat (laporan penganalisa) | AutoloadUnrealEngineLog' .

Unduh dan Coba PVS-Studio


Sebagai penulis artikel ini, serta salah satu dari orang-orang yang secara langsung bekerja pada implementasi dan dukungan fungsionalitas PVS-Studio terkait dengan analisis proyek, dibangun berdasarkan mesin UE, saya siap membantu pembaca . Jika Anda mengalami masalah dalam menggunakan PVS-Studio dengan proyek UE Anda atau memiliki pertanyaan setelah membaca artikel ini, saya akan senang mengobrol dengan Anda. Menulis kepada dukungan kami, saya akan menerima email tentang UE dan masalah terkait. Terima kasih atas perhatian anda

Tautan Tambahan


  1. Andrey Karpov. Pemeriksaan Unreal Engine yang Sudah Lama Ditunggu 4 . (14 April 2014)
  2. Paul Eremeev, Svyatoslav Razmyslov. Bagaimana Tim PVS-Studio Meningkatkan Kode Unreal Engine . (20 Juni 2015)
  3. Andrey Karpov. Analisis statis sebagai bagian dari proses pengembangan di Unreal Engine . (27 Juni 2017)

Source: https://habr.com/ru/post/id466477/


All Articles