Maitiro ekugadzirisa PVS-Studio muTravis CI uchishandisa muenzaniso wePSP yemutambo console emulator

Maitiro ekugadzirisa PVS-Studio muTravis CI uchishandisa muenzaniso wePSP yemutambo console emulator
Travis CI ibasa rewebhu rakagoverwa yekuvaka uye yekuyedza software inoshandisa GitHub sesosi kodhi yekutambira. Kuwedzera kune ari pamusoro ekushanda mamiriro, iwe unogona kuwedzera yako yekutenda kune yakakura magadzirirwo sarudzo. Muchikamu chino tichagadzirisa Travis CI kushanda nePVS-Studio tichishandisa PPSSPP kodhi muenzaniso.

Nhanganyaya

Travis C.I. ibasa rewebhu rekuvaka nekuyedza software. Inowanzoshandiswa pamwe chete nekuenderera mberi kwekubatanidza maitiro.

PPSSPP - PSP mutambo console emulator. Iyo purogiramu inokwanisa kutevedzera kutangwa kwemitambo chero ipi zvayo kubva kumifananidzo yedhisiki yakagadzirirwa Sony PSP. Chirongwa chakaburitswa munaNovember 1, 2012. PPSSPP ine rezinesi pasi peGPL v2. Chero ani zvake anogona kugadzirisa project source code.

PVS Studio - static code analyzer yekutsvaga zvikanganiso uye zvinogona kukanganisa mukodhi yepurogiramu. Muchinyorwa chino, chekuchinja, isu tichavhura PVS-Studio kwete munharaunda pamushini wemugadziri, asi mugore, uye tarisa zvikanganiso muPPSSPP.

Kugadzira Travis CI

Tichada repository paGitHub, uko chirongwa chatinoda chiripo, pamwe nekiyi yePVS-Studio (unogona kuwana kiyi yekuedza kana mahara kune Open Source mapurojekiti).

Handei kune saiti Travis C.I.. Mushure memvumo uchishandisa yako GitHub account, isu tichaona runyorwa rwezvinyorwa:

Maitiro ekugadzirisa PVS-Studio muTravis CI uchishandisa muenzaniso wePSP yemutambo console emulator
Paye bvunzo, ndakaforoma PPSSPP.

Isu tinomisa iyo repository yatinoda kuunganidza:

Maitiro ekugadzirisa PVS-Studio muTravis CI uchishandisa muenzaniso wePSP yemutambo console emulator
Parizvino, Travis CI haigone kuvaka chirongwa chedu nekuti hapana mirairo yekuvaka. Saka yave nguva yekugadzirisa.

Munguva yekuongorora, zvimwe zvinosiyana zvichatibatsira, semuenzaniso, kiyi yePVS-Studio, izvo zvingave zvisina kufanira kutsanangura mufaira rekugadzirisa. Saka ngatiwedzerei nharaunda dzakasiyana tichishandisa zvigadziriso zvekuvaka muTravis CI:

Maitiro ekugadzirisa PVS-Studio muTravis CI uchishandisa muenzaniso wePSP yemutambo console emulator
Tichada:

  • PVS_USERNAME - zita rekushandisa
  • PVS_KEY - kiyi
  • MAIL_USER - email ichashandiswa kutumira irori
  • MAIL_PASSWORD - email password

Iwo maviri ekupedzisira ndeokusarudza. Izvi zvichashandiswa kutumira mhinduro netsamba. Kana uchida kugovera mushumo neimwe nzira, haufaniri kuvaratidza.

Saka, isu takawedzera nharaunda dzakasiyana dzatinoda:

Maitiro ekugadzirisa PVS-Studio muTravis CI uchishandisa muenzaniso wePSP yemutambo console emulator
Zvino ngatigadzirirei faira .travis.yml woiisa mumudzi wepurojekiti. PPSSPP yainge yatove nefaira yekumisikidza yeTravis CI, zvisinei, yaive yakakura uye isingakodzeri zvachose kumuenzaniso, saka taifanira kurerutsa zvakanyanya uye kusiya chete zvinhu zvakakosha.

