Kā konfigurēt PVS-Studio programmā Travis CI, izmantojot PSP spēļu konsoles emulatora piemēru

Kā konfigurēt PVS-Studio programmā Travis CI, izmantojot PSP spēļu konsoles emulatora piemēru
Travis CI ir izplatÄ«ts tÄ«mekļa pakalpojums programmatÅ«ras izveidei un testÄ“Å”anai, kas izmanto GitHub kā pirmkoda mitināŔanu. Papildus iepriekÅ” minētajiem darbÄ«bas scenārijiem, pateicoties plaÅ”ajām konfigurācijas opcijām, varat pievienot arÄ« savus. Å ajā rakstā mēs konfigurēsim Travis CI darbam ar PVS-Studio, izmantojot PPSSPP koda piemēru.

Ievads

Travis CI ir tÄ«mekļa pakalpojums programmatÅ«ras izveidei un testÄ“Å”anai. To parasti izmanto kopā ar nepārtrauktas integrācijas praksi.

PPSSPP - PSP spēļu konsoles emulators. Programma spēj lÄ«dzināties jebkuras spēles palaiÅ”anai no diska attēliem, kas paredzēti Sony PSP. Programma tika izlaista 1. gada 2012. novembrÄ«. PPSSPP ir licencēts saskaņā ar GPL v2. Ikviens var veikt uzlabojumus projekta pirmkods.

PVS-studija ā€” statisks kodu analizators kļūdu un iespējamo ievainojamÄ«bu meklÄ“Å”anai programmas kodā. Å ajā rakstā mēs izmaiņu labad palaidÄ«sim PVS-Studio nevis lokāli izstrādātāja datorā, bet gan mākonÄ« un meklēsim kļūdas PPSSPP.

Travis CI iestatīŔana

Mums bÅ«s nepiecieÅ”ama krātuve GitHub, kur atrodas mums nepiecieÅ”amais projekts, kā arÄ« atslēga PVS-Studio (varat iegÅ«t izmēģinājuma atslēga vai bezmaksas atvērtā pirmkoda projektiem).

Dosimies uz vietni Travis CI. Pēc autorizācijas, izmantojot savu GitHub kontu, mēs redzēsim krātuvju sarakstu:

Kā konfigurēt PVS-Studio programmā Travis CI, izmantojot PSP spēļu konsoles emulatora piemēru
Pārbaudei es dakŔu PPSSPP.

Mēs aktivizējam repozitoriju, kuru vēlamies apkopot:

Kā konfigurēt PVS-Studio programmā Travis CI, izmantojot PSP spēļu konsoles emulatora piemēru
Šobrīd Travis CI nevar izveidot mūsu projektu, jo nav norādījumu par būvniecību. Tātad ir pienācis laiks konfigurēt.

AnalÄ«zes laikā mums noderēs daži mainÄ«gie, piemēram, PVS-Studio atslēga, ko nebÅ«tu vēlams norādÄ«t konfigurācijas failā. Tāpēc pievienosim vides mainÄ«gos, izmantojot Travis CI veidoÅ”anas iestatÄ«jumus:

Kā konfigurēt PVS-Studio programmā Travis CI, izmantojot PSP spēļu konsoles emulatora piemēru
Mums ir nepiecieŔams:

  • PVS_USERNAME ā€” lietotājvārds
  • PVS_KEY ā€” atslēga
  • MAIL_USER ā€” e-pasts, kas tiks izmantots ziņojuma nosÅ«tÄ«Å”anai
  • MAIL_PASSWORD ā€” e-pasta parole

Pēdējie divi nav obligāti. Tie tiks izmantoti, lai nosūtītu rezultātus pa pastu. Ja vēlaties ziņojumu izplatīt citā veidā, jums tie nav jānorāda.

Tātad, mēs esam pievienojuÅ”i mums nepiecieÅ”amos vides mainÄ«gos:

Kā konfigurēt PVS-Studio programmā Travis CI, izmantojot PSP spēļu konsoles emulatora piemēru
Tagad izveidosim failu .travis.yml un ievietojiet to projekta saknē. PPSSPP jau bija Travis CI konfigurācijas fails, tomēr tas bija pārāk liels un pilnÄ«gi nepiemērots piemēram, tāpēc nācās to krietni vienkārÅ”ot un atstāt tikai pamata elementus.

