Kif tikkonfigura PVS-Studio f'Travis CI billi tuża l-eżempju ta' emulatur tal-console tal-logħob PSP

Kif tikkonfigura PVS-Studio f'Travis CI billi tuża l-eżempju ta' emulatur tal-console tal-logħob PSP
Travis CI huwa servizz tal-web imqassam għall-bini u l-ittestjar ta’ softwer li juża GitHub bħala hosting tal-kodiċi tas-sors. Minbarra x-xenarji operattivi ta 'hawn fuq, tista' żżid tiegħek grazzi għall-għażliet ta 'konfigurazzjoni estensivi. F'dan l-artikolu aħna ser tikkonfigura Travis CI biex taħdem ma 'PVS-Studio billi tuża l-eżempju tal-kodiċi PPSSPP.

Introduzzjoni

Travis C.I. huwa servizz tal-web għall-bini u l-ittestjar tas-softwer. Normalment jintuża flimkien ma 'prattiki ta' integrazzjoni kontinwa.

PPSSPP - PSP game console emulator. Il-programm huwa kapaċi jimita t-tnedija ta 'kwalunkwe logħob minn stampi disk maħsuba għal Sony PSP. Il-programm ħareġ fl-1 ta’ Novembru 2012. PPSSPP huwa liċenzjat taħt GPL v2. Kulħadd jista 'jagħmel titjib kodiċi tas-sors tal-proġett.

PVS-Istudjo — analizzatur tal-kodiċi statiku għat-tiftix għal żbalji u vulnerabbiltajiet potenzjali fil-kodiċi tal-programm. F'dan l-artikolu, għal bidla, se nniedu PVS-Studio mhux lokalment fuq il-magna tal-iżviluppatur, iżda fil-sħaba, u nfittxu żbalji fil-PPSSPP.

It-twaqqif ta' Travis CI

Ikollna bżonn repożitorju fuq GitHub, fejn jinsab il-proġett li neħtieġu, kif ukoll ċavetta għal PVS-Studio (tista' tikseb ċavetta tal-prova jew b'xejn għal proġetti Open Source).

Ejja mmorru fis-sit Travis C.I.. Wara l-awtorizzazzjoni bl-użu tal-kont GitHub tiegħek, se naraw lista ta’ repożitorji:

Kif tikkonfigura PVS-Studio f'Travis CI billi tuża l-eżempju ta' emulatur tal-console tal-logħob PSP
Għat-test, I furketta PPSSPP.

Nattivaw ir-repożitorju li rridu niġbru:

Kif tikkonfigura PVS-Studio f'Travis CI billi tuża l-eżempju ta' emulatur tal-console tal-logħob PSP
Bħalissa, Travis CI ma tistax tibni l-proġett tagħna minħabba li m'hemm l-ebda struzzjonijiet għall-bini. Allura wasal iż-żmien għall-konfigurazzjoni.

Matul l-analiżi, xi varjabbli se jkunu utli għalina, pereżempju, iċ-ċavetta għal PVS-Studio, li ma jkunx mixtieq li jiġi speċifikat fil-fajl tal-konfigurazzjoni. Mela ejja nżidu varjabbli ambjentali billi tuża s-settings tal-bini f'Travis CI:

Kif tikkonfigura PVS-Studio f'Travis CI billi tuża l-eżempju ta' emulatur tal-console tal-logħob PSP
Ikollna bżonn:

  • PVS_USERNAME - isem tal-utent
  • PVS_KEY - ċavetta
  • MAIL_USER - email li se jintuża biex jintbagħat ir-rapport
  • MAIL_PASSWORD - password tal-email

L-aħħar tnejn huma fakultattivi. Dawn se jintużaw biex jintbagħtu r-riżultati bil-posta. Jekk trid tqassam ir-rapport b'mod ieħor, m'għandekx għalfejn tindikahom.

Allura, żidna l-varjabbli ambjentali li għandna bżonn:

Kif tikkonfigura PVS-Studio f'Travis CI billi tuża l-eżempju ta' emulatur tal-console tal-logħob PSP
Issa ejja noħolqu fajl .travis.yml u poġġiha fl-għerq tal-proġett. PPSSPP diġà kellu fajl ta 'konfigurazzjoni għal Travis CI, madankollu, kien kbir wisq u kompletament mhux adattat għall-eżempju, għalhekk kellna nissimplifikawh ħafna u nħallu biss l-elementi bażiċi.