Kutanga, ngatiratidze mutauro, vhezheni yeUbuntu Linux yatinoda kushandisa mumushini chaiwo, uye mapakeji anodiwa ekuvaka:

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'

Ese mapakeji akanyorwa anodiwa chete kuPPSSPP.

Iye zvino tinoratidza matrix yegungano:

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

Zvimwe zvishoma pamusoro pechikamu matrix. MuTravis CI, kune nzira mbiri dzekugadzira sarudzo dzekuvaka: yekutanga ndeyekutsanangura rondedzero yevagadziri, mhando dzemashandisirwo emhando, shanduko yemamiriro ekunze, nezvimwe, mushure mezvo matrix ezvese zvinosanganiswa zvinogadzirwa; yechipiri chiratidzo chakajeka chematrix. Ehe, iwe unogona kusanganisa nzira mbiri idzi uye wowedzera yakasarudzika kesi, kana, zvinopesana, isaisanganise uchishandisa chikamu. kusanganisa. Unogona kuverenga zvakawanda pamusoro peizvi mu Travis CI zvinyorwa.

Chinosara ndechekupa mirairo yegungano-yakananga:

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 inokutendera kuti uwedzere yako mirairo yematanho akasiyana ehupenyu hwemuchina chaiwo. Chikamu before_install kuurayiwa usati waisa mapakeji. Zvadaro install, iyo inotevera kuiswa kwemapakeji kubva pane rondedzero addons.aptzvataratidza pamusoro. Gungano pacharo rinoitwa mukati chinyorwa. Kana zvese zvikafamba zvakanaka, tinozviwana tapinda after_success (muchikamu chino tichamhanya static analysis). Aya haasi ese matanho anogona kugadziridzwa, kana iwe uchida mamwe, saka iwe unofanirwa kutarisa mukati Travis CI zvinyorwa.

Kuti zvive nyore kuverenga, mirairo yakaiswa mune imwe script .travis.sh, iyo inoiswa pamudzi weprojekti.

Saka tine faira inotevera .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

Tisati taisa mapakeji, isu tichavandudza ma submodules. Izvi zvinodiwa kuvaka PPSSPP. Ngatiwedzerei basa rekutanga ku .travis.sh (cherechedza kuwedzera):

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

Iye zvino tauya zvakananga kumisikidza otomatiki kuvhurwa kwePVS-Studio muTravis CI. Kutanga isu tinoda kuisa iyo PVS-Studio package pane system:

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
}

Pakutanga kwebasa travis_install isu tinoisa ma compilers atinoda tichishandisa zvakatipoteredza zvakasiyana. Zvino kana shanduko $PVS_ANALYZE zvitoro kukosha Ehe (takazviratidzira muchikamu approx panguva yekuvaka matrix kumisikidzwa), isu tinoisa iyo package pvs-studio. Pamusoro peizvi, mapakeji anoratidzwa zvakare libio-socket-ssl-perl ΠΈ libnet-ssleay-perl, zvisinei, ivo vanodiwa pamibairo yekutumira, saka ivo havafanirwe kana wakasarudza imwe nzira yekuendesa mushumo wako.

shanda download_extract kudhawunirodha uye kusunungura iyo yakatsanangurwa archive:

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

Yasvika nguva yekuisa chirongwa pamwe chete. Izvi zvinoitika muchikamu chinyorwa:

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
}

Muchokwadi, iyi igadziriso yakarerutswa yepakutanga, kunze kweiyi mitsetse:

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

Muchikamu chino chekodhi tinoisa cmake mureza wekutumira kunze mirairo yekubatanidza. Izvi zvinodikanwa kune static code analyzer. Unogona kuverenga zvakawanda pamusoro peizvi mune chinyorwa "Maitiro ekumhanyisa PVS-Studio paLinux uye macOS".

Kana gungano rakabudirira, saka tinosvika after_success, kwatinoita static analysis:

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
}

Ngatitarisei pamitsetse inotevera:

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