Vispirms norādÄ«sim valodu, Ubuntu Linux versiju, kuru vēlamies izmantot virtuālajā maŔīnā, un bÅ«vÄ“Å”anai nepiecieÅ”amās pakotnes:

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'

Visas uzskaitītās pakotnes ir nepiecieŔamas tikai PPSSPP.

Tagad mēs norādām montāžas matricu:

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

Nedaudz vairāk par sadaļu matrica. Programmā Travis CI ir divi veidi, kā izveidot veidoÅ”anas opcijas: pirmais ir norādÄ«t kompilatoru sarakstu, operētājsistēmu tipus, vides mainÄ«gos utt., pēc kura tiek Ä£enerēta visu iespējamo kombināciju matrica; otrā ir skaidra matricas norāde. Protams, jÅ«s varat apvienot Ŕīs divas pieejas un pievienot unikālu gadÄ«jumu vai, gluži pretēji, to izslēgt, izmantojot sadaļu izslēgt. Vairāk par to varat lasÄ«t sadaļā Travis CI dokumentācija.

Atliek tikai nodroŔināt projektam specifiskas montāžas instrukcijas:

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 ļauj jums pievienot savas komandas dažādiem virtuālās maŔīnas dzÄ«ves posmiem. sadaļa pirms_instalÄ“Å”anas tiek izpildÄ«ts pirms pakotņu instalÄ“Å”anas. Tad uzstādÄ«t, kas seko pakeÅ”u instalÄ“Å”anai no saraksta addons.aptko mēs norādÄ«jām iepriekÅ”. Pati montāža notiek iekŔā scenārijs. Ja viss noritēja labi, mēs atrodamies pēc_veiksmes (Å”ajā sadaļā mēs veiksim statisko analÄ«zi). Å Ä«s nav visas darbÄ«bas, kuras var mainÄ«t, ja jums ir nepiecieÅ”ams vairāk, tad jums vajadzētu ieskatÄ«ties Travis CI dokumentācija.

Lai atvieglotu lasÄ«Å”anu, komandas tika ievietotas atseviŔķā skriptā .travis.sh, kas atrodas projekta saknē.

Tātad mums ir Ŕāds fails .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

Pirms pakotņu instalÄ“Å”anas mēs atjaunināsim apakÅ”moduļus. Tas ir nepiecieÅ”ams, lai izveidotu PPSSPP. Pievienosim pirmo funkciju .travis.sh (Ņemiet vērā paplaÅ”inājumu):

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

Tagad mēs nonākam tieÅ”i pie PVS-Studio automātiskās palaiÅ”anas iestatÄ«Å”anas programmā Travis CI. Vispirms sistēmā jāinstalē PVS-Studio pakotne:

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
}

Funkcijas sākumā travis_install mēs instalējam nepiecieÅ”amos kompilatorus, izmantojot vides mainÄ«gos. Tad, ja mainÄ«gais $PVS_ANALYZE saglabā vērtÄ«bu Jā (mēs to norādÄ«jām sadaļā env veidoÅ”anas matricas konfigurācijas laikā), mēs instalējam pakotni pvs-studija. Papildus tam ir norādÄ«ti arÄ« iepakojumi libio-socket-ssl-perl Šø libnet-ssleay-perl, tomēr tie ir nepiecieÅ”ami rezultātu nosÅ«tÄ«Å”anai pa pastu, tāpēc tie nav nepiecieÅ”ami, ja esat izvēlējies citu atskaites piegādes metodi.

Funkcija download_extract lejupielādē un izpako norādīto arhīvu:

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

Ir pienācis laiks apvienot projektu. Tas notiek sadaļā scenārijs:

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
}

Faktiski Ŕī ir vienkārÅ”ota sākotnējā konfigurācija, izņemot Ŕīs rindas:

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

Å ajā koda sadaļā mēs iestatÄ«jām cmmake karodziņŔ kompilācijas komandu eksportÄ“Å”anai. Tas ir nepiecieÅ”ams statiskā koda analizatoram. Vairāk par to varat lasÄ«t rakstā "Kā palaist PVS-Studio operētājsistēmās Linux un macOS".

Ja montāža bija veiksmīga, tad tiekam pie pēc_veiksmes, kur veicam statisko analīzi:

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
}

Sīkāk apskatīsim Ŕādas rindas:

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

