Momwe mungasinthire PVS-Studio mu Travis CI pogwiritsa ntchito chitsanzo cha PSP game console emulator

Momwe mungasinthire PVS-Studio mu Travis CI pogwiritsa ntchito chitsanzo cha PSP game console emulator
Travis CI ndi ntchito yogawidwa yapaintaneti yomanga ndi kuyesa mapulogalamu omwe amagwiritsa ntchito GitHub monga gwero la code host. Kuphatikiza paziwonetsero zomwe zili pamwambapa, mutha kuwonjezera zikomo zanu pazosankha zambiri zosinthira. M'nkhaniyi tikonza Travis CI kuti igwire ntchito ndi PVS-Studio pogwiritsa ntchito chitsanzo cha PPSSPP code.

Mau oyamba

Travis CI ndi ntchito yapaintaneti yomanga ndi kuyesa mapulogalamu. Kawirikawiri amagwiritsidwa ntchito pamodzi ndi machitidwe ophatikizana mosalekeza.

PPSSPP - PSP game console emulator. Pulogalamuyi imatha kutsanzira kukhazikitsidwa kwamasewera aliwonse kuchokera pazithunzi za disk zomwe zimapangidwira Sony PSP. Pulogalamuyi idatulutsidwa pa Novembara 1, 2012. PPSSPP ili ndi chilolezo pansi pa GPL v2. Aliyense akhoza kusintha kodi source source.

Zithunzi za PVS Studio - static code analyzer posaka zolakwika ndi zovuta zomwe zingakhalepo mu code code. M'nkhaniyi, kuti tisinthe, tidzayambitsa PVS-Studio osati kwanuko pamakina opanga mapulogalamu, koma mumtambo, ndikuyang'ana zolakwika mu PPSSPP.

Kukhazikitsa Travis CI

Tidzafunika posungira pa GitHub, pomwe polojekiti yomwe tikufuna ili, komanso kiyi ya PVS-Studio (mutha kupeza kiyi yoyeserera kapena zaulere pama projekiti a Open Source).

Tiyeni tipite kutsambali Travis CI. Pambuyo pa chilolezo chogwiritsa ntchito akaunti yanu ya GitHub, tiwona mndandanda wazosungira:

Momwe mungasinthire PVS-Studio mu Travis CI pogwiritsa ntchito chitsanzo cha PSP game console emulator
Pakuyesa, ndinafowola PPSSPP.

Timatsegula nkhokwe yomwe tikufuna kutolera:

Momwe mungasinthire PVS-Studio mu Travis CI pogwiritsa ntchito chitsanzo cha PSP game console emulator
Pakalipano, Travis CI sangathe kumanga polojekiti yathu chifukwa palibe malangizo omanga. Ndiye nthawi yoti kasinthidwe.

Pakuwunika, zosintha zina zitha kukhala zothandiza kwa ife, mwachitsanzo, kiyi ya PVS-Studio, yomwe ingakhale yosafunikira kufotokoza mufayilo yosinthira. Chifukwa chake tiyeni tiwonjezere zosintha zachilengedwe pogwiritsa ntchito makonda omanga mu Travis CI:

Momwe mungasinthire PVS-Studio mu Travis CI pogwiritsa ntchito chitsanzo cha PSP game console emulator
Tidzafunika:

  • PVS_USERNAME - dzina lolowera
  • PVS_KEY - kiyi
  • MAIL_USER - imelo yomwe idzagwiritsidwe ntchito kutumiza lipoti
  • MAIL_PASSWORD - imelo achinsinsi

Awiri omaliza ndi osankha. Izi zidzagwiritsidwa ntchito kutumiza zotsatira ndi makalata. Ngati mukufuna kugawa lipotilo mwanjira ina, simuyenera kuwawonetsa.

Chifukwa chake, tawonjezera zosintha zachilengedwe zomwe tikufuna:

Momwe mungasinthire PVS-Studio mu Travis CI pogwiritsa ntchito chitsanzo cha PSP game console emulator
Tsopano tiyeni tipange fayilo .travis.yml ndi kuziyika muzu wa polojekiti. PPSSPP inali kale ndi fayilo yosinthika ya Travis CI, komabe, inali yaikulu kwambiri komanso yosayenerera mwachitsanzo, kotero tinayenera kuifewetsa kwambiri ndikusiya zinthu zokhazokha.

