PSP ойын консолі эмуляторының мысалын пайдаланып Travis CI жүйесінде PVS-Studio қалай конфигурациялауға болады

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

Кіріспе

Travis CI бағдарламалық қамтамасыз етуді құруға және сынауға арналған веб-қызмет болып табылады. Ол әдетте үздіксіз интеграциялық тәжірибелермен бірге қолданылады.

PPSSPP — PSP ойын консолінің эмуляторы. Бағдарлама Sony PSP-ге арналған дискілік кескіндерден кез келген ойындарды іске қосуды эмуляциялай алады. Бағдарлама 1 жылдың 2012 қарашасында шығарылды. PPSSPP GPL v2 бойынша лицензияланған. Кез келген адам жақсартулар жасай алады жобаның бастапқы коды.

PVS-студиясы — бағдарлама кодындағы қателер мен ықтимал осалдықтарды іздеуге арналған статикалық код анализаторы. Бұл мақалада өзгерту үшін біз PVS-Studio-ны жергілікті түрде әзірлеушінің машинасында емес, бұлтта іске қосамыз және PPSSPP қателерін іздейміз.

Travis CI орнату

Бізге қажет жоба орналасқан GitHub репозиторийі, сондай-ақ PVS-Studio кілті қажет болады (сіз алуға болады). сынақ кілті немесе ашық бастапқы жобалар үшін тегін).

Сайтқа барайық Travis CI. 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 студиясы. Бұған қоса, пакеттер де көрсетілген 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

Кодтың осы бөлімінде біз орнаттық смаке компиляция пәрмендерін экспорттауға арналған жалауша. Бұл статикалық код анализаторы үшін қажет. Бұл туралы толығырақ мақаладан оқи аласыз «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). Debug нұсқасын құрастыру кезінде жасалған құрастыру тізімін қарастырайық:

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

Барлығы тәртіпте және функцияда естелік орындалады, осылайша жедел жадтағы маңызды деректерді қайта жазады, бірақ әлі қуанбаңыз. Оңтайландыруы бар шығарылым нұсқасының құрастыру тізімін қарастырайық:

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

Листингтен көрініп тұрғандай, компилятор қоңырауды елемеді естелік. Бұл функцияда болуына байланысты sha1 қоңыраудан кейін естелік құрылымға сілтеме жоқ 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

Біріншісі үшін else филиалына назар аударыңыз if. Код барлық шарттар орындалғанда ғана орындалады leftvol > 0xFFFF || rightvol > 0xFFFF || сол жақ көлемі < 0 || оң көлем < 0 жалған болып шығады. Сондықтан, біз else тармағы үшін дұрыс болатын келесі мәлімдемелерді аламыз: сол жақ көлемі <= 0xFFFF, оң көлем <= 0xFFFF, сол жақ көлемі >= 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 '||' сол және оң жағында бірдей '!Memory::IsValidAddress(psmfData)' ішкі өрнектері бар. оператор. 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 'өлшем == 8' өрнегі әрқашан жалған. syn-att.c 195

Бұл қате қалтада орналасқан EXT, сондықтан жобаға қатысты емес, бірақ қате мен оны байқамай тұрып табылды, сондықтан мен оны қалдыруды шештім. Өйткені, бұл мақала қателерді қарау туралы емес, Travis CI-мен интеграция туралы және анализатордың конфигурациясы жүргізілмеген.

Айнымалысы мөлшері константамен инициализацияланады, бірақ ол операторға дейін кодта мүлдем пайдаланылмайды if, бұл, әрине, береді жалған шарттарды тексеру кезінде, өйткені, есімізде, мөлшері нөлге тең. Кейінгі тексерулердің де мағынасы жоқ.

Шамасы, код фрагменті авторы айнымалыны қайта жазуды ұмытып кеткен мөлшері одан бұрын.

Тоқта

Бұл жерде біз қателіктермен аяқталатын шығармыз. Бұл мақаланың мақсаты - жобаны мүмкіндігінше мұқият талдау емес, Travis CI-мен бірге PVS-Studio жұмысын көрсету. Егер сіз үлкенірек және әдемірек қателерді қаласаңыз, сіз оларға әрқашан таңдана аласыз осында :)

қорытынды

Қосымша талдау тәжірибесімен бірге жобаларды құру үшін веб-қызметтерді пайдалану кодты біріктіргеннен кейін бірден көптеген мәселелерді табуға мүмкіндік береді. Дегенмен, бір құрастыру жеткіліксіз болуы мүмкін, сондықтан статикалық талдаумен бірге тестілеуді орнату кодтың сапасын айтарлықтай жақсартады.

Пайдалы сілтемелер

PSP ойын консолі эмуляторының мысалын пайдаланып Travis CI жүйесінде PVS-Studio қалай конфигурациялауға болады

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

Ақпарат көзі: www.habr.com

пікір қалдыру