Pirmajā rindā tiek Ä£enerēts licences fails no lietotājvārda un atslēgas, ko mēs norādÄ«jām paŔā sākumā, iestatot Travis CI vides mainÄ«gos.

Otrā rinda tieÅ”i sāk analÄ«zi. Karogs -j iestata analÄ«zes pavedienu skaitu, karodziņŔ -l norāda licenci, karogu -o definē failu žurnālu izvadÄ«Å”anai un karogu - DisableLicenseExpirationCheck nepiecieÅ”ams izmēģinājuma versijām, jo ā€‹ā€‹pēc noklusējuma pvs-studio-analizators brÄ«dinās lietotāju, ka drÄ«z beigsies licences derÄ«guma termiņŔ. Lai tas nenotiktu, varat norādÄ«t Å”o karogu.

Žurnāla failā ir neapstrādāta izvade, ko nevar nolasÄ«t bez konvertÄ“Å”anas, tāpēc vispirms fails ir jāpadara lasāms. IzlaidÄ«sim baļķus cauri plog pārveidotājs, un izvade ir html fails.

Šajā piemērā es nolēmu nosūtīt pārskatus pa pastu, izmantojot komandu sūtīt e-pastu.

Rezultātā mēs saņēmām Ŕādu failu .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;

Tagad ir pienācis laiks virzÄ«t izmaiņas git repozitorijā, un pēc tam Travis CI automātiski palaidÄ«s bÅ«vējumu. NoklikŔķiniet uz ā€œppssppā€, lai pārietu uz bÅ«vÄ“Å”anas pārskatiem:

Kā konfigurēt PVS-Studio programmā Travis CI, izmantojot PSP spēļu konsoles emulatora piemēru
Mēs redzēsim paÅ”reizējās versijas pārskatu:

Kā konfigurēt PVS-Studio programmā Travis CI, izmantojot PSP spēļu konsoles emulatora piemēru
Ja bÅ«vÄ“Å”ana tiks veiksmÄ«gi pabeigta, mēs saņemsim e-pastu ar statiskās analÄ«zes rezultātiem. Protams, pasta sÅ«tÄ«Å”ana nav vienÄ«gais veids, kā saņemt ziņojumu. Varat izvēlēties jebkuru ievieÅ”anas metodi. Bet ir svarÄ«gi atcerēties, ka pēc bÅ«vÄ“Å”anas pabeigÅ”anas nebÅ«s iespējams piekļūt virtuālās maŔīnas failiem.

Kļūdu kopsavilkums

Mēs esam veiksmÄ«gi pabeiguÅ”i grÅ«tāko daļu. Tagad pārliecināsimies, ka visas mÅ«su pÅ«les ir tā vērtas. ApskatÄ«sim dažus interesantus punktus no statiskās analÄ«zes ziņojuma, kas man atnāca pa pastu (ne velti es to norādÄ«ju).

Bīstama optimizācija

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 brÄ«dinājums: V597 Kompilators varētu izdzēst funkcijas ā€œmemsetā€ izsaukumu, kas tiek izmantots, lai izskalotu ā€œsummasā€ buferi. Lai dzēstu privātos datus, ir jāizmanto funkcija RtlSecureZeroMemory(). sha1.cpp 325

Å is koda fragments atrodas droŔās jaukÅ”anas modulÄ«, taču tajā ir nopietns droŔības trÅ«kums (CWE-14). ApskatÄ«sim montāžas sarakstu, kas tiek Ä£enerēts, sastādot atkļūdoÅ”anas versiju:

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

Viss ir kārtībā un darbojas memeset tiek izpildīts, tādējādi pārrakstot svarīgus datus RAM, tomēr vēl nepriecājieties. Apskatīsim izlaiduma versijas komplektācijas sarakstu ar optimizāciju:

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

Kā redzams no saraksta, kompilators ignorēja zvanu memeset. Tas ir saistīts ar faktu, ka funkcijā sha1 pēc zvana memeset vairs nav atsauces uz struktūru ctx. Tāpēc kompilators neredz jēgu tērēt procesora laiku, pārrakstot atmiņu, kas turpmāk netiek izmantota. To var novērst, izmantojot funkciju RtlSecureZeroMemory vai līdzīgi viņai.

Pareizi:

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

Nevajadzīgs salīdzinājums

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 brīdinājums: V547 Izteiksme 'leftvol >= 0' vienmēr ir patiesa. sceAudio.cpp 120