L-ewwel, ejja nindika l-lingwa, il-verżjoni ta 'Ubuntu Linux li rridu nużaw fil-magna virtwali, u l-pakketti meħtieġa għall-bini:

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'

Il-pakketti kollha li huma elenkati huma meħtieġa esklussivament għall-PPSSPP.

Issa nindikaw il-matriċi tal-assemblaġġ:

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

Ftit aktar dwar is-sezzjoni matriċi. Fi Travis CI, hemm żewġ modi kif jinħolqu għażliet ta 'bini: l-ewwel huwa li tispeċifika lista ta' kompilaturi, tipi ta 'sistema operattiva, varjabbli ambjentali, eċċ., u wara tiġi ġġenerata matriċi tal-kombinazzjonijiet kollha possibbli; it-tieni hija indikazzjoni espliċita tal-matriċi. Naturalment, tista 'tgħaqqad dawn iż-żewġ approċċi u żżid każ uniku, jew, għall-kuntrarju, teskludih bl-użu tat-taqsima jeskludu. Tista' taqra aktar dwar dan fi Dokumentazzjoni Travis CI.

Li jibqa' biss li tipprovdi struzzjonijiet ta' assemblaġġ speċifiċi għall-proġett:

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 jippermettilek li żżid il-kmandi tiegħek għal diversi stadji tal-ħajja ta 'magna virtwali. Taqsima qabel_installa eżegwiti qabel l-installazzjoni tal-pakketti. Imbagħad jinstallaw, li jsegwi l-installazzjoni ta 'pakketti mil-lista addons.aptli indikajna hawn fuq. L-assemblaġġ innifsu jsir fi iskrittura. Jekk kollox mar tajjeb, allura nsibu ruħna ġewwa wara_success (huwa f'din it-taqsima li se nwettqu analiżi statika). Dawn mhumiex il-passi kollha li jistgħu jiġu modifikati, jekk għandek bżonn aktar, allura għandek tfittex ġewwa Dokumentazzjoni Travis CI.

Għal faċilità ta 'qari, il-kmandi tqiegħdu fi skript separat .travis.sh, li titqiegħed fl-għerq tal-proġett.

Allura għandna l-fajl li ġej .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

Qabel ma ninstallaw il-pakketti, aħna se naġġornaw is-submoduli. Dan huwa meħtieġ biex jinbena PPSSPP. Ejja nżidu l-ewwel funzjoni .travis.sh (innota l-estensjoni):

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

Issa niġu direttament biex inwaqqfu t-tnedija awtomatika ta 'PVS-Studio fi Travis CI. L-ewwel għandna bżonn ninstallaw il-pakkett PVS-Studio fuq is-sistema:

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
}

Fil-bidu tal-funzjoni travis_install aħna ninstallaw il-kompilaturi li għandna bżonn bl-użu ta 'varjabbli ambjentali. Imbagħad jekk il-varjabbli $PVS_ANALYZE jaħżen il-valur Iva (indikajna fit-taqsima NS waqt il-konfigurazzjoni tal-matriċi tal-bini), aħna ninstallaw il-pakkett pvs-studio. Minbarra dan, huma indikati wkoll pakketti libio-socket-ssl-perl и libnet-ssleay-perl, madankollu, huma meħtieġa għar-riżultati tal-posta, għalhekk mhumiex meħtieġa jekk għażilt metodu ieħor biex twassal ir-rapport tiegħek.

Funzjoni download_extract iniżżel u jħott l-arkivju speċifikat:

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

Wasal iż-żmien li tgħaqqad il-proġett. Dan jiġri fit-taqsima iskrittura:

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
}

Fil-fatt, din hija konfigurazzjoni oriġinali simplifikata, ħlief għal dawn il-linji:

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

F'din it-taqsima tal-kodiċi aħna stabbiliti għal ċmake bandiera għall-esportazzjoni ta' kmandi ta' kumpilazzjoni. Dan huwa meħtieġ għal analizzatur tal-kodiċi statiku. Tista’ taqra aktar dwar dan fl-artiklu “Kif tħaddem PVS-Studio fuq Linux u macOS".

Jekk l-assemblaġġ kien ta 'suċċess, allura naslu għal wara_success, fejn nagħmlu analiżi statika:

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
}