Choyamba, tiyeni tiwonetse chilankhulo, mtundu wa Ubuntu Linux womwe tikufuna kugwiritsa ntchito pamakina enieni, ndi phukusi lofunikira pakumanga:

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'

Maphukusi onse omwe adalembedwa amafunikira PPSSPP yokha.

Tsopano tikuwonetsa matrix a msonkhano:

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

Zambiri za gawoli Matrix. Mu Travis CI, pali njira ziwiri zopangira zosankha zomangira: yoyamba ndiyo kufotokoza mndandanda wa ophatikiza, mitundu ya machitidwe ogwiritsira ntchito, kusintha kwa chilengedwe, ndi zina zotero, pambuyo pake matrix a zosakaniza zonse zomwe zingatheke amapangidwa; chachiwiri ndi chisonyezero chomveka bwino cha matrix. Zachidziwikire, mutha kuphatikiza njira ziwirizi ndikuwonjezera vuto lapadera, kapena, m'malo mwake, kusiya kugwiritsa ntchito gawoli. sungani. Mutha kuwerenga zambiri za izi mu Zolemba za Travis CI.

Zomwe zatsala ndikungopereka malangizo okhudzana ndi msonkhano:

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 imakulolani kuti muwonjezere malamulo anu pazigawo zosiyanasiyana za moyo wa makina enieni. Gawo before_install anaphedwa pamaso khazikitsa phukusi. Ndiye kukhazikitsa, zomwe zimatsatira kuyika kwa phukusi kuchokera pamndandanda addons.aptzomwe taziwonetsa pamwambapa. Msonkhano womwewo umachitikira script. Ngati zonse zidayenda bwino, ndiye kuti tidzipeza tokha pambuyo_kupambana (ndi m'gawo lino kuti tidzayendetsa static analysis). Izi sizinthu zonse zomwe zingasinthidwe, ngati mukufuna zina, muyenera kuyang'ana mkati Zolemba za Travis CI.

Kuti muwerenge mosavuta, malamulowo adayikidwa m'malemba osiyana .travis.sh, yomwe imayikidwa muzu wa polojekiti.

Chifukwa chake tili ndi fayilo yotsatirayi .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

Tisanakhazikitse phukusi, tidzasintha ma submodule. Izi ndizofunikira kuti mupange PPSSPP. Tiyeni tiwonjezere ntchito yoyamba .travis.sh (onani zowonjezera):

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

Tsopano tabwera mwachindunji kukhazikitsa kukhazikitsidwa kwa PVS-Studio ku Travis CI. Choyamba tiyenera kukhazikitsa phukusi la PVS-Studio pa dongosolo:

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
}

Kumayambiriro kwa ntchito travis_install timayika ma compiler omwe timafunikira pogwiritsa ntchito zosintha zachilengedwe. Ndiye ngati variable $PVS_ANALYZE masitolo mtengo inde (tidaziwonetsa mu gawo kutumiza pakukonzekera matrix), timayika phukusi pvs studio. Kuphatikiza pa izi, mapaketi amawonetsedwanso libio-socket-ssl-perl ΠΈ libnet-ssleay-perl, komabe, amafunikira pazotsatira zamakalata, kotero sizofunika ngati mwasankha njira ina yoperekera lipoti lanu.

ntchito download_extract kutsitsa ndikutsegula zakale zomwe zatchulidwa:

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

Yakwana nthawi yoti tigwirizane. Izi zimachitika mu gawo script:

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
}

M'malo mwake, uku ndikusintha koyambirira kosavuta, kupatula mizere iyi:

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

Mu gawo ili la code timakhazikitsa cme mbendera yotumizira malamulo ophatikiza. Izi ndizofunikira pa static code analyzer. Mutha kuwerenga zambiri za izi m'nkhani yakuti "Momwe mungayendetsere PVS-Studio pa Linux ndi macOS".

Ngati msonkhanowo wapambana, ndiye kuti tifika pambuyo_kupambana, komwe timayesa static:

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
}

Tiyeni tiwone bwinobwino mizere iyi:

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

