ProHoster > Blog > башкаруу > 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 C.I.. GitHub каттоо эсебиңизди колдонууга уруксат бергенден кийин, биз репозиторийлердин тизмесин көрөбүз:
Сыноо үчүн мен PPSSPPти айрыдым.
Биз чогулткубуз келген репозиторийди иштетебиз:
Учурда Travis CI биздин долбоорду кура албайт, анткени куруу боюнча көрсөтмөлөр жок. Ошентип, конфигурацияга убакыт келди.
Талдоо учурунда кээ бир өзгөрмөлөр бизге пайдалуу болот, мисалы, PVS-Studio үчүн ачкыч, аны конфигурация файлында көрсөтүү жагымсыз болот. Ошентип, келгиле, Travis CIдеги куруу жөндөөлөрүн колдонуп чөйрө өзгөрмөлөрүн кошолу:
Биз керек:
PVS_USERNAME - колдонуучунун аты
PVS_KEY - ачкыч
MAIL_USER - отчет жөнөтүү үчүн колдонула турган электрондук почта
MAIL_PASSWORD - электрондук почтанын сырсөзү
Акыркы экөө милдеттүү эмес. Булар натыйжаларды почта аркылуу жөнөтүү үчүн колдонулат. Эгерде сиз отчетту башка жол менен жайылтууну кааласаңыз, анда аларды көрсөтүүнүн кереги жок.
Ошентип, биз керектүү чөйрө өзгөрмөлөрүн коштук:
Эми файл түзөлү .travis.yml жана долбоордун тамырына жайгаштырыңыз. PPSSPPде Travis CI үчүн конфигурация файлы мурунтан эле бар болчу, бирок ал өтө чоң жана мисал үчүн таптакыр жараксыз болгондуктан, биз аны абдан жөнөкөйлөштүрүүгө жана негизги элементтерди гана калтырууга туура келди.
Биринчиден, келгиле, тилди, биз виртуалдык машинада колдонгубуз келген Ubuntu Linux версиясын жана куруу үчүн керектүү пакеттерди көрсөтөлү:
Тизмеде көрсөтүлгөн бардык пакеттер 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 документтери.
Болгону долбоорго тиешелүү монтаждоо көрсөтмөлөрүн берүү гана калды:
Travis CI сизге виртуалдык машинанын жашоосунун ар кандай этаптары үчүн өзүңүздүн буйруктарыңызды кошууга мүмкүндүк берет. Бөлүм орнотуудан мурун пакеттерди орнотуудан мурун аткарылган. Анда орнотуу, бул тизмеден пакеттерди орнотуудан кийин addons.aptбиз жогоруда көрсөткөн. Жыйындын өзү болуп өтөт кол шрифти. Эгер баары жакшы болсо, анда биз өзүбүздү табабыз ийгиликтен кийин (бул бөлүмдө биз статикалык талдоо жүргүзөбүз). Бул өзгөртүүгө боло турган бардык кадамдар эмес, эгер сизге көбүрөөк керек болсо, анда сиз киришиңиз керек Travis CI документтери.
Окууга жеңил болуу үчүн буйруктар өзүнчө сценарийге жайгаштырылды .travis.sh, ал долбоордун тамырына жайгаштырылган.
Эми биз 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, бирок, алар натыйжаларды жөнөтүү үчүн талап кылынат, ошондуктан, эгер сиз отчетуңузду жеткирүү үчүн башка ыкманы тандасаңыз, алардын кереги жок.
милдети жүктөө_үзүндү көрсөтүлгөн архивди жүктөйт жана ачат:
Долбоорду бириктирүүгө убакыт келди. Бул бөлүмдө болот кол шрифти:
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 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" баскычын чыкылдатыңыз:
Биз учурдагы курулуштун серепти көрөбүз:
Эгер куруу ийгиликтүү аяктаса, биз статикалык анализдин натыйжалары менен электрондук кат алабыз. Албетте, кат жөнөтүү отчетту алуунун жалгыз жолу эмес. Сиз каалаган ишке ашыруу ыкмасын тандай аласыз. Бирок куруу аяктагандан кийин виртуалдык машина файлдарына кирүү мүмкүн болбой турганын эстен чыгарбоо керек.
Ката корутундусу
Эң татаал бөлүгүн ийгиликтүү аяктадык. Эми биздин бардык аракетибиздин акыбети кайтканына ынаналы. Мага почта аркылуу келген статикалык талдоо отчетунан кээ бир кызыктуу учурларды карап көрөлү (мен бекеринен айткан эмесмин).
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дагы маанилүү маалыматтардын үстүнө жазылат, бирок азырынча кубанбаңыз. Оптималдаштыруу менен релиз версиясынын ассамблея тизмесин карап көрөлү:
Тизмеден көрүнүп тургандай, компилятор чакырууга көңүл бурбай койгон memeset. Бул функцияда болгонуна байланыштуу sha1 чалуудан кийин memeset структурасына дагы шилтеме жок ctx. Демек, компилятор келечекте колдонулбай турган эстутумду кайра жазуу үчүн процессордун убактысын текке кетирүүнүн эч кандай маанисин көрбөйт. Функцияны колдонуу менен муну оңдой аласыз RtlSecureZeroMemory же ушундай эле ага.
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);
}
}
Башка сценарий. Бул ашыкча шарттардын артында кандайдыр бир ката бар. Балким, алар эмне талап кылынарын текшеришпеди.
Ичиндеги чекке көңүл буруңуз if. Даректин жарактуу-жоктугун текшергенибиз кызык эмеспи? psmfData, эки эсе көп? Демек, бул мага кызыктай сезилет... Чынында, бул, албетте, ката жана эки киргизүү параметрин текшерүү идеясы болгон.
Бул ката папкада жайгашкан доб, ошондуктан долбоорго чындап тиешеси жок, бирок мүчүлүштүк мен байкаганга чейин табылган, ошондуктан мен аны калтырууну чечтим. Анткени, бул макала каталарды карап чыгуу жөнүндө эмес, Travis CI менен интеграциялоо жөнүндө жана анализатордун конфигурациясы жүргүзүлгөн эмес.
Variable көлөм туруктуу менен инициализацияланат, бирок ал операторго чейин коддо такыр колдонулбайт if, бул, албетте, берет жалган шарттарды текшерип жатканда, анткени, биз эстегендей, көлөм нөлгө барабар. Кийинки текшерүүлөрдүн да мааниси жок.
Сыягы, код фрагментинин автору өзгөрмөнүн үстүнө жазууну унутуп койгон окшойт көлөм буга чейин.
токтотуу
Бул жерде, балким, каталар менен бүтүрөбүз. Бул макаланын максаты Travis CI менен бирге PVS-Studio ишин көрсөтүү жана долбоорду мүмкүн болушунча кылдат талдоо эмес. Эгер сиз чоңураак жана сулуураак каталарды кааласаңыз, аларга дайыма суктансаңыз болот бул жерде :).
жыйынтыктоо
Кошумча талдоо практикасы менен бирге долбоорлорду куруу үчүн веб-кызматтарды колдонуу кодду бириктиргенден кийин дароо көптөгөн көйгөйлөрдү табууга мүмкүндүк берет. Бирок, бир куруу жетишсиз болушу мүмкүн, андыктан статикалык талдоо менен бирге тестирлөөнү орнотуу коддун сапатын бир топ жакшыртат.