Vispirms pievērsiet uzmanÄ«bu citai nozarei if. Kods tiks izpildÄ«ts tikai tad, ja bÅ«s izpildÄ«ti visi nosacÄ«jumi leftvol > 0xFFFF || Rightvol > 0xFFFF || leftvol < 0 || labais tilpums < 0 izrādÄ«sies nepatiess. Tāpēc mēs iegÅ«stam Ŕādus apgalvojumus, kas bÅ«s patiesi arÄ« citai nozarei: leftvol <= 0xFFFF, Rightvol <= 0xFFFF, kreisais tilpums >= 0 Šø Rightvol >= 0. Ievērojiet pēdējos divus apgalvojumus. Vai ir jēga pārbaudÄ«t, kas ir nepiecieÅ”ams nosacÄ«jums Ŕīs koda daļas izpildei?

Tātad mēs varam droÅ”i noņemt Å”os nosacÄ«jumu paziņojumus:

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

Cits scenārijs. Aiz Å”iem liekajiem apstākļiem slēpjas kāda veida kļūda. VarbÅ«t viņi nepārbaudÄ«ja, kas bija vajadzÄ«gs.

Ctrl+C Ctrl+V sit atpakaļ

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 Ir identiskas apakŔizteiksmes '!Memory::IsValidAddress(psmfData)' pa kreisi un pa labi no '||' operators. scePsmf.cpp 703

Pievērsiet uzmanÄ«bu čekam iekÅ”pusē if. Vai jums neliekas dÄ«vaini, ka mēs pārbaudām, vai adrese ir derÄ«ga? psmfData, divreiz vairāk? Tāpēc man tas Ŕķiet dÄ«vaini... PatiesÄ«bā Ŕī, protams, ir drukas kļūda, un doma bija pārbaudÄ«t abus ievades parametrus.

Pareizais variants:

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

Aizmirsts mainīgais

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 brīdinājums: V547 Izteiksme 'izmērs == 8' vienmēr ir nepatiesa. syn-att.c 195

Å Ä« kļūda atrodas mapē ext, tātad projektam Ä«sti neatbilstoÅ”i, bet kļūda tika atrasta pirms es to pamanÄ«ju, tāpēc nolēmu to atstāt. Galu galā Å”is raksts nav par kļūdu pārskatÄ«Å”anu, bet gan par integrāciju ar Travis CI, un netika veikta analizatora konfigurācija.

Mainīgs izmērs tiek inicializēts ar konstanti, taču tas netiek izmantots kodā vispār, līdz pat operatoram if, kas, protams, dod nepatiess pārbaudot nosacījumus, jo, kā mēs atceramies, izmērs vienāds ar nulli. Arī turpmākajām pārbaudēm nav jēgas.

Acīmredzot koda fragmenta autors aizmirsa pārrakstīt mainīgo izmērs pirms tam.

apstāties

Å eit mēs, iespējams, beigsim ar kļūdām. Å Ä« raksta mērÄ·is ir demonstrēt PVS-Studio darbu kopā ar Travis CI, nevis analizēt projektu pēc iespējas rÅ«pÄ«gāk. Ja vēlaties lielākas un skaistākas kļūdas, vienmēr varat par tām apbrÄ«not Å”eit :).

Secinājums

Izmantojot tÄ«mekļa pakalpojumus projektu veidoÅ”anai kopā ar pakāpeniskas analÄ«zes praksi, jÅ«s varat atrast daudzas problēmas uzreiz pēc koda apvienoÅ”anas. Tomēr ar vienu bÅ«vējumu var nepietikt, tāpēc testÄ“Å”anas iestatÄ«Å”ana kopā ar statisko analÄ«zi ievērojami uzlabos koda kvalitāti.

Noderīgas saites

Kā konfigurēt PVS-Studio programmā Travis CI, izmantojot PSP spēļu konsoles emulatora piemēru

Ja vēlaties dalÄ«ties ar Å”o rakstu ar angliski runājoÅ”u auditoriju, lÅ«dzu, izmantojiet tulkoÅ”anas saiti: Maksims Zvjagintsevs. Kā iestatÄ«t PVS-Studio programmā Travis CI, izmantojot PSP spēļu konsoles emulatora piemēru.

Avots: www.habr.com

Pievieno komentāru