Mzere woyamba umapanga fayilo ya laisensi kuchokera ku dzina lolowera ndi kiyi yomwe tidatchula koyambirira pomwe tikukhazikitsa zosintha za Travis CI.

Mzere wachiwiri umayamba kusanthula mwachindunji. Mbendera -j imayika kuchuluka kwa ulusi wounika, mbendera -l limasonyeza chilolezo, mbendera -o imatanthauzira fayilo yotulutsa zipika, ndi mbendera -DibleLicenseExpirationCheck zofunikira pamitundu yoyeserera, popeza mwachisawawa pvs-studio-analyzer adzachenjeza wogwiritsa ntchito kuti chilolezo chatsala pang'ono kutha. Kuti izi zisachitike, mutha kufotokoza mbendera iyi.

Fayilo ya chipika ili ndi zotulutsa zosawerengeka zomwe sizingawerengedwe popanda kutembenuka, chifukwa chake muyenera kupanga fayiloyo kuwerengedwa. Tiyeni tidutse zipika pulagi-otembenuza, ndipo zotsatira zake ndi fayilo ya html.

Muchitsanzo ichi, ndinaganiza zotumiza malipoti pamakalata pogwiritsa ntchito lamulo sendmail.

Zotsatira zake, tapeza fayilo yotsatirayi .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;

Tsopano ndi nthawi yoti musunthire zosintha ku git repository, pambuyo pake Travis CI idzayendetsa yokha kumanga. Dinani pa "ppsspp" kuti mupite ku malipoti omanga:

Momwe mungasinthire PVS-Studio mu Travis CI pogwiritsa ntchito chitsanzo cha PSP game console emulator
Tikuwona mwachidule za zomangamanga zomwe zilipo:

Momwe mungasinthire PVS-Studio mu Travis CI pogwiritsa ntchito chitsanzo cha PSP game console emulator
Ngati kumangako kumalizidwa bwino, tidzalandira imelo ndi zotsatira za kusanthula kwa static. Inde, kutumiza makalata si njira yokhayo yolandirira lipoti. Mutha kusankha njira iliyonse yoyendetsera. Koma ndikofunikira kukumbukira kuti ntchitoyo ikamalizidwa, sikungatheke kupeza mafayilo amakina enieni.

Chidule cha zolakwika

Tamaliza bwinobwino gawo lovuta kwambiri. Tsopano tiyeni tionetsetse kuti khama lathu lonse n’lofunika. Tiyeni tiwone mfundo zochititsa chidwi kuchokera ku lipoti losasunthika lomwe lidabwera kwa ine kudzera pamakalata (sizinali pachabe zomwe ndidaziwonetsa).

Kukhathamiritsa kowopsa

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 ) );
}

Chenjezo la PVS-Studio: V597 Wopangayo atha kufufuta foni ya 'memset', yomwe imagwiritsidwa ntchito kutsitsa buffer ya 'sum'. Ntchito ya RtlSecureZeroMemory() iyenera kugwiritsidwa ntchito kufufuta zachinsinsi. sha1.cpp 325

Chidutswa ichi chili mu gawo lotetezedwa la hashing, komabe, lili ndi vuto lalikulu lachitetezo (CWE-14). Tiyeni tiwone mndandanda wamagulu omwe amapangidwa popanga mtundu wa Debug:

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

Chilichonse chili mwadongosolo komanso ntchito yake memeset imachitidwa, potero imachotsa zofunikira mu RAM, komabe, musasangalale panobe. Tiyeni tiwone mndandanda wamtundu wa Release ndi kukhathamiritsa:

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

Monga tikuwonera pamndandanda, wophatikizayo adanyalanyaza kuyimba memeset. Ichi ndi chifukwa chakuti mu ntchito sha1 atatha kuyimba memeset palibenso kufotokoza za kapangidwe ctx pa. Chifukwa chake, wopangayo sawona chifukwa chowononga nthawi ya purosesa ndikulemba kukumbukira komwe sikudzagwiritsidwa ntchito mtsogolo. Mutha kukonza izi pogwiritsa ntchito ntchitoyi RtlSecureZeroMemory kapena chimodzimodzi kwa iye.

Molondola:

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 ) );
} 

Kuyerekezera kosafunika

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);
  }
}