Ejja nagħtu ħarsa aktar mill-qrib lejn il-linji li ġejjin:

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

L-ewwel linja tiġġenera fajl tal-liċenzja mill-isem tal-utent u ċ-ċavetta li speċifikajna fil-bidu nett meta waqqafna l-varjabbli tal-ambjent Travis CI.

It-tieni linja tibda l-analiżi direttament. Bandiera -j jistabbilixxi n-numru ta 'ħjut għall-analiżi, bandiera -l jindika liċenzja, bandiera -o jiddefinixxi l-fajl għall-ħruġ ta 'zkuk, u l-bandiera -disableLicenseExpirationCheck meħtieġa għall-verżjonijiet ta' prova, peress li awtomatikament pvs-studio-analizzatur se jwissi lill-utent li l-liċenzja waslet biex tiskadi. Biex tevita li dan iseħħ, tista' tispeċifika din il-bandiera.

Il-fajl log fih output mhux maħdum li ma jistax jinqara mingħajr konverżjoni, għalhekk l-ewwel trid tagħmel il-fajl jinqara. Ejja ngħaddu z-zkuk plog-konvertitur, u l-output huwa fajl html.

F'dan l-eżempju, iddeċidejt li nibgħat rapporti bil-posta bl-użu tal-kmand ibgħat email.

Bħala riżultat, aħna ltqajna l-fajl li ġej .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;

Issa wasal iż-żmien li timbotta l-bidliet fir-repożitorju tal-git, u wara Travis CI se jmexxi awtomatikament il-bini. Ikklikkja fuq "ppsspp" biex tmur għar-rapporti tal-bini:

Kif tikkonfigura PVS-Studio f'Travis CI billi tuża l-eżempju ta' emulatur tal-console tal-logħob PSP
Se naraw ħarsa ġenerali lejn il-bini attwali:

Kif tikkonfigura PVS-Studio f'Travis CI billi tuża l-eżempju ta' emulatur tal-console tal-logħob PSP
Jekk il-bini titlesta b'suċċess, aħna nirċievu email bir-riżultati tal-analiżi statika. Naturalment, il-posta mhix l-uniku mod biex tirċievi rapport. Tista 'tagħżel kwalunkwe metodu ta' implimentazzjoni. Iżda huwa importanti li tiftakar li wara li titlesta l-bini, mhux se jkun possibbli li wieħed jaċċessa l-fajls tal-magni virtwali.

Sommarju tal-iżbalji

Lestejna b'suċċess l-aktar parti diffiċli. Issa ejja niżguraw li l-isforzi kollha tagħna jiswew. Ejja nħarsu lejn xi punti interessanti mir-rapport ta’ analiżi statika li wasalli bil-posta (ma kienx ta’ b’xejn li indikajt).

Ottimizzazzjoni perikoluża

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

Twissija PVS-Studio: V597 Il-kompilatur jista' jħassar is-sejħa tal-funzjoni 'memset', li tintuża biex titlaħlaħ il-buffer 'somma'. Il-funzjoni RtlSecureZeroMemory() għandha tintuża biex tħassar id-dejta privata. sha1.cpp 325

Din il-biċċa tal-kodiċi tinsab fil-modulu tal-hashing sikur, madankollu, fiha difett serju tas-sigurtà (CWE-14). Ejja nħarsu lejn il-lista tal-assemblaġġ li tiġi ġġenerata meta tiġi kkumpilata l-verżjoni Debug:

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

Kollox huwa fl-ordni u l-funzjoni memset hija eżegwita, u b'hekk tikteb dejta importanti fir-RAM, madankollu, ma tiċċelebrax għadha. Ejja nħarsu lejn il-lista tal-assemblaġġ tal-verżjoni Rilaxx bl-ottimizzazzjoni:

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

Kif jidher mil-lista, il-kompilatur injora s-sejħa memset. Dan huwa dovut għall-fatt li fil-funzjoni sha1 wara s-sejħa memset mhux aktar referenza għall-istruttura ctx. Għalhekk, il-kompilatur ma jara l-ebda skop li jaħli l-ħin tal-proċessur jissostitwixxi l-memorja li ma tintużax fil-futur. Tista' tiffissa dan billi tuża l-funzjoni RtlSecureZeroMemory jew simili lilha.

B'mod korrett:

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

Paragun bla bżonn

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

