PSP o'yin konsoli emulyatori misolida Travis CI-da PVS-Studio-ni qanday sozlash mumkin

PSP o'yin konsoli emulyatori misolida Travis CI-da PVS-Studio-ni qanday sozlash mumkin
Travis CI - GitHub-dan manba kodini xosting sifatida foydalanadigan dasturiy ta'minotni yaratish va sinovdan o'tkazish uchun tarqatilgan veb-xizmat. Yuqoridagi operatsion stsenariylarga qo'shimcha ravishda, keng konfiguratsiya imkoniyatlari tufayli siz o'zingizni qo'shishingiz mumkin. Ushbu maqolada biz Travis CI-ni PPSSPP kod misolidan foydalanib, PVS-Studio bilan ishlash uchun sozlaymiz.

kirish

Travis C.I. dasturiy ta'minotni yaratish va sinab ko'rish uchun veb-xizmatdir. Odatda uzluksiz integratsiya amaliyotlari bilan birgalikda ishlatiladi.

PPSSPP - PSP o'yin konsoli emulyatori. Dastur Sony PSP uchun mo'ljallangan diskdagi tasvirlardan istalgan o'yinlarni ishga tushirishga taqlid qila oladi. Dastur 1-yil 2012-noyabrda chiqarilgan. PPSSPP GPL v2 ostida litsenziyalangan. Har kim uni yaxshilashi mumkin loyihaning manba kodi.

PVS-studiyasi β€” dastur kodidagi xatolar va potentsial zaifliklarni qidirish uchun statik kod analizatori. Ushbu maqolada, o'zgartirish uchun biz PVS-Studio-ni ishlab chiquvchining mashinasida emas, balki bulutda ishga tushiramiz va PPSSPP-dagi xatolarni qidiramiz.

Travis CI o'rnatilmoqda

Bizga GitHub-da bizga kerakli loyiha joylashgan ombor, shuningdek PVS-Studio kaliti kerak bo'ladi (siz olishingiz mumkin). sinov kaliti yoki Ochiq kodli loyihalar uchun bepul).

Keling, saytga boramiz Travis C.I.. GitHub akkauntingizdan foydalangan holda avtorizatsiyadan so'ng biz omborlar ro'yxatini ko'ramiz:

PSP o'yin konsoli emulyatori misolida Travis CI-da PVS-Studio-ni qanday sozlash mumkin
Sinov uchun men PPSSPPni vilka qildim.

Biz yig'moqchi bo'lgan omborni faollashtiramiz:

PSP o'yin konsoli emulyatori misolida Travis CI-da PVS-Studio-ni qanday sozlash mumkin
Ayni paytda Travis CI loyihamizni qura olmaydi, chunki qurish bo'yicha ko'rsatmalar yo'q. Shunday qilib, konfiguratsiya vaqti keldi.

Tahlil paytida ba'zi o'zgaruvchilar biz uchun foydali bo'ladi, masalan, PVS-Studio kaliti, uni konfiguratsiya faylida ko'rsatish istalmagan. Shunday qilib, keling, Travis CI dagi qurish sozlamalari yordamida atrof-muhit o'zgaruvchilarini qo'shamiz:

PSP o'yin konsoli emulyatori misolida Travis CI-da PVS-Studio-ni qanday sozlash mumkin
Bizga kerak bo'ladi:

  • PVS_USERNAME - foydalanuvchi nomi
  • PVS_KEY - kalit
  • MAIL_USER - hisobot yuborish uchun foydalaniladigan elektron pochta
  • MAIL_PASSWORD - elektron pochta paroli

Oxirgi ikkitasi ixtiyoriy. Ular natijalarni pochta orqali yuborish uchun ishlatiladi. Agar siz hisobotni boshqa yo'l bilan tarqatmoqchi bo'lsangiz, ularni ko'rsatishingiz shart emas.

Shunday qilib, biz kerakli muhit o'zgaruvchilarini qo'shdik:

