PSP оюн консолунун эмуляторунун мисалын колдонуп Travis CIде PVS-Studio кантип конфигурациялоо керек

PSP оюн консолунун эмуляторунун мисалын колдонуп Travis CIде PVS-Studio кантип конфигурациялоо керек
Travis CI бул GitHub'ду баштапкы коддун хостинги катары колдонгон программалык камсыздоону куруу жана сыноо үчүн бөлүштүрүлгөн веб кызматы. Жогорудагы операциялык сценарийлерден тышкары, сиз кеңири конфигурация опцияларынын аркасында өзүңүздүн ыракматыңызды кошо аласыз. Бул макалада биз Travis CIди PPSSPP код мисалы аркылуу PVS-Studio менен иштөө үчүн конфигурациялайбыз.

тааныштыруу

Travis C.I. программалык камсыздоону куруу жана сыноо үчүн веб кызматы. Ал адатта үзгүлтүксүз интеграциялык практикалар менен бирге колдонулат.

PPSSPP - PSP оюн консолунун эмулятору. Программа Sony PSP үчүн арналган диск сүрөттөрүнөн каалаган оюндарды ишке киргизе алат. Программа 1-жылдын 2012-ноябрында жарык көргөн. PPSSPP GPL v2 боюнча лицензияланган. Ар бир адам жакшырта алат долбоордун баштапкы коду.

PVS-Studio — программа кодундагы каталарды жана потенциалдуу кемчиликтерди издөө үчүн статикалык код анализатору. Бул макалада, өзгөртүү үчүн, биз PVS-Studio программасын иштеп чыгуучунун машинасында эмес, булутта ишке киргизебиз жана PPSSPPдеги каталарды издейбиз.

Travis CI орнотуу

Бизге GitHub-да репозиторий керек, анда бизге керектүү долбоор жайгашкан, ошондой эле PVS-Studio үчүн ачкыч (сиз ала аласыз) сыноо ачкычы же Open Source долбоорлору үчүн акысыз).

Келгиле сайтка баралы Travis C.I.. GitHub каттоо эсебиңизди колдонууга уруксат бергенден кийин, биз репозиторийлердин тизмесин көрөбүз:

PSP оюн консолунун эмуляторунун мисалын колдонуп Travis CIде PVS-Studio кантип конфигурациялоо керек
Сыноо үчүн мен PPSSPPти айрыдым.

Биз чогулткубуз келген репозиторийди иштетебиз:

PSP оюн консолунун эмуляторунун мисалын колдонуп Travis CIде PVS-Studio кантип конфигурациялоо керек
Учурда Travis CI биздин долбоорду кура албайт, анткени куруу боюнча көрсөтмөлөр жок. Ошентип, конфигурацияга убакыт келди.

Талдоо учурунда кээ бир өзгөрмөлөр бизге пайдалуу болот, мисалы, PVS-Studio үчүн ачкыч, аны конфигурация файлында көрсөтүү жагымсыз болот. Ошентип, келгиле, Travis CIдеги куруу жөндөөлөрүн колдонуп чөйрө өзгөрмөлөрүн кошолу:

PSP оюн консолунун эмуляторунун мисалын колдонуп Travis CIде PVS-Studio кантип конфигурациялоо керек
Биз керек:

  • PVS_USERNAME - колдонуучунун аты
  • PVS_KEY - ачкыч
  • MAIL_USER - отчет жөнөтүү үчүн колдонула турган электрондук почта
  • MAIL_PASSWORD - электрондук почтанын сырсөзү

Акыркы экөө милдеттүү эмес. Булар натыйжаларды почта аркылуу жөнөтүү үчүн колдонулат. Эгерде сиз отчетту башка жол менен жайылтууну кааласаңыз, анда аларды көрсөтүүнүн кереги жок.

Ошентип, биз керектүү чөйрө өзгөрмөлөрүн коштук:

PSP оюн консолунун эмуляторунун мисалын колдонуп Travis CIде PVS-Studio кантип конфигурациялоо керек
Эми файл түзөлү .travis.yml жана долбоордун тамырына жайгаштырыңыз. PPSSPPде Travis CI үчүн конфигурация файлы мурунтан эле бар болчу, бирок ал өтө чоң жана мисал үчүн таптакыр жараксыз болгондуктан, биз аны абдан жөнөкөйлөштүрүүгө жана негизги элементтерди гана калтырууга туура келди.