Mutsetse wekutanga unoburitsa rezinesi faira kubva kuzita rekushandisa uye kiyi yatakatsanangura pakutanga chaipo pakumisikidza iyo Travis CI nharaunda inosiyana.

Mutsara wechipiri unotanga kuongorora zvakananga. Flag -j inoseta nhamba yeshinda dzekuongorora, mureza -l inoratidza rezinesi, mureza -o inotsanangura faira rekuburitsa matanda, uye mureza -dzimaLicenseExpirationCheck inodiwa kune vhezheni dzekuyedza, kubva nekusarudzika pvs-studio-analyzer ichayambira mushandisi kuti rezinesi rava kuda kupera. Kuti izvi zvisaitike, unogona kudoma mureza uyu.

Iyo faira regi ine yakaomeswa yakabuda isingagone kuverengwa pasina kutendeuka, saka unofanira kutanga waita kuti faira riverengeke. Ngatipfuurei matanda purogi-inoshandura, uye zvakabuda ndeye html faira.

Mumuenzaniso uyu, ndakafunga kutumira mishumo netsamba ndichishandisa murairo sendmail.

Somugumisiro, takawana faira inotevera .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;

Iye zvino yave nguva yekusundidzira shanduko kune git repository, mushure meizvozvo Travis CI inozomhanyisa kuvaka. Dzvanya pa "ppsspp" kuenda kumishumo yekuvaka:

Maitiro ekugadzirisa PVS-Studio muTravis CI uchishandisa muenzaniso wePSP yemutambo console emulator
Tichaona mhedziso yezvino kuvaka:

Maitiro ekugadzirisa PVS-Studio muTravis CI uchishandisa muenzaniso wePSP yemutambo console emulator
Kana iyo kuvaka ikapedzwa zvinobudirira, isu tinogashira email ine mhedzisiro ye static ongororo. Chokwadika, kutumira tsamba handiyo nzira bedzi yokugamuchira nayo mushumo. Iwe unogona kusarudza chero nzira yekushandisa. Asi zvakakosha kuyeuka kuti mushure mekuvaka kwapera, hazvizogoneke kuwana iyo chaiyo muchina mafaera.

Mhosho muchidimbu

Takabudirira kupedza chikamu chakaoma zvikuru. Zvino ngativei nechokwadi chokuti kuedza kwedu kwose kwakakodzera. Ngatitarisei mamwe mapoinzi anonakidza kubva kune static yekuongorora rondedzero yakauya kwandiri nepositi (yakanga isiri pasina iyo yandakaratidza).

Dangerous optimization

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 yambiro: V597 Iyo compiler inogona kudzima iyo 'memset' basa rekufona, iro rinoshandiswa kutsvaira 'sum' buffer. Iyo RtlSecureZeroMemory() basa rinofanirwa kushandiswa kudzima iyo yakavanzika data. sha1.cpp 325

Ichi chidimbu chekodhi chiri mune yakachengeteka hashing module, zvisinei, ine yakakomba kuchengetedza kukanganisa (CWE-14) Ngatitarisei rondedzero yegungano iyo inogadzirwa paunenge uchigadzira iyo Debug vhezheni:

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

Zvese zvakarongeka uye basa racho memeset inourayiwa, nekudaro ichinyora yakakosha data mu RAM, zvisinei, usafare izvozvi. Ngatitarisei pagungano rondedzero yeRelease vhezheni ne optimization:

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

Sezvinoonekwa kubva pane rondedzero, mugadziri akafuratira kufona memeset. Izvi zvinokonzerwa nekuti mune basa sha1 mushure mekufona memeset hapasisina chirevo chechimiro ctx. Naizvozvo, iyo compiler haioni chikonzero chekutambisa processor nguva kunyora ndangariro iyo isingashandiswe mune ramangwana. Iwe unogona kugadzirisa izvi nekushandisa basa RtlSecureZeroMemory kana zvakafanana kwaari.

Zvakarurama:

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

Kuenzanisa kusingakoshi

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 yambiro: V547 Kutaura 'leftvol>= 0' ndeyechokwadi nguva dzose. sceAudio.cpp 120