PSP o'yin konsoli emulyatori misolida Travis CI-da PVS-Studio-ni qanday sozlash mumkin
Endi fayl yaratamiz .travis.yml va uni loyihaning ildiziga joylashtiring. PPSSPP allaqachon Travis CI uchun konfiguratsiya fayliga ega edi, ammo u juda katta va misol uchun mutlaqo yaroqsiz edi, shuning uchun biz uni juda soddalashtirishimiz va faqat asosiy elementlarni qoldirishimiz kerak edi.

Birinchidan, biz virtual mashinada foydalanmoqchi bo'lgan tilni, Ubuntu Linux versiyasini va qurish uchun kerakli paketlarni ko'rsatamiz:

language: cpp
dist: xenial

addons:
  apt:
    update: true
    packages:
      - ant
      - aria2
      - build-essential
      - cmake
      - libgl1-mesa-dev
      - libglu1-mesa-dev
      - libsdl2-dev
      - pv
      - sendemail
      - software-properties-common
    sources:
      - sourceline: 'ppa:ubuntu-toolchain-r/test'
      - sourceline: 'ppa:ubuntu-sdk-team/ppa'

Ro'yxatdagi barcha paketlar faqat PPSSPP uchun kerak.

Endi biz montaj matritsasini ko'rsatamiz:

matrix:
  include:
    - os: linux
      compiler: "gcc"
      env: PPSSPP_BUILD_TYPE=Linux PVS_ANALYZE=Yes
    - os: linux
      compiler: "clang"
      env: PPSSPP_BUILD_TYPE=Linux

Bo'lim haqida bir oz ko'proq Matritsa. Travis CI-da qurish variantlarini yaratishning ikkita usuli mavjud: birinchisi, kompilyatorlar ro'yxatini, operatsion tizim turlarini, muhit o'zgaruvchilarini va boshqalarni belgilash, shundan so'ng barcha mumkin bo'lgan kombinatsiyalar matritsasi hosil bo'ladi; ikkinchisi matritsaning aniq ko'rsatkichidir. Albatta, siz ushbu ikki yondashuvni birlashtirib, noyob holatni qo'shishingiz yoki aksincha, bo'limdan foydalanib uni chiqarib tashlashingiz mumkin. chiqarib tashlash. Bu haqida ko'proq ma'lumotni o'qishingiz mumkin Travis CI hujjatlari.

Faqatgina loyiha uchun maxsus montaj ko'rsatmalarini taqdim etish qoladi:

before_install:
  - travis_retry bash .travis.sh travis_before_install

install:
  - travis_retry bash .travis.sh travis_install

script:
  - bash .travis.sh travis_script

after_success:
  - bash .travis.sh travis_after_success

Travis CI sizga virtual mashina hayotining turli bosqichlari uchun o'z buyruqlaringizni qo'shish imkonini beradi. Bo'lim o'rnatishdan oldin paketlarni o'rnatishdan oldin bajariladi. Keyin o'rnatish, bu ro'yxatdagi paketlarni o'rnatishdan keyin addons.aptbiz yuqorida aytib o'tgan edik. Yig'ilishning o'zi bo'lib o'tadi stsenariy. Agar hamma narsa yaxshi bo'lsa, biz o'zimizni topamiz muvaffaqiyatdan keyin (bu bo'limda biz statik tahlilni o'tkazamiz). Bu o'zgartirish mumkin bo'lgan barcha qadamlar emas, agar sizga ko'proq kerak bo'lsa, unda siz qarashingiz kerak Travis CI hujjatlari.

O'qish qulayligi uchun buyruqlar alohida skriptga joylashtirildi .travis.sh, u loyiha ildiziga joylashtirilgan.

Shunday qilib, bizda quyidagi fayl mavjud .travis.yml:

language: cpp
dist: xenial

addons:
  apt:
    update: true
    packages:
      - ant
      - aria2
      - build-essential
      - cmake
      - libgl1-mesa-dev
      - libglu1-mesa-dev
      - libsdl2-dev
      - pv
      - sendemail
      - software-properties-common
    sources:
      - sourceline: 'ppa:ubuntu-toolchain-r/test'
      - sourceline: 'ppa:ubuntu-sdk-team/ppa'

