I-Travis CI yinkonzo yewebhu esasazwayo yokwakha kunye nokuvavanya isofthiwe esebenzisa i-GitHub njengomthombo wekhowudi yokusingatha. Ukongeza kwezi meko zokusebenza zingentla, unokongeza owakho umbulelo kwiinketho zoqwalaselo olubanzi. Kule nqaku siza kuqwalasela iTravis CI ukuba isebenze nePVS-Studio usebenzisa umzekelo wekhowudi yePPSSPP.
Intshayelelo
Ukumisela iTravis CI
Siza kudinga indawo yokugcina kwi-GitHub, apho iprojekthi esiyifunayo ikhona, kunye nesitshixo se-PVS-Studio (unokufumana
Makhe siye kwindawo
Kuvavanyo, ndiyifake ngefolokhwe iPPSSPP.
Sivula indawo yokugcina esifuna ukuyiqokelela:
Okwangoku, iTravis CI ayikwazi ukwakha iprojekthi yethu kuba akukho miyalelo yokwakha. Ngoko lixesha loqwalaselo.
Ngethuba lokuhlalutya, ezinye izinto eziguquguqukayo ziya kuba luncedo kuthi, umzekelo, isitshixo se-PVS-Studio, esiya kuba yinto engathandekiyo ukucacisa kwifayile yoqwalaselo. Ke ngoko masiyongeze ukuguquguquka kokusingqongileyo sisebenzisa useto lokwakha kwiTravis CI:
Siza kudinga:
- PVS_USERNAME - igama lomsebenzisi
- PVS_KEY - isitshixo
- MAIL_USER-i-imeyile eza kusetyenziswa ukuthumela ingxelo
- MAIL_PASSWORD-i-imeyile yokugqitha
Ezimbini zokugqibela azikhethi. Ezi ziya kusetyenziselwa ukuthumela iziphumo ngeposi. Ukuba ufuna ukuhambisa ingxelo ngenye indlela, awudingi ukubabonisa.
Ke, songeze izinto eziguquguqukayo zokusingqongileyo esizifunayo:
Ngoku masenze ifayile .travis.yml kwaye uyibeke kwingcambu yeprojekthi. I-PPSSPP yayisele inefayile yoqwalaselo yeTravis CI, nangona kunjalo, yayinkulu kakhulu kwaye ayifanelekanga ngokupheleleyo kumzekelo, ngoko kwafuneka ukuba siyenze lula kakhulu kwaye sishiye kuphela izinto ezisisiseko.
Okokuqala, masibonise ulwimi, inguqulelo ye-Ubuntu Linux esifuna ukuyisebenzisa kumatshini wenyani, kunye neepakethe eziyimfuneko zokwakha:
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'
Zonke iipakethe ezidwelisiweyo zifunelwa ngokukodwa iPPSSPP.
Ngoku sibonisa i-matrix yendibano:
matrix:
include:
- os: linux
compiler: "gcc"
env: PPSSPP_BUILD_TYPE=Linux PVS_ANALYZE=Yes
- os: linux
compiler: "clang"
env: PPSSPP_BUILD_TYPE=Linux
Kancinci ngakumbi malunga necandelo Matrix. Kwi-Travis CI, kukho iindlela ezimbini zokwenza ukhetho lokwakha: eyokuqala kukucacisa uluhlu lwabaqulunqi, iintlobo zenkqubo yokusebenza, ukuguquguquka kwemekobume, njl., emva koko i-matrix yazo zonke iinhlanganisela ezinokwenzeka zenziwe; okwesibini luphawu olucacileyo lwematrix. Ewe, unokudibanisa ezi ndlela zimbini kwaye wongeze imeko eyodwa, okanye, ngokuchaseneyo, ungayibandakanyi usebenzisa icandelo. nga ndakanyi. Unokufunda ngakumbi malunga noku kwi
Ekuphela kwento eseleyo kukubonelela ngemiyalelo yendibano ethe ngqo yeprojekthi:
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
ITravis CI ikuvumela ukuba wongeze eyakho imiyalelo yezigaba ezahlukeneyo zobomi bomatshini wenyani. Icandelo phambi_kufakela yenziwe phambi kokufaka iipakethe. Emva koko fakela, elandela ukufakwa kweepakethe kuluhlu addons.aptesisibonise ngasentla. Indibano ngokwayo iqhubeka elishicilelwe. Ukuba yonke into ihambe kakuhle, ngoko sizifumana singaphakathi emva_kwempumelelo (kweli candelo siya kuqhuba uhlalutyo olungatshintshiyo). La ayingawo onke amanyathelo anokuguqulwa, ukuba ufuna ngaphezulu, kuya kufuneka ujonge ngaphakathi
Ukuze kube lula ukufunda, imiyalelo yafakwa kwiskripthi esahlukileyo .travis.sh, ebekwe kwingcambu yeprojekthi.
Ngoko ke sinefayile elandelayo .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
Ngaphambi kokufaka iipakethe, siya kuhlaziya i-submodules. Oku kuyafuneka ukwakha iPPSSPP. Masidibanise umsebenzi wokuqala ku .travis.sh (qaphela ulwandiso):
travis_before_install() {
git submodule update --init --recursive
}
Ngoku siza ngqo ukuseta uphehlelelo oluzenzekelayo lwePVS-Studio kwiTravis CI. Okokuqala kufuneka sifake iphakheji ye-PVS-Studio kwisistim:
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
}
Ekuqaleni komsebenzi travis_install sifaka abahlanganisi esibafunayo sisebenzisa izinto eziguquguqukayo zokusingqongileyo. Emva koko ukuba i-variable $PVS_ANALYZE ixabiso levenkile Ewe (siyibonisile kwicandelo Env ngexesha lokwakhiwa kwe-matrix), sifaka iphakheji pvs-studio. Ukongeza koku, iipakethe nazo zibonisiwe libio-socket-ssl-perl ΠΈ libnet-ssleay-perl, nangona kunjalo, ziyafuneka kwiziphumo zokuposa, ngoko aziyomfuneko ukuba ukhethe enye indlela yokuhambisa ingxelo yakho.
Umsebenzi download_extract Khuphela kwaye ukhuphe indawo yokugcina ekhankanyiweyo:
download_extract() {
aria2c -x 16 $1 -o $2
tar -xf $2
}
Lixesha lokuhlanganisa iprojekthi. Oku kwenzeka kwicandelo elishicilelwe:
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
}
Enyanisweni, olu luqwalaselo olwenziwe lula, ngaphandle kwale migca:
if [ "$PVS_ANALYZE" = "Yes" ]; then
CMAKE_ARGS="-DCMAKE_EXPORT_COMPILE_COMMANDS=On ${CMAKE_ARGS}"
fi
Kweli candelo lekhowudi simisela cmake iflegi yokuthumela ngaphandle imiyalelo yokuhlanganiswa. Oku kuyimfuneko kwi-static code analyzer. Unokufunda ngakumbi malunga noku kwinqaku elithi "
Ukuba indibano ibe yimpumelelo, ngoko sifika kuyo emva_kwempumelelo, apho senza uhlalutyo olungatshintshiyo:
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
}
Masijonge ngakumbi le migca ilandelayo:
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
Umgca wokuqala uvelisa ifayile yelayisenisi ukusuka kwigama lomsebenzisi kunye nesitshixo esisichazileyo kwasekuqaleni xa useka iTravis CI yemo eguquguqukayo.
Umgca wesibini uqala uhlalutyo ngokuthe ngqo. Iflegi -j icwangcisa inani lemisonto yohlalutyo, iflegi -l ibonisa ilayisenisi, iflegi -o ichaza ifayile yeelog ezikhuphayo, kunye neflegi -khubaza iLayisensiExpirationCheck efunekayo kwiinguqulelo zolingo, ukusukela ngokungagqibekanga pvs-studio-analyzer iyakulumkisa umsebenzisi ukuba ilayisenisi sele izakuphelelwa. Ukuthintela oku kungenzeki, ungakhankanya le flegi.
Ifayile yelog iqulethe imveliso ekrwada engenakufundwa ngaphandle kokuguqulwa, ngoko ke kufuneka uqale wenze ifayile ifundeke. Masidlule iinkuni iplagi-converter, kwaye imveliso yifayile ye html.
Kulo mzekelo, ndagqiba ekubeni ndithumele iingxelo ngeposi ndisebenzisa umyalelo thumela i-imeyile.
Ngenxa yoko, sifumene le fayile ilandelayo .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;
Ngoku lixesha lokutyhala utshintsho kwindawo yokugcina i-git, emva koko iTravis CI iya kuqhuba ngokuzenzekelayo ukwakha. Cofa kwi "ppsspp" ukuya kwiingxelo zokwakha:
Siza kubona isishwankathelo solwakhiwo lwangoku:
Ukuba ukwakhiwa kugqitywe ngempumelelo, siya kufumana i-imeyile eneziphumo zohlalutyo lwe-static. Kakade ke, ukuposa ayikuphela kwendlela yokufumana ingxelo. Unokukhetha nayiphi na indlela yokuphumeza. Kodwa kubalulekile ukukhumbula ukuba emva kokuba ukwakhiwa kugqityiwe, akuyi kuba nako ukufikelela kwiifayile zoomatshini.
Imposiso isishwankathelo
Sigqibe ngempumelelo eyona ndawo inzima. Ngoku masiqinisekise ukuba yonke imigudu yethu ifanelekile. Makhe sijonge amanqaku anomdla avela kwingxelo yohlalutyo olungatshintshiyo oluze kum ngeposi (yayingeyonto endiyibonisileyo).
Ukulungiselela okuyingozi
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 isilumkiso:
Esi siqwenga sekhowudi sikwimodyuli ekhuselekileyo ye-hashing, nangona kunjalo, iqulethe isiphene sokhuseleko esinzulu (
; Line 355
mov r8d, 20
xor edx, edx
lea rcx, QWORD PTR sum$[rsp]
call memset
; Line 356
Yonke into ime ngocwangco kunye nomsebenzi memeset iyenziwa, ngaloo ndlela ibhala ngaphezulu idatha ebalulekileyo kwi-RAM, nangona kunjalo, musa ukuvuya okwangoku. Makhe sijonge kuluhlu lwendibano yenguqulelo yoKhupho ngokulungiselela:
; 354 :
; 355 : memset( sum, 0, sizeof( sum ) );
; 356 :}
Njengoko kunokubonwa kuluhlu, umqokeleli akawuhoyanga umnxeba memeset. Oku kungenxa yokuba kumsebenzi sha1 emva kwefowuni memeset akusekho kubhekiswa kulwakhiwo ctx. Ke ngoko, umqokeleli akaboni sizathu sokuchitha ixesha leprosesa ebhala ngaphezulu kwememori engasetyenziswanga kwixesha elizayo. Ungalungisa oku ngokusebenzisa umsebenzi RtlSecureZeroMemory okanye
Ngokuchanekileyo:
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 ) );
}
Uthelekiso olungeyomfuneko
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 isilumkiso:
Nikela ingqalelo kwelinye isebe okokuqala if. Ikhowudi iya kuphunyezwa kuphela ukuba zonke iimeko leftvol > 0xFFFF || rightvol > 0xFFFF || leftvol < 0 || rightvol <0 iya kuba bubuxoki. Ke ngoko, sifumana ezi nkcazo zilandelayo, eziya kuba yinyaniso kwelinye isebe: leftvol <= 0xFFFF, rightvol <= 0xFFFF, leftvol >= 0 ΠΈ rightvol >= 0. Phawula iingxelo ezimbini zokugqibela. Ngaba kunengqiqo ukujonga ukuba yintoni imeko eyimfuneko yokuphunyezwa kwesi siqwenga sekhowudi?
Ke sinokususa ngokukhuselekileyo ezi nkcazo zinemiqathango:
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);
}
}
Enye imeko. Kukho uhlobo oluthile lwempazamo efihliweyo emva kwezi meko zingafunekiyo. Mhlawumbi abazange bajonge oko kwakufuneka.
Ctrl+C Ctrl+V Ukubetha ngasemva
static u32 scePsmfSetPsmf(u32 psmfStruct, u32 psmfData) {
if (!Memory::IsValidAddress(psmfData) ||
!Memory::IsValidAddress(psmfData)) {
return hleReportError(ME, SCE_KERNEL_ERROR_ILLEGAL_ADDRESS, "bad address");
}
....
}
Nika ingqalelo kwitshekhi ngaphakathi if. Awucingi ukuba iyamangalisa into yokuba sijonge ukuba idilesi iyasebenza na? psmfData, ngokuphindwe kabini? Ngoko oku kubonakala kungaqhelekanga kum ... Enyanisweni, oku, ngokuqinisekileyo, i-typo, kwaye ingcamango yayikukujonga zombini iiparameters zokufaka.
Inketho echanekileyo:
static u32 scePsmfSetPsmf(u32 psmfStruct, u32 psmfData) {
if (!Memory::IsValidAddress(psmfStruct) ||
!Memory::IsValidAddress(psmfData)) {
return hleReportError(ME, SCE_KERNEL_ERROR_ILLEGAL_ADDRESS, "bad address");
}
....
}
Uguquguquko olulityelweyo
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 isilumkiso:
Le mpazamo ikwisiqulathi seefayili ngaphandle, ngoko ke ayifanelekanga kwiprojekthi, kodwa i-bug yafunyanwa ngaphambi kokuba ndiyiqaphele, ngoko ke ndagqiba ekubeni ndiyishiye. Emva kwayo yonke loo nto, eli nqaku alikho malunga nokuphonononga iimpazamo, kodwa malunga nokudibanisa neTravis CI, kwaye akukho lungelelwaniso lwe-analyzer lwenziwa.
Eyahlukileyo ubungakanani iqalwa ngokuqhubekayo, nangona kunjalo, ayisetyenziswanga konke konke kwikhowudi, ezantsi ukuya kumqhubi if, leyo, ngokuqinisekileyo, inika amanga ngelixa sijonga iimeko, kuba, njengoko sikhumbula, ubungakanani ilingana no-zero. Iitshekhi ezilandelayo nazo azinangqiqo.
Kuyabonakala ukuba, umbhali weqhekeza lekhowudi ulibale ukubhala ngaphezulu ukuguquguquka ubungakanani ngaphambi koko.
Yeka
Apha kulapho siza kuphelela khona ngeempazamo. Injongo yale nqaku kukubonisa umsebenzi we-PVS-Studio kunye neTravis CI, kwaye ungayihlalutyi iprojekthi ngokucokisekileyo. Ukuba ufuna iimpazamo ezinkulu kwaye ezintle ngakumbi, unokuhlala uzincoma
isiphelo
Ukusebenzisa iinkonzo zewebhu ukwakha iiprojekthi kunye nokuziqhelanisa nohlalutyo olongezelelweyo kukuvumela ukuba ufumane iingxaki ezininzi ngokukhawuleza emva kokudibanisa ikhowudi. Nangona kunjalo, isakhiwo esisodwa singenako ngokwaneleyo, ngoko ukuseta uvavanyo kunye nohlalutyo lwe-static luya kuphucula kakhulu umgangatho wekhowudi.
amakhonkco aluncedo
Ukwazisa iPVS-Studio kwiLinux kunye neMacOS Ukuphehlelela iPVS-Studio kwiDocker Travis CI Documentation
Ukuba ufuna ukwabelana ngeli nqaku kunye nabaphulaphuli abathetha isiNgesi, nceda usebenzise ikhonkco lokuguqulela: UMaxim Zvyagintsev.
umthombo: www.habr.com