Twissija PVS-Studio: V547 L-espressjoni 'leftvol >= 0' hija dejjem vera. sceAudio.cpp 120

Oqgħod attent għall-fergħa l-oħra għall-ewwel if. Il-kodiċi se jiġi esegwit biss jekk il-kundizzjonijiet kollha leftvol > 0xFFFF || rightvol > 0xFFFF || leftvol < 0 || drittvol < 0 se jirriżulta li jkun falz. Għalhekk, aħna nġibu d-dikjarazzjonijiet li ġejjin, li se jkunu minnu għall-fergħa else: leftvol <= 0xFFFF, rightvol <= 0xFFFF, leftvol >= 0 и rightvol >= 0. Innota l-aħħar żewġ dikjarazzjonijiet. Jagħmel sens li tivverifika x'inhi kundizzjoni meħtieġa għall-eżekuzzjoni ta 'din il-biċċa ta' kodiċi?

Allura nistgħu nneħħu dawn id-dikjarazzjonijiet kundizzjonali b'mod sikur:

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

Xenarju ieħor. Hemm xi tip ta 'żball moħbi wara dawn il-kundizzjonijiet żejda. Forsi ma ċċekkjawx dak li kien meħtieġ.

Ctrl+C Ctrl+V Strikes Back

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 Hemm subespressjonijiet identiċi '!Memory::IsValidAddress(psmfData)' fuq ix-xellug u fuq il-lemin tal-'||' operatur. scePsmf.cpp 703

Oqgħod attent għall-kontroll ġewwa if. Ma taħsibx li hija stramba li niċċekkjaw jekk l-indirizz huwiex validu? psmfData, id-doppju? Allura dan jidher stramb għalija... Fil-fatt, dan huwa, ovvjament, typo, u l-idea kienet li jiċċekkjaw iż-żewġ parametri ta 'input.

Għażla korretta:

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

Varjabbli minsija

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

Twissija PVS-Studio: V547 L-espressjoni 'daqs == 8' hija dejjem falza. syn-att.c 195

Dan l-iżball jinsab fil-folder ext, għalhekk mhux verament rilevanti għall-proġett, iżda l-bug instab qabel ma ndunajt, għalhekk iddeċidejt li nħallih. Wara kollox, dan l-artikolu mhuwiex dwar ir-reviżjoni ta 'żbalji, iżda dwar l-integrazzjoni ma' Travis CI, u ma saret l-ebda konfigurazzjoni ta 'l-analizzatur.

Varjabbli daqs huwa initialized minn kostanti, madankollu, ma jintuża xejn fil-kodiċi, sa l-operatur if, li, ovvjament, tagħti falza waqt li niċċekkjaw il-kundizzjonijiet, għax, kif niftakru, daqs ugwali għal żero. Kontrolli sussegwenti wkoll ma jagħmlu l-ebda sens.

Apparentement, l-awtur tal-framment tal-kodiċi nesa jikteb fuq il-varjabbli daqs qabel dak.

Stop

Dan huwa fejn probabbilment se nispiċċaw bl-iżbalji. L-iskop ta 'dan l-artikolu huwa li juri x-xogħol ta' PVS-Studio flimkien ma 'Travis CI, u mhux li janalizza l-proġett bl-aktar mod bir-reqqa possibbli. Jekk trid żbalji akbar u isbaħ, dejjem tista’ tammirahom hawn :).

Konklużjoni

L-użu ta 'servizzi tal-web biex jibnu proġetti flimkien mal-prattika ta' analiżi inkrementali jippermettilek issib ħafna problemi immedjatament wara li tgħaqqad il-kodiċi. Madankollu, bini wieħed jista 'ma jkunx biżżejjed, għalhekk it-twaqqif ta' ttestjar flimkien ma 'analiżi statika se jtejjeb b'mod sinifikanti l-kwalità tal-kodiċi.

Links utli

Kif tikkonfigura PVS-Studio f'Travis CI billi tuża l-eżempju ta' emulatur tal-console tal-logħob PSP

Jekk trid taqsam dan l-artikolu ma 'udjenza li titkellem bl-Ingliż, jekk jogħġbok uża l-link tat-traduzzjoni: Maxim Zvyagintsev. Kif twaqqaf PVS-Studio fi Travis CI billi tuża l-eżempju tal-emulatur tal-console tal-logħob PSP.

Sors: www.habr.com

Żid kumment