Teerera kune rimwe bazi rekutanga if. Iyo kodhi ichaitwa chete kana mamiriro ese leftvol > 0xFFFF || rightvol > 0xFFFF || leftvol < 0 || rightvol <0 zvichava zvenhema. Naizvozvo, tinowana zvirevo zvinotevera, izvo zvichave zvechokwadi kune rimwe bazi: leftvol <= 0xFFFF, rightvol <= 0xFFFF, leftvol > = 0 ΠΈ rightvol>= 0. Cherechedza zvirevo zviviri zvekupedzisira. Zvine musoro here kutarisa kuti chii chinodiwa mamiriro ekuitwa kweiyi chidimbu chekodhi?

Saka isu tinokwanisa kubvisa zvakachengeteka izvi zvirevo zvine zvirevo:

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

Chimwe chiitiko. Pane imwe mhando yekukanganisa yakavanzwa kuseri kwezvisina basa izvi. Pamwe havana kutarisa zvaidiwa.

Ctrl+C Ctrl+V Inorova Kumashure

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 Pane madiki-mazwi akafanana '!Memory::IsValidAddress(psmfData)' kuruboshwe uye kurudyi rwe'||' opareta. scePsmf.cpp 703

Nyatsoteerera cheki mukati if. Haufungi here kuti zvinoshamisa kuti titarise kana kero iriko? psmfData, zvakapetwa kaviri? Saka izvi zvinoita sezvisinganzwisisike kwandiri... Muchokwadi, izvi ndezvechokwadi, typo, uye pfungwa yaive yekutarisa ese ari maviri ekuisa paramita.

Sarudzo chaiyo:

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

Kukanganwa chinja

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 yambiro: V547 Tsanangudzo 'saizi == 8' ndeyenhema nguva dzose. syn-att.c 195

Kukanganisa uku kuri mufolder ext, saka haina kunyatsoenderana nebasa, asi bug yakawanikwa ndisati ndazviona, saka ndakasarudza kuisiya. Mushure mezvose, chinyorwa ichi hachisi chekuongorora zvikanganiso, asi nezvekubatanidza neTravis CI, uye hapana kugadziridzwa kweanalyzer kwakaitwa.

Variable zera inotangwa neanogara, zvisinei, haisati yashandiswa zvachose mukodhi, kusvika pasi kune opareta if, izvo, zvechokwadi, zvinopa venhema tichitarisa mamiriro acho, nekuti, sezvatinorangarira, zera zvakaenzana ne zero. Macheki anotevera zvakare haana musoro.

Sezviri pachena, munyori weiyo code fragment akakanganwa kupfuudza shanduko zera zvisati zvaitika.

mira

Apa ndipo patingazopedzisira nekukanganisa. Chinangwa chechinyorwa chino ndechekuratidza basa rePVS-Studio pamwe chete naTravis CI, uye kwete kuongorora chirongwa ichi zvakanyanya sezvinobvira. Kana iwe uchida zvikanganiso zvakakura uye zvakanyanya kunaka, unogona kugara uchiyemura pano :).

mhedziso

Kushandisa webhu masevhisi kuvaka mapurojekiti pamwe chete netsika yekuwedzera ongororo inobvumidza iwe kuwana akawanda matambudziko nekukurumidza mushure mekubatanidza kodhi. Nekudaro, imwe kuvaka inogona kunge isina kukwana, saka kumisikidza kuyedzwa pamwe chete ne static kuongororwa kuchavandudza zvakanyanya kunaka kwekodhi.

Useful links

Maitiro ekugadzirisa PVS-Studio muTravis CI uchishandisa muenzaniso wePSP yemutambo console emulator

Kana iwe uchida kugovera chinyorwa ichi nevateereri vanotaura Chirungu, tapota shandisa shanduro yekushandura: Maxim Zvyagintsev. Maitiro ekumisikidza PVS-Studio muTravis CI uchishandisa muenzaniso wePSP game console emulator.

Source: www.habr.com

Voeg