Travis CI jẹ iṣẹ wẹẹbu pinpin fun kikọ ati sọfitiwia idanwo ti o lo GitHub bi alejo gbigba koodu orisun. Ni afikun si awọn oju iṣẹlẹ iṣẹ ti o wa loke, o le ṣafikun ọpẹ tirẹ si awọn aṣayan atunto lọpọlọpọ. Ninu nkan yii a yoo tunto Travis CI lati ṣiṣẹ pẹlu PVS-Studio nipa lilo apẹẹrẹ koodu PPSSPP.
Ifihan
Eto Travis CI
A yoo nilo ibi ipamọ kan lori GitHub, nibiti iṣẹ akanṣe ti a nilo wa, bakanna bi bọtini fun PVS-Studio (o le gba
Jẹ ki a lọ si aaye naa
Fun idanwo naa, Mo forked PPSSPP.
A mu ibi ipamọ ṣiṣẹ ti a fẹ gba:
Ni akoko yii, Travis CI ko le kọ iṣẹ akanṣe wa nitori ko si awọn ilana fun kikọ. Nitorina o to akoko fun iṣeto ni.
Lakoko itupalẹ, diẹ ninu awọn oniyipada yoo wulo fun wa, fun apẹẹrẹ, bọtini fun PVS-Studio, eyiti yoo jẹ aifẹ lati pato ninu faili iṣeto ni. Nitorinaa jẹ ki a ṣafikun awọn oniyipada ayika ni lilo awọn eto kikọ ni Travis CI:
A yoo nilo:
- PVS_USERNAME - orukọ olumulo
- PVS_KEY - bọtini
- MAIL_USER - imeeli ti yoo lo lati fi ijabọ naa ranṣẹ
- MAIL_PASSWORD - ọrọ igbaniwọle imeeli
Awọn ti o kẹhin meji ni o wa iyan. Iwọnyi yoo ṣee lo lati fi awọn abajade ranṣẹ nipasẹ meeli. Ti o ba fẹ kaakiri ijabọ naa ni ọna miiran, iwọ ko nilo lati tọka wọn.
Nitorinaa, a ti ṣafikun awọn oniyipada ayika ti a nilo:
Bayi jẹ ki a ṣẹda faili kan .travis.yml ati ki o gbe o ni root ti ise agbese. PPSSPP ti ni faili iṣeto ni tẹlẹ fun Travis CI, sibẹsibẹ, o tobi ju ati pe ko yẹ fun apẹẹrẹ, nitorinaa a ni lati jẹ ki o rọrun pupọ ki o fi awọn eroja ipilẹ silẹ nikan.
Ni akọkọ, jẹ ki a tọka ede naa, ẹya Ubuntu Linux ti a fẹ lati lo ninu ẹrọ foju, ati awọn idii pataki fun kikọ:
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'
Gbogbo awọn idii ti a ṣe akojọ ni a nilo ni iyasọtọ fun PPSSPP.
Bayi a tọkasi matrix ijọ:
matrix:
include:
- os: linux
compiler: "gcc"
env: PPSSPP_BUILD_TYPE=Linux PVS_ANALYZE=Yes
- os: linux
compiler: "clang"
env: PPSSPP_BUILD_TYPE=Linux
Diẹ diẹ sii nipa apakan matrix. Ni Travis CI, awọn ọna meji wa lati ṣẹda awọn aṣayan kikọ: akọkọ ni lati ṣafihan atokọ ti awọn olupilẹṣẹ, awọn iru ẹrọ ṣiṣe, awọn oniyipada ayika, ati bẹbẹ lọ, lẹhin eyi matrix ti gbogbo awọn akojọpọ ti o ṣeeṣe ti ipilẹṣẹ; awọn keji jẹ ẹya fojuhan itọkasi ti awọn matrix. Nitoribẹẹ, o le darapọ awọn ọna meji wọnyi ki o ṣafikun ọran alailẹgbẹ kan, tabi, ni ilodi si, yọkuro rẹ ni lilo apakan aiṣe. O le ka diẹ sii nipa eyi ni
Gbogbo ohun ti o ku ni lati pese awọn ilana apejọ kan pato-iṣẹ:
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 gba ọ laaye lati ṣafikun awọn aṣẹ tirẹ fun ọpọlọpọ awọn ipele ti igbesi aye ẹrọ foju kan. Abala ṣaaju_fi sori ẹrọ ṣiṣẹ ṣaaju fifi sori awọn idii. Lẹhinna fi sori ẹrọ, eyiti o tẹle fifi sori ẹrọ ti awọn idii lati atokọ naa addons.apteyi ti a tọka si loke. Awọn ijọ ara gba ibi ni akosile. Ti ohun gbogbo ba lọ daradara, lẹhinna a rii ara wa ninu lehin_aseyori (o jẹ ni yi apakan ti a yoo ṣiṣe aimi onínọmbà). Iwọnyi kii ṣe gbogbo awọn igbesẹ ti o le yipada, ti o ba nilo diẹ sii, lẹhinna o yẹ ki o wo inu
Fun irọrun kika, awọn aṣẹ ni a gbe sinu iwe afọwọkọ lọtọ .travis.sh, eyi ti o ti gbe ni ise agbese root root.
Nitorinaa a ni faili atẹle .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
Ṣaaju fifi sori awọn idii, a yoo ṣe imudojuiwọn awọn submodules. Eyi nilo lati kọ PPSSPP. Jẹ ki a ṣafikun iṣẹ akọkọ si .travis.sh (ṣe akiyesi itẹsiwaju):
travis_before_install() {
git submodule update --init --recursive
}
Bayi a wa taara lati ṣeto ifilọlẹ laifọwọyi ti PVS-Studio ni Travis CI. Ni akọkọ a nilo lati fi sori ẹrọ package PVS-Studio lori eto naa:
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
}
Ni ibẹrẹ iṣẹ naa travis_fi sori ẹrọ a fi sori ẹrọ awọn akopọ ti a nilo nipa lilo awọn oniyipada ayika. Nigbana ti o ba ti oniyipada $PVS_ANALYZE awọn itaja iye Bẹẹni (a tọka si ni apakan env nigba Kọ matrix iṣeto ni), a fi sori ẹrọ ni package pvs-isise. Ni afikun si eyi, awọn idii tun jẹ itọkasi libio-socket-ssl-perl и libnet-ssleay-perl, sibẹsibẹ, wọn nilo fun awọn esi ifiweranṣẹ, nitorina wọn ko ṣe pataki ti o ba ti yan ọna miiran fun jiṣẹ ijabọ rẹ.
Išẹ download_jade gbigba lati ayelujara ati ṣiṣafipamọ iwe ipamọ ti a sọ pato:
download_extract() {
aria2c -x 16 $1 -o $2
tar -xf $2
}
O to akoko lati fi ise agbese na papọ. Eyi ṣẹlẹ ni apakan akosile:
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
}
Ni otitọ, eyi jẹ atunto atilẹba ti o rọrun, ayafi fun awọn laini wọnyi:
if [ "$PVS_ANALYZE" = "Yes" ]; then
CMAKE_ARGS="-DCMAKE_EXPORT_COMPILE_COMMANDS=On ${CMAKE_ARGS}"
fi
Ni yi apakan ti koodu ti a ṣeto fun ṣe flag fun okeere akopo ase. Eyi jẹ pataki fun olutupalẹ koodu aimi. O le ka diẹ sii nipa eyi ninu nkan naa "
Ti apejọ naa ba ṣaṣeyọri, lẹhinna a gba lati lehin_aseyori, nibiti a ti ṣe itupalẹ aimi:
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
}
Jẹ ki a ṣe akiyesi diẹ sii ni awọn ila wọnyi:
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
Laini akọkọ ṣe agbekalẹ faili iwe-aṣẹ lati orukọ olumulo ati bọtini ti a sọ ni ibẹrẹ ibẹrẹ nigbati o ṣeto awọn oniyipada agbegbe Travis CI.
Laini keji bẹrẹ itupalẹ taara. Flag -j kn awọn nọmba ti awon fun onínọmbà, flag -l tọkasi iwe-ašẹ, flag -o asọye faili fun o wu awọn àkọọlẹ, ati awọn Flag -disableLicenseExpirationCheck beere fun awọn ẹya idanwo, niwon nipasẹ aiyipada pvs-isise-itupalẹ yoo kilo fun olumulo pe iwe-aṣẹ ti fẹrẹ pari. Lati yago fun eyi lati ṣẹlẹ, o le pato asia yii.
Faili log ni iṣelọpọ aise ti ko le ka laisi iyipada, nitorinaa o gbọdọ kọkọ jẹ ki faili le ṣee ka. Jẹ ká ṣe awọn àkọọlẹ nipasẹ plog-iyipada, ati abajade jẹ faili html.
Ni apẹẹrẹ yii, Mo pinnu lati firanṣẹ awọn ijabọ nipasẹ meeli nipa lilo aṣẹ naa imeeli.
Bi abajade, a ni faili atẹle .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;
Bayi o to akoko lati Titari awọn ayipada si ibi ipamọ git, lẹhin eyiti Travis CI yoo ṣiṣẹ kọ laifọwọyi. Tẹ “ppsspp” lati lọ si awọn ijabọ kikọ:
A yoo wo akopọ ti kikọ lọwọlọwọ:
Ti o ba ti pari ni aṣeyọri, a yoo gba imeeli pẹlu awọn abajade ti itupalẹ aimi. Dajudaju, fifiranṣẹ kii ṣe ọna kan ṣoṣo lati gba ijabọ kan. O le yan eyikeyi ọna imuse. Ṣugbọn o ṣe pataki lati ranti pe lẹhin ti ikole ti pari, kii yoo ṣee ṣe lati wọle si awọn faili ẹrọ foju.
Lakotan aṣiṣe
A ti pari ni aṣeyọri apakan ti o nira julọ. Bayi jẹ ki a rii daju pe gbogbo akitiyan wa tọ si. Jẹ ki a wo diẹ ninu awọn aaye ti o nifẹ lati ijabọ itupalẹ aimi ti o wa si mi nipasẹ meeli (kii ṣe lasan ni MO tọka si).
Imudara ti o lewu
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 ) );
}
Ikilọ PVS-Studio:
Nkan koodu yii wa ninu module hashing to ni aabo, sibẹsibẹ, o ni abawọn aabo to ṣe pataki (
; Line 355
mov r8d, 20
xor edx, edx
lea rcx, QWORD PTR sum$[rsp]
call memset
; Line 356
Ohun gbogbo wa ni ibere ati iṣẹ iranti ti wa ni pa, nitorina ìkọlélórí pataki data ni Ramu, sibẹsibẹ, ma yọ o kan sibẹsibẹ. Jẹ ki a wo atokọ apejọ ti ẹya Tu silẹ pẹlu iṣapeye:
; 354 :
; 355 : memset( sum, 0, sizeof( sum ) );
; 356 :}
Gẹgẹbi a ti le rii lati atokọ naa, alakojo kọju ipe naa iranti. Eyi jẹ nitori otitọ pe ninu iṣẹ naa Oju 1 lẹhin ipe iranti ko si siwaju sii tọka si be ctx. Nitorina, awọn alakojo ri ko si ojuami ni a jafara isise akoko ìkọlélórí iranti ti o ti wa ni ko lo ni ojo iwaju. O le ṣatunṣe eyi nipa lilo iṣẹ naa RtlSecureZeroMemory tabi
Ti o tọ:
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 ) );
}
Ifiwera ti ko wulo
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);
}
}
Ikilọ PVS-Studio:
San ifojusi si ẹka miiran fun igba akọkọ if. Awọn koodu yoo wa ni ṣiṣẹ nikan ti o ba gbogbo awọn ipo osi> 0xFFFF || rightvol> 0xFFFF || osi <0 || apa ọtun <0 yoo tan jade lati wa ni eke. Nitorinaa, a gba awọn alaye wọnyi, eyiti yoo jẹ otitọ fun ẹka miiran: osi <= 0xFFFF, ọtunvol <= 0xFFFF, osi>= 0 и ọtunvol>= 0. Ṣe akiyesi awọn gbolohun meji ti o kẹhin. Ṣe o jẹ oye lati ṣayẹwo kini ipo pataki fun ipaniyan nkan ti koodu yii?
Nitorinaa a le yọkuro awọn alaye majemu wọnyi lailewu:
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);
}
}
Oju iṣẹlẹ miiran. Iru aṣiṣe kan wa ti o farapamọ lẹhin awọn ipo laiṣe wọnyi. Boya wọn ko ṣayẹwo ohun ti a beere.
Konturolu + C Ctrl + V kọlu Pada
static u32 scePsmfSetPsmf(u32 psmfStruct, u32 psmfData) {
if (!Memory::IsValidAddress(psmfData) ||
!Memory::IsValidAddress(psmfData)) {
return hleReportError(ME, SCE_KERNEL_ERROR_ILLEGAL_ADDRESS, "bad address");
}
....
}
San ifojusi si ayẹwo inu if. Ṣe o ko ro pe o jẹ ajeji pe a ṣayẹwo ti adirẹsi naa ba wulo? psmfData, lemeji bi Elo? Nitorinaa eyi dabi ajeji si mi… Ni otitọ, eyi jẹ, nitorinaa, typo kan, ati pe imọran ni lati ṣayẹwo awọn aye titẹ sii mejeeji.
Aṣayan ti o tọ:
static u32 scePsmfSetPsmf(u32 psmfStruct, u32 psmfData) {
if (!Memory::IsValidAddress(psmfStruct) ||
!Memory::IsValidAddress(psmfData)) {
return hleReportError(ME, SCE_KERNEL_ERROR_ILLEGAL_ADDRESS, "bad address");
}
....
}
Oniyipada gbagbe
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");
}
....
}
Ikilọ PVS-Studio:
Aṣiṣe yii wa ninu folda naa ext, nitorina ko ṣe pataki si iṣẹ akanṣe naa, ṣugbọn a ti rii kokoro naa ṣaaju ki Mo ṣe akiyesi rẹ, nitorinaa Mo pinnu lati lọ kuro. Lẹhinna, nkan yii kii ṣe nipa atunwo awọn aṣiṣe, ṣugbọn nipa iṣọpọ pẹlu Travis CI, ati pe ko si iṣeto ti olutupalẹ ti a ṣe.
Oniyipada iwọn ti wa ni ipilẹṣẹ nipasẹ ibakan, sibẹsibẹ, ko lo ni gbogbo koodu, ọtun si isalẹ lati oniṣẹ if, eyi ti, dajudaju, yoo fun èké lakoko ti o n ṣayẹwo awọn ipo, nitori, bi a ṣe ranti, iwọn dogba si odo. Awọn sọwedowo atẹle tun ko ni oye.
Nkqwe, awọn onkowe ti awọn koodu ajeku gbagbe lati tun oniyipada iwọn ṣaaju pe.
Duro
Eyi ni ibiti a ti le pari pẹlu awọn aṣiṣe. Idi ti nkan yii ni lati ṣafihan iṣẹ ti PVS-Studio papọ pẹlu Travis CI, kii ṣe itupalẹ iṣẹ naa daradara bi o ti ṣee. Ti o ba fẹ awọn aṣiṣe nla ati lẹwa diẹ sii, o le ṣe ẹwà nigbagbogbo wọn
ipari
Lilo awọn iṣẹ wẹẹbu lati kọ awọn iṣẹ akanṣe pọ pẹlu iṣe ti itupalẹ afikun gba ọ laaye lati wa ọpọlọpọ awọn iṣoro lẹsẹkẹsẹ lẹhin koodu idapọ. Bibẹẹkọ, kikọ kan le ma to, nitorinaa iṣeto idanwo papọ pẹlu itupalẹ aimi yoo mu didara koodu naa pọ si ni pataki.
wulo awọn ọna asopọ
Ti o ba fẹ pin nkan yii pẹlu awọn olugbo ti o sọ Gẹẹsi, jọwọ lo ọna asopọ itumọ: Maxim Zvyagintsev.
orisun: www.habr.com