Биринчиден, келгиле, тилди, биз виртуалдык машинада колдонгубуз келген Ubuntu Linux версиясын жана куруу үчүн керектүү пакеттерди көрсөтөлү:

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'

Тизмеде көрсөтүлгөн бардык пакеттер PPSSPP үчүн гана керек.

Эми биз монтаждык матрицаны көрсөтөбүз:

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

Бөлүм жөнүндө бир аз көбүрөөк Булакта. Travis CIде куруу варианттарын түзүүнүн эки жолу бар: биринчиси – компиляторлордун тизмесин, операциялык системанын түрлөрүн, чөйрөнүн өзгөрмөлөрүн жана башкаларын көрсөтүү, андан кийин бардык мүмкүн болгон комбинациялардын матрицасы түзүлөт; экинчиси - матрицанын ачык-айкын көрсөткүчү. Албетте, сиз бул эки ыкманы айкалыштыра аласыз жана уникалдуу учурду кошуп, же, тескерисинче, бөлүмдү колдонуп, аны жокко чыгара аласыз. чыгаруу. Бул тууралуу кененирээк бөлүмдөн окуй аласыз Travis CI документтери.

Болгону долбоорго тиешелүү монтаждоо көрсөтмөлөрүн берүү гана калды:

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 сизге виртуалдык машинанын жашоосунун ар кандай этаптары үчүн өзүңүздүн буйруктарыңызды кошууга мүмкүндүк берет. Бөлүм орнотуудан мурун пакеттерди орнотуудан мурун аткарылган. Анда орнотуу, бул тизмеден пакеттерди орнотуудан кийин addons.aptбиз жогоруда көрсөткөн. Жыйындын өзү болуп өтөт кол шрифти. Эгер баары жакшы болсо, анда биз өзүбүздү табабыз ийгиликтен кийин (бул бөлүмдө биз статикалык талдоо жүргүзөбүз). Бул өзгөртүүгө боло турган бардык кадамдар эмес, эгер сизге көбүрөөк керек болсо, анда сиз киришиңиз керек Travis CI документтери.

Окууга жеңил болуу үчүн буйруктар өзүнчө сценарийге жайгаштырылды .travis.sh, ал долбоордун тамырына жайгаштырылган.

Ошентип, бизде төмөнкү файл бар .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

Пакеттерди орнотуудан мурун биз субмодулдарды жаңыртабыз. Бул PPSSPP куруу үчүн керек. Биринчи функцияны кошолу .travis.sh (кеңейтүүнү эске алыңыз):

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

Эми биз Travis CIде PVS-Studio автоматтык түрдө ишке киргизүүгө түз келдик. Алгач системага PVS-Studio пакетин орнотуу керек:

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_install биз чөйрө өзгөрмөлөрүнүн жардамы менен керектүү компиляторлорду орнотобуз. Андан кийин өзгөрмө болсо $PVS_ANALYZE баалуулугун сактайт Ооба (Биз аны бөлүмдө көрсөткөн жөнөтүү матрицаны конфигурациялоодо) пакетти орнотобуз pvs-studio. Мындан тышкары, пакеттер да көрсөтүлгөн libio-socket-ssl-perl и libnet-ssleay-perl, бирок, алар натыйжаларды жөнөтүү үчүн талап кылынат, ошондуктан, эгер сиз отчетуңузду жеткирүү үчүн башка ыкманы тандасаңыз, алардын кереги жок.

милдети жүктөө_үзүндү көрсөтүлгөн архивди жүктөйт жана ачат:

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

Долбоорду бириктирүүгө убакыт келди. Бул бөлүмдө болот кол шрифти:

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
}

Чынында, бул жөнөкөйлөтүлгөн баштапкы конфигурация, бул саптардан тышкары:

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