matrix:
  include:
    - os: linux
      compiler: "gcc"
      env: PVS_ANALYZE=Yes
    - os: linux
      compiler: "clang"

before_install:
  - travis_retry bash .travis.sh travis_before_install

install:
  - travis_retry bash .travis.sh travis_install

script:
  - bash .travis.sh travis_script

after_success:
  - bash .travis.sh travis_after_success

Paketlarni o'rnatishdan oldin biz submodullarni yangilaymiz. Bu PPSSPP qurish uchun kerak. Birinchi funktsiyani ga qo'shamiz .travis.sh (kengaytmaga e'tibor bering):

travis_before_install() {
  git submodule update --init --recursive
}

Endi biz to'g'ridan-to'g'ri Travis CI-da PVS-Studio-ni avtomatik ishga tushirishni sozlashga keldik. Avval tizimga PVS-Studio paketini o'rnatishimiz kerak:

travis_install() {
  if [ "$CXX" = "g++" ]; then
    sudo apt-get install -qq g++-4.8
  fi
  
  if [ "$PVS_ANALYZE" = "Yes" ]; then
    wget -q -O - https://files.viva64.com/etc/pubkey.txt 
      | sudo apt-key add -
    sudo wget -O /etc/apt/sources.list.d/viva64.list 
      https://files.viva64.com/etc/viva64.list  
    
    sudo apt-get update -qq
    sudo apt-get install -qq pvs-studio 
                             libio-socket-ssl-perl 
                             libnet-ssleay-perl
  fi
    
  download_extract 
    "https://cmake.org/files/v3.6/cmake-3.6.2-Linux-x86_64.tar.gz" 
    cmake-3.6.2-Linux-x86_64.tar.gz
}

Funktsiyaning boshida travis_install muhit o'zgaruvchilari yordamida kerakli kompilyatorlarni o'rnatamiz. Keyin o'zgaruvchi bo'lsa $PVS_ANALYZE qiymatini saqlaydi ha (biz buni bo'limda ko'rsatdik taxminan qurish matritsasi konfiguratsiyasi paytida), biz paketni o'rnatamiz pvs-studio. Bunga qo'shimcha ravishda, paketlar ham ko'rsatilgan libio-socket-ssl-perl ΠΈ libnet-ssleay-perl, ammo ular natijalarni pochta orqali yuborish uchun talab qilinadi, shuning uchun siz hisobotni yetkazib berishning boshqa usulini tanlagan bo'lsangiz, ular kerak emas.

vazifa download_extract belgilangan arxivni yuklaydi va ochadi:

download_extract() {
  aria2c -x 16 $1 -o $2
  tar -xf $2
}

Loyihani birlashtirish vaqti keldi. Bu bo'limda sodir bo'ladi stsenariy:

travis_script() {
  if [ -d cmake-3.6.2-Linux-x86_64 ]; then
    export PATH=$(pwd)/cmake-3.6.2-Linux-x86_64/bin:$PATH
  fi
  
  CMAKE_ARGS="-DHEADLESS=ON ${CMAKE_ARGS}"
  if [ "$PVS_ANALYZE" = "Yes" ]; then
    CMAKE_ARGS="-DCMAKE_EXPORT_COMPILE_COMMANDS=On ${CMAKE_ARGS}"
  fi
  cmake $CMAKE_ARGS CMakeLists.txt
  make
}

Aslida, bu soddalashtirilgan original konfiguratsiya, bu qatorlardan tashqari:

if [ "$PVS_ANALYZE" = "Yes" ]; then
  CMAKE_ARGS="-DCMAKE_EXPORT_COMPILE_COMMANDS=On ${CMAKE_ARGS}"
fi

Kodning ushbu qismida biz o'rnatdik smake kompilyatsiya buyruqlarini eksport qilish uchun bayroq. Bu statik kod analizatori uchun zarur. Bu haqda ko'proq maqolada o'qishingiz mumkin "PVS-Studio-ni Linux va macOS-da qanday ishga tushirish kerak".

Agar yig'ilish muvaffaqiyatli bo'lgan bo'lsa, biz bunga erishamiz muvaffaqiyatdan keyin, bu erda biz statik tahlilni amalga oshiramiz:

travis_after_success() {
  if [ "$PVS_ANALYZE" = "Yes" ]; then
    pvs-studio-analyzer credentials $PVS_USERNAME $PVS_KEY -o PVS-Studio.lic
    pvs-studio-analyzer analyze -j2 -l PVS-Studio.lic 
                                    -o PVS-Studio-${CC}.log 
                                    --disableLicenseExpirationCheck
    
    plog-converter -t html PVS-Studio-${CC}.log -o PVS-Studio-${CC}.html
    sendemail -t [email protected] 
              -u "PVS-Studio $CC report, commit:$TRAVIS_COMMIT" 
              -m "PVS-Studio $CC report, commit:$TRAVIS_COMMIT" 
              -s smtp.gmail.com:587 
              -xu $MAIL_USER 
              -xp $MAIL_PASSWORD 
              -o tls=yes 
              -f $MAIL_USER 
              -a PVS-Studio-${CC}.log PVS-Studio-${CC}.html
  fi
}

Keling, quyidagi qatorlarni batafsil ko'rib chiqaylik:

pvs-studio-analyzer credentials $PVS_USERNAME $PVS_KEY -o PVS-Studio.lic
pvs-studio-analyzer analyze -j2 -l PVS-Studio.lic 
                                -o PVS-Studio-${CC}.log 
                                --disableLicenseExpirationCheck
plog-converter -t html PVS-Studio-${CC}.log -o PVS-Studio-${CC}.html

Birinchi qator biz Travis CI muhit o'zgaruvchilarini o'rnatishda boshida ko'rsatgan foydalanuvchi nomi va kalitdan litsenziya faylini yaratadi.

Ikkinchi qator to'g'ridan-to'g'ri tahlilni boshlaydi. Bayroq -j tahlil qilish uchun iplar sonini belgilaydi, bayroq -l litsenziya, bayroqni bildiradi -o jurnallarni chiqarish uchun faylni va bayroqni belgilaydi -DisableLicenseExpirationCheck sinov versiyalari uchun talab qilinadi, chunki sukut bo'yicha pvs-studio-analizator foydalanuvchini litsenziya muddati tugashi haqida ogohlantiradi. Buning oldini olish uchun siz ushbu bayroqni belgilashingiz mumkin.

Jurnal faylida konvertatsiya qilinmasdan o'qib bo'lmaydigan xom natija mavjud, shuning uchun avval faylni o'qilishi kerak. Keling, jurnallarni o'tkazamiz plog-konvertor, va chiqish html faylidir.

Ushbu misolda men buyruq yordamida hisobotlarni pochta orqali yuborishga qaror qildim elektron pochta.

Natijada biz quyidagi faylni oldik .travis.sh:

#/bin/bash

travis_before_install() {
  git submodule update --init --recursive
}

download_extract() {
  aria2c -x 16 $1 -o $2
  tar -xf $2
}

travis_install() {
  if [ "$CXX" = "g++" ]; then
    sudo apt-get install -qq g++-4.8
  fi
  
  if [ "$PVS_ANALYZE" = "Yes" ]; then
    wget -q -O - https://files.viva64.com/etc/pubkey.txt 
      | sudo apt-key add -
    sudo wget -O /etc/apt/sources.list.d/viva64.list 
      https://files.viva64.com/etc/viva64.list  
    
    sudo apt-get update -qq
    sudo apt-get install -qq pvs-studio 
                             libio-socket-ssl-perl 
                             libnet-ssleay-perl
  fi
    
  download_extract 
    "https://cmake.org/files/v3.6/cmake-3.6.2-Linux-x86_64.tar.gz" 
    cmake-3.6.2-Linux-x86_64.tar.gz
}
travis_script() {
  if [ -d cmake-3.6.2-Linux-x86_64 ]; then
    export PATH=$(pwd)/cmake-3.6.2-Linux-x86_64/bin:$PATH
  fi
  
  CMAKE_ARGS="-DHEADLESS=ON ${CMAKE_ARGS}"
  if [ "$PVS_ANALYZE" = "Yes" ]; then
    CMAKE_ARGS="-DCMAKE_EXPORT_COMPILE_COMMANDS=On ${CMAKE_ARGS}"
  fi
  cmake $CMAKE_ARGS CMakeLists.txt
  make
}
travis_after_success() {
  if [ "$PVS_ANALYZE" = "Yes" ]; then
    pvs-studio-analyzer credentials $PVS_USERNAME $PVS_KEY -o PVS-Studio.lic
    pvs-studio-analyzer analyze -j2 -l PVS-Studio.lic 
                                    -o PVS-Studio-${CC}.log 
                                    --disableLicenseExpirationCheck
    
    plog-converter -t html PVS-Studio-${CC}.log -o PVS-Studio-${CC}.html
    sendemail -t [email protected] 
              -u "PVS-Studio $CC report, commit:$TRAVIS_COMMIT" 
              -m "PVS-Studio $CC report, commit:$TRAVIS_COMMIT" 
              -s smtp.gmail.com:587 
              -xu $MAIL_USER 
              -xp $MAIL_PASSWORD 
              -o tls=yes 
              -f $MAIL_USER 
              -a PVS-Studio-${CC}.log PVS-Studio-${CC}.html
  fi
}
set -e
set -x

$1;

Endi o'zgarishlarni git omboriga o'tkazish vaqti keldi, shundan so'ng Travis CI tuzilishni avtomatik ravishda ishga tushiradi. Qurilish hisobotlariga o'tish uchun "ppsspp" tugmasini bosing:

PSP o'yin konsoli emulyatori misolida Travis CI-da PVS-Studio-ni qanday sozlash mumkin
Biz joriy qurilishning umumiy ko'rinishini ko'ramiz:

PSP o'yin konsoli emulyatori misolida Travis CI-da PVS-Studio-ni qanday sozlash mumkin
Qurilish muvaffaqiyatli yakunlangan bo'lsa, biz statik tahlil natijalari bilan elektron pochta xabarini olamiz. Albatta, pochta orqali xabar olishning yagona usuli emas. Har qanday amalga oshirish usulini tanlashingiz mumkin. Ammo shuni yodda tutish kerakki, qurilish tugagandan so'ng virtual mashina fayllariga kirish imkoni bo'lmaydi.

Xato xulosasi

Biz eng qiyin qismni muvaffaqiyatli yakunladik. Keling, barcha harakatlarimiz bunga loyiq ekanligiga ishonch hosil qilaylik. Keling, menga pochta orqali kelgan statik tahlil hisobotidan ba'zi qiziqarli fikrlarni ko'rib chiqaylik (men buni bejiz ko'rsatmaganman).

Xavfli optimallashtirish

void sha1( unsigned char *input, int ilen, unsigned char output[20] )
{
  sha1_context ctx;

  sha1_starts( &ctx );
  sha1_update( &ctx, input, ilen );
  sha1_finish( &ctx, output );

  memset( &ctx, 0, sizeof( sha1_context ) );
}

PVS-Studio ogohlantirishi: V597 Kompilyator "sum" buferini tozalash uchun ishlatiladigan "memset" funksiya chaqiruvini o'chirib tashlashi mumkin. Shaxsiy ma'lumotlarni o'chirish uchun RtlSecureZeroMemory() funksiyasidan foydalanish kerak. sha1.cpp 325

Ushbu kod qismi xavfsiz xeshlash modulida joylashgan, ammo u jiddiy xavfsizlik kamchiligini o'z ichiga oladi (CWE-14). Debug versiyasini kompilyatsiya qilishda yaratilgan montaj ro'yxatini ko'rib chiqaylik:

; Line 355
  mov r8d, 20
  xor edx, edx
  lea rcx, QWORD PTR sum$[rsp]
  call memset
; Line 356

Hammasi tartibda va funktsiya xotira bajariladi va shu bilan RAMdagi muhim ma'lumotlarni qayta yozadi, ammo hozircha xursand bo'lmang. Optimallashtirish bilan Release versiyasining yig'ish ro'yxatini ko'rib chiqaylik:

; 354  :
; 355  :  memset( sum, 0, sizeof( sum ) );
; 356  :}

Ro'yxatdan ko'rinib turibdiki, kompilyator qo'ng'iroqni e'tiborsiz qoldirgan xotira. Bu funktsiyada mavjudligi bilan bog'liq sha1 qo'ng'iroqdan keyin xotira tuzilishga boshqa havola yo'q ctx. Shuning uchun kompilyator kelajakda foydalanilmaydigan xotirani qayta yozish uchun protsessor vaqtini behuda sarflashning ma'nosini ko'rmaydi. Funktsiyadan foydalanib, buni tuzatishingiz mumkin RtlSecureZeroMemory yoki o'xshash unga.

To'g'ri:

void sha1( unsigned char *input, int ilen, unsigned char output[20] )
{
  sha1_context ctx;

  sha1_starts( &ctx );
  sha1_update( &ctx, input, ilen );
  sha1_finish( &ctx, output );

  RtlSecureZeroMemory(&ctx, sizeof( sha1_context ) );
} 

Keraksiz taqqoslash

static u32 sceAudioOutputPannedBlocking
             (u32 chan, int leftvol, int rightvol, u32 samplePtr) {
  int result = 0;
  // For some reason, this is the only one that checks for negative.
  if (leftvol > 0xFFFF || rightvol > 0xFFFF || leftvol < 0 || rightvol < 0) {
    ....
  } else {
    if (leftvol >= 0) {
      chans[chan].leftVolume = leftvol;
    }
    if (rightvol >= 0) {
      chans[chan].rightVolume = rightvol;
    }
    chans[chan].sampleAddress = samplePtr;
    result = __AudioEnqueue(chans[chan], chan, true);
  }
}

PVS-Studio ogohlantirishi: V547 'leftvol >= 0' ifodasi har doim to'g'ri. sceAudio.cpp 120

Birinchisi uchun boshqa filialga e'tibor bering if. Kod faqat barcha shartlar mavjud bo'lganda amalga oshiriladi leftvol > 0xFFFF || rightvol > 0xFFFF || chap vol < 0 || o'ng hajmi < 0 yolg'on bo'lib chiqadi. Shunday qilib, biz boshqa filial uchun to'g'ri bo'lgan quyidagi bayonotlarni olamiz: chap ovoz <= 0xFFFF, o'ng vol <= 0xFFFF, chap vol >= 0 ΠΈ o'ng hajmi >= 0. Oxirgi ikkita bayonotga e'tibor bering. Ushbu kod qismini bajarish uchun zarur shart nima ekanligini tekshirish mantiqiymi?

Shunday qilib, biz ushbu shartli bayonotlarni xavfsiz olib tashlashimiz mumkin:

static u32 sceAudioOutputPannedBlocking
(u32 chan, int leftvol, int rightvol, u32 samplePtr) {
  int result = 0;
  // For some reason, this is the only one that checks for negative.
  if (leftvol > 0xFFFF || rightvol > 0xFFFF || leftvol < 0 || rightvol < 0) {
    ....
  } else {
    chans[chan].leftVolume = leftvol;
    chans[chan].rightVolume = rightvol;

    chans[chan].sampleAddress = samplePtr;
    result = __AudioEnqueue(chans[chan], chan, true);
  }
}

Boshqa stsenariy. Ushbu ortiqcha shartlar ortida qandaydir xato yashiringan. Ehtimol, ular nima talab qilinishini tekshirmagandirlar.

Ctrl+C Ctrl+V orqaga uriladi

static u32 scePsmfSetPsmf(u32 psmfStruct, u32 psmfData) {
  if (!Memory::IsValidAddress(psmfData) ||
      !Memory::IsValidAddress(psmfData)) {
    return hleReportError(ME, SCE_KERNEL_ERROR_ILLEGAL_ADDRESS, "bad address");
  }
  ....
}

V501 '||' ning chap va o'ng tomonida bir xil '!Memory::IsValidAddress(psmfData)' pastki ifodalari mavjud. operator. scepsmf.cpp 703

Ichki chekka e'tibor bering if. Sizningcha, manzilning haqiqiyligini tekshirib ko'rishimiz g'alati emasmi? psmfData, ikki barobar ko'pmi? Shuning uchun bu menga g'alati tuyuladi ... Aslida, bu, albatta, matn terish xatosi va g'oya ikkala kirish parametrini tekshirish edi.

To'g'ri variant:

static u32 scePsmfSetPsmf(u32 psmfStruct, u32 psmfData) {
  if (!Memory::IsValidAddress(psmfStruct) ||
      !Memory::IsValidAddress(psmfData)) {
    return hleReportError(ME, SCE_KERNEL_ERROR_ILLEGAL_ADDRESS, "bad address");
  }
  ....
}

Unutilgan o'zgaruvchi

extern void ud_translate_att(
  int size = 0;
  ....
  if (size == 8) {
    ud_asmprintf(u, "b");
  } else if (size == 16) {
    ud_asmprintf(u, "w");
  } else if (size == 64) {
    ud_asmprintf(u, "q");
  }
  ....
}

PVS-Studio ogohlantirishi: V547 'size == 8' ifodasi har doim noto'g'ri. syn-att.c 195

Ushbu xato jildda joylashgan ext, shuning uchun loyihaga haqiqatan ham tegishli emas, lekin xato men buni sezmasdan oldin topildi, shuning uchun men uni tark etishga qaror qildim. Axir, ushbu maqola xatolarni ko'rib chiqish haqida emas, balki Travis CI bilan integratsiya haqida emas va analizatorning konfiguratsiyasi amalga oshirilmagan.

Argumentlar hajmi konstanta tomonidan ishga tushiriladi, lekin u operatorgacha kodda umuman ishlatilmaydi if, bu, albatta, beradi yolg'on shartlarni tekshirishda, chunki biz eslaganimizdek, hajmi nolga teng. Keyingi tekshiruvlar ham mantiqiy emas.

Ko'rinishidan, kod fragmenti muallifi o'zgaruvchining ustiga yozishni unutgan hajmi bundan oldin.

To'xta

Bu erda biz xatolar bilan yakunlanamiz. Ushbu maqolaning maqsadi PVS-Studio kompaniyasining Travis CI bilan birgalikda ishini namoyish qilish va loyihani iloji boricha chuqur tahlil qilmaslikdir. Agar siz kattaroq va chiroyliroq xatolarni xohlasangiz, ularni har doim hayratda qoldirishingiz mumkin shu yerda :).

xulosa

Loyihalarni yaratish uchun veb-xizmatlardan foydalanish, qo'shimcha tahlil amaliyoti bilan birgalikda kodni birlashtirgandan so'ng darhol ko'plab muammolarni topishga imkon beradi. Biroq, bitta tuzilish etarli bo'lmasligi mumkin, shuning uchun statik tahlil bilan birgalikda testni o'rnatish kod sifatini sezilarli darajada yaxshilaydi.

Foydali havolalar

PSP o'yin konsoli emulyatori misolida Travis CI-da PVS-Studio-ni qanday sozlash mumkin

Agar siz ushbu maqolani ingliz tilida so'zlashuvchi auditoriya bilan baham ko'rishni istasangiz, iltimos, tarjima havolasidan foydalaning: Maksim Zvyagintsev. PSP o'yin konsoli emulyatori misolida Travis CI-da PVS-Studio-ni qanday sozlash mumkin.

Manba: www.habr.com

a Izoh qo'shish