Chenjezo la PVS-Studio: V547 Mawu akuti 'leftvol>= 0' ndi oona nthawi zonse. sceAudio.cpp 120

Samalani ndi nthambi ina yoyamba if. Code idzachitidwa pokhapokha ngati zikhalidwe zonse leftvol> 0xFFFF || rightvol> 0xFFFF || leftvol <0 || rightvol <0 zidzasanduka zabodza. Chifukwa chake, timapeza mawu otsatirawa, omwe angakhale owona ku nthambi ina: leftvol <= 0xFFFF, rightvol <= 0xFFFF, leftvol = 0 ΠΈ mphamvu > = 0. Taonani ziganizo ziwiri zomaliza. Kodi n'zomveka kuyang'ana chomwe chiri chofunikira pakukwaniritsidwa kwa kachidutswa kameneka?

Chifukwa chake titha kuchotsa mosamala mawu awa:

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);
  }
}

Zochitika zina. Pali mtundu wina wa zolakwika zomwe zabisika kuseri kwa zinthu zosafunikira izi. Mwina sanaone zimene zinkafunika.

Ctrl+C Ctrl+V Kumenya Mmbuyo

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 Pali mawu ang'onoang'ono ofanana '!Memory::IsValidAddress(psmfData)' kumanzere ndi kumanja kwa '||' woyendetsa. scePsmf.cpp 703

Samalani cheke mkati if. Kodi simukuganiza kuti ndizodabwitsa kuti tiyang'ane ngati adilesiyo ndi yovomerezeka? psmfData, kuwirikiza kawiri? Kotero izi zikuwoneka zachilendo kwa ine ... Ndipotu izi, ndithudi, typo, ndipo lingaliro linali loyang'ana magawo onse olowetsamo.

Njira yolondola:

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

Mwayiwala kusintha

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");
  }
  ....
}

Chenjezo la PVS-Studio: V547 Mawu akuti 'size == 8' nthawi zonse amakhala zabodza. syn-att.c 195

Vutoli lili mufoda p, kotero sizinali zogwirizana ndi polojekitiyi, koma cholakwikacho chinapezeka ndisanachizindikire, kotero ndinaganiza zochisiya. Kupatula apo, nkhaniyi sikunena za kuwunika zolakwika, koma za kuphatikiza ndi Travis CI, ndipo palibe kasinthidwe ka analyzer.

Zosiyanasiyana kukula imayambitsidwa ndi nthawi zonse, komabe, sichigwiritsidwa ntchito konse mu code, mpaka kwa woyendetsa if, zomwe, ndithudi, zimapereka zabodza poyang'ana zikhalidwe, chifukwa, monga tikukumbukira, kukula zofanana ndi ziro. Kufufuza kotsatira sikumvekanso.

Mwachiwonekere, wolemba kachidutswa ka code anaiwala kubwereza kusintha kukula zisanachitike.

Imani

Apa ndi pamene ife mwina mapeto ndi zolakwa. Cholinga cha nkhaniyi ndikuwonetsa ntchito ya PVS-Studio pamodzi ndi Travis CI, osati kusanthula pulojekitiyo mokwanira momwe mungathere. Ngati mukufuna zolakwika zazikulu komanso zokongola, mutha kuzisilira nthawi zonse apa :).

Pomaliza

Kugwiritsa ntchito mautumiki apaintaneti kuti mumange mapulojekiti limodzi ndi kusanthula kowonjezereka kumakupatsani mwayi wopeza zovuta zambiri mukangophatikiza ma code. Komabe, kumanga kumodzi sikungakhale kokwanira, kotero kukhazikitsa kuyesa pamodzi ndi kusanthula kwa static kudzasintha kwambiri khalidwe la code.

maulalo othandiza

Momwe mungasinthire PVS-Studio mu Travis CI pogwiritsa ntchito chitsanzo cha PSP game console emulator

Ngati mukufuna kugawana nkhaniyi ndi omvera olankhula Chingerezi, chonde gwiritsani ntchito ulalo womasulira: Maxim Zvyagintsev. Momwe mungakhazikitsire PVS-Studio mu Travis CI pogwiritsa ntchito chitsanzo cha PSP game console emulator.

Source: www.habr.com

Kuwonjezera ndemanga