Коддун бул бөлүмүндө биз үчүн коюлган cmake компиляция буйруктарын экспорттоо үчүн желек. Бул статикалык код анализатору үчүн зарыл. Бул тууралуу кененирээк макаладан окуй аласыз "Linux жана macOSдо PVS-Studio кантип иштетүү керек".

Эгер жыйын ийгиликтүү болсо, анда биз барабыз ийгиликтен кийин, анда биз статикалык анализ жасайбыз:

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
}

Келгиле, төмөнкү саптарды жакшыраак карап көрөлү:

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

Биринчи сап биз Travis CI чөйрө өзгөрмөлөрүн орнотууда эң башында көрсөткөн колдонуучунун атынан жана ачкычтан лицензия файлын түзөт.

Экинчи сап талдоону түз баштайт. Желек талдоо үчүн жиптердин санын белгилейт, желек лицензияны, желекти көрсөтөт журналдарды чыгаруу үчүн файлды жана желекти аныктайт -disableLicenseExpirationCheck сыноо версиялары үчүн талап кылынат, анткени демейки боюнча pvs-studio-анализер колдонуучуга лицензиянын мөөнөтү бүтөөрүн эскертет. Мунун алдын алуу үчүн, бул желекти көрсөтсөңүз болот.

Журнал файлында конверсиясыз окулбай турган чийки чыгарылыш камтылган, андыктан алгач файлды окула турган кылуу керек. Келгиле, журналдарды өткөрөлү плог-конвертер, жана чыгаруу html файлы болуп саналат.

Бул мисалда мен буйрукту колдонуп почта аркылуу отчетторду жөнөтүүнү чечтим почта жөнөтүү.

Натыйжада, биз төмөнкү файлды алдык .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;

Эми өзгөртүүлөрдү git репозиторийине түртүүгө убакыт келди, андан кийин Travis CI түзүүнү автоматтык түрдө иштетет. Куруу отчетторуна өтүү үчүн "ppsspp" баскычын чыкылдатыңыз:

PSP оюн консолунун эмуляторунун мисалын колдонуп Travis CIде PVS-Studio кантип конфигурациялоо керек
Биз учурдагы курулуштун серепти көрөбүз:

PSP оюн консолунун эмуляторунун мисалын колдонуп Travis CIде PVS-Studio кантип конфигурациялоо керек
Эгер куруу ийгиликтүү аяктаса, биз статикалык анализдин натыйжалары менен электрондук кат алабыз. Албетте, кат жөнөтүү отчетту алуунун жалгыз жолу эмес. Сиз каалаган ишке ашыруу ыкмасын тандай аласыз. Бирок куруу аяктагандан кийин виртуалдык машина файлдарына кирүү мүмкүн болбой турганын эстен чыгарбоо керек.

Ката корутундусу

Эң татаал бөлүгүн ийгиликтүү аяктадык. Эми биздин бардык аракетибиздин акыбети кайтканына ынаналы. Мага почта аркылуу келген статикалык талдоо отчетунан кээ бир кызыктуу учурларды карап көрөлү (мен бекеринен айткан эмесмин).

Коркунучтуу оптималдаштыруу

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 эскертүүсү: V597 Компилятор "сумма" буферин тазалоо үчүн колдонулган "memset" функциясын өчүрө алат. RtlSecureZeroMemory() функциясы купуя маалыматтарды өчүрүү үчүн колдонулушу керек. sha1.cpp 325

Коддун бул бөлүгү коопсуз хэш модулунда жайгашкан, бирок анда олуттуу коопсуздук кемчилиги бар (CWE-14). Мүчүлүштүктөрдү оңдоо версиясын түзүүдө түзүлгөн ассамблеянын тизмесин карап көрөлү:

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

Баары өз ордунда жана функцияда memeset аткарылат, ошону менен RAMдагы маанилүү маалыматтардын үстүнө жазылат, бирок азырынча кубанбаңыз. Оптималдаштыруу менен релиз версиясынын ассамблея тизмесин карап көрөлү:

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

Тизмеден көрүнүп тургандай, компилятор чакырууга көңүл бурбай койгон memeset. Бул функцияда болгонуна байланыштуу sha1 чалуудан кийин memeset структурасына дагы шилтеме жок ctx. Демек, компилятор келечекте колдонулбай турган эстутумду кайра жазуу үчүн процессордун убактысын текке кетирүүнүн эч кандай маанисин көрбөйт. Функцияны колдонуу менен муну оңдой аласыз RtlSecureZeroMemory же ушундай эле ага.

туура:

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

Керексиз салыштыруу

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 эскертүүсү: V547 'leftvol >= 0' туюнтмасы ар дайым туура. sceAudio.cpp 120

Биринчи үчүн, башка бутагына көңүл буруңуз if. Код бардык шарттар болгондо гана аткарылат leftvol > 0xFFFF || rightvol > 0xFFFF || leftvol < 0 || оң көлөмү < 0 жалган болуп чыгат. Ошондуктан, биз else бутагы үчүн туура боло турган төмөнкү билдирүүлөрдү алабыз: leftvol <= 0xFFFF, rightvol <= 0xFFFF, leftvol >= 0 и оң том >= 0. Акыркы эки билдирүүгө көңүл буруңуз. Бул коддун аткарылышынын зарыл шарты эмне экендигин текшерүүнүн мааниси барбы?

Ошентип, биз бул шарттуу билдирүүлөрдү коопсуз алып сала алабыз:

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

Башка сценарий. Бул ашыкча шарттардын артында кандайдыр бир ката бар. Балким, алар эмне талап кылынарын текшеришпеди.

Ctrl+C Ctrl+V Артка сокку

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 "||' оператор. scePsmf.cpp 703

Ичиндеги чекке көңүл буруңуз if. Даректин жарактуу-жоктугун текшергенибиз кызык эмеспи? psmfData, эки эсе көп? Демек, бул мага кызыктай сезилет... Чынында, бул, албетте, ката жана эки киргизүү параметрин текшерүү идеясы болгон.

Туура вариант:

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

Унутулган өзгөрмө

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 эскертүүсү: V547 'Size == 8' туюнтмасы дайыма жалган. syn-att.c 195

Бул ката папкада жайгашкан доб, ошондуктан долбоорго чындап тиешеси жок, бирок мүчүлүштүк мен байкаганга чейин табылган, ошондуктан мен аны калтырууну чечтим. Анткени, бул макала каталарды карап чыгуу жөнүндө эмес, Travis CI менен интеграциялоо жөнүндө жана анализатордун конфигурациясы жүргүзүлгөн эмес.

Variable көлөм туруктуу менен инициализацияланат, бирок ал операторго чейин коддо такыр колдонулбайт if, бул, албетте, берет жалган шарттарды текшерип жатканда, анткени, биз эстегендей, көлөм нөлгө барабар. Кийинки текшерүүлөрдүн да мааниси жок.

Сыягы, код фрагментинин автору өзгөрмөнүн үстүнө жазууну унутуп койгон окшойт көлөм буга чейин.

токтотуу

Бул жерде, балким, каталар менен бүтүрөбүз. Бул макаланын максаты Travis CI менен бирге PVS-Studio ишин көрсөтүү жана долбоорду мүмкүн болушунча кылдат талдоо эмес. Эгер сиз чоңураак жана сулуураак каталарды кааласаңыз, аларга дайыма суктансаңыз болот бул жерде :).

жыйынтыктоо

Кошумча талдоо практикасы менен бирге долбоорлорду куруу үчүн веб-кызматтарды колдонуу кодду бириктиргенден кийин дароо көптөгөн көйгөйлөрдү табууга мүмкүндүк берет. Бирок, бир куруу жетишсиз болушу мүмкүн, андыктан статикалык талдоо менен бирге тестирлөөнү орнотуу коддун сапатын бир топ жакшыртат.

Пайдалуу шилтемелер

PSP оюн консолунун эмуляторунун мисалын колдонуп Travis CIде PVS-Studio кантип конфигурациялоо керек

Бул макаланы англис тилдүү аудитория менен бөлүшкүңүз келсе, котормо шилтемесин колдонуңуз: Максим Звягинцев. PSP оюн консолунун эмуляторунун мисалын колдонуп Travis CIде PVS-Studio кантип орнотуу керек.

Source: www.habr.com

Комментарий кошуу