I-Travis CI iyisevisi yewebhu esabalalisiwe yokwakha nokuhlola isofthiwe esebenzisa i-GitHub njengokusingatha ikhodi yomthombo. Ngokungeziwe kulezi zimo zokusebenza ezingenhla, ungakwazi ukwengeza ukubonga kwakho ezinkethweni ezibanzi zokumisa. Kulesi sihloko sizolungiselela i-Travis CI ukuthi isebenze ne-PVS-Studio sisebenzisa isibonelo sekhodi ye-PPSSPP.
Isingeniso
Isetha i-Travis CI
Sizodinga indawo yokugcina ku-GitHub, lapho iphrojekthi esiyidingayo itholakala, kanye nokhiye we-PVS-Studio (ungathola
Asiye esizeni
Ukuze kuhlolwe, ngifake i-PPSSPP ngemfoloko.
Senza kusebenze inqolobane esifuna ukuyiqoqa:
Okwamanje, i-Travis CI ayikwazi ukwakha iphrojekthi yethu ngoba ayikho imiyalelo yokwakha. Ngakho sekuyisikhathi sokumisa.
Ngesikhathi sokuhlaziya, ezinye izinto eziguquguqukayo zizoba usizo kithi, ngokwesibonelo, ukhiye we-PVS-Studio, okungeke kuthandeke ukucaciswa kufayela lokumisa. Ngakho-ke ake sengeze okuguquguqukayo kwemvelo sisebenzisa izilungiselelo zokwakha kuTravis CI:
Sizodinga:
- PVS_USERNAME - igama lomsebenzisi
- PVS_KEY - ukhiye
- MAIL_USER - i-imeyili ezosetshenziswa ukuthumela umbiko
- MAIL_PASSWORD - iphasiwedi ye-imeyili
Okubili kokugcina kungokuzithandela. Lezi zizosetshenziselwa ukuthumela imiphumela ngemeyili. Uma ufuna ukusabalalisa umbiko ngenye indlela, awudingi ukubakhombisa.
Ngakho-ke, sengeze okuguquguqukayo kwemvelo esikudingayo:
Manje ake sakhe ifayela .travis.yml futhi uyibeke kumsuka wephrojekthi. I-PPSSPP isivele inefayela lokumisa le-Travis CI, nokho, lalilikhulu kakhulu futhi lingasifanelekeli nhlobo isibonelo, ngakho kwakudingeka siyenze ibe lula kakhulu futhi sishiye izakhi eziyisisekelo kuphela.
Okokuqala, ake sikhombise ulimi, inguqulo ye-Ubuntu Linux esifuna ukuyisebenzisa emshinini obonakalayo, namaphakheji adingekayo wokwakha:
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'
Wonke amaphakheji asohlwini adingeka ku-PPSSPP kuphela.
Manje sibonisa i-matrix yomhlangano:
matrix:
include:
- os: linux
compiler: "gcc"
env: PPSSPP_BUILD_TYPE=Linux PVS_ANALYZE=Yes
- os: linux
compiler: "clang"
env: PPSSPP_BUILD_TYPE=Linux
Okuncane mayelana nesigaba Matrix. Ku-Travis CI, kunezindlela ezimbili zokudala izinketho zokwakha: eyokuqala iwukuba ucacise uhlu lwabahlanganisi, izinhlobo zesistimu yokusebenza, okuguquguqukayo kwemvelo, njll., ngemva kwalokho i-matrix yazo zonke izinhlanganisela ezingenzeka ikhiqizwa; okwesibili kuyinkomba ecacile ye-matrix. Vele, ungahlanganisa lezi zindlela ezimbili bese wengeza icala eliyingqayizivele, noma, ngokuphambene nalokho, ungalifaki usebenzisa isigaba. ungafaki. Ungafunda kabanzi ngalokhu ku
Okusele ukuhlinzeka ngemiyalo yomhlangano eqondene nephrojekthi:
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
I-Travis CI ikuvumela ukuthi ungeze imiyalo yakho ngezigaba ezahlukahlukene zempilo yomshini obonakalayo. Ingxenye ngaphambi_ukufaka ikhishwe ngaphambi kokufaka amaphakheji. Khona-ke Faka, okulandela ukufakwa kwamaphakheji ohlwini i-addons.aptesikukhombise ngenhla. Umhlangano ngokwawo wenzeka phakathi iskripthi. Uma konke kuhambe kahle, sizithola sesingenile ngemva_kwempumelelo (kulesi sigaba lapho sizosebenzisa khona ukuhlaziya okumile). Lezi akuzona zonke izinyathelo ezingashintshwa, uma udinga okwengeziwe, kufanele ubheke
Ukuze kube lula ukufunda, imiyalo yafakwa kumbhalo ohlukile .travis.sh, okubekwa empandeni yephrojekthi.
Ngakho sinefayela elilandelayo .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 amaphakheji, sizobuyekeza ama-submodule. Lokhu kuyadingeka ukuze kwakhiwe i-PPSSPP. Ake sengeze umsebenzi wokuqala ku .travis.sh (qaphela isandiso):
travis_before_install() {
git submodule update --init --recursive
}
Manje siza ngqo ekusetheni ukwethulwa okuzenzakalelayo kwe-PVS-Studio kuTravis CI. Okokuqala sidinga ukufaka iphakheji ye-PVS-Studio ohlelweni:
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 ama-compilers esiwadingayo sisebenzisa okuguquguqukayo kwemvelo. Khona-ke uma okuguquguqukayo $PVS_ANALYZE inani lezitolo Yebo (sikukhombisile esigabeni env ngesikhathi sokwakhiwa kwe-matrix), sifaka iphakheji pvs-studio. Ngaphezu kwalokhu, amaphakheji nawo ayaboniswa libio-socket-ssl-perl ΠΈ i-libnet-ssleay-perl, nokho, ayadingeka emiphumeleni yokuposa, ngakho azidingeki uma ukhethe enye indlela yokuletha umbiko wakho.
Umsebenzi download_khipha ukulanda nokukhipha ingobo yomlando eshiwo:
download_extract() {
aria2c -x 16 $1 -o $2
tar -xf $2
}
Isikhathi sokuhlanganisa iphrojekthi. Lokhu kwenzeka esigabeni iskripthi:
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
}
Eqinisweni, lokhu ukucushwa koqobo okwenziwe lula, ngaphandle kwale migqa:
if [ "$PVS_ANALYZE" = "Yes" ]; then
CMAKE_ARGS="-DCMAKE_EXPORT_COMPILE_COMMANDS=On ${CMAKE_ARGS}"
fi
Kulesi sigaba sekhodi sizibekele cmake hlaba umkhosi ngokuthekelisa imiyalo yokuhlanganiswa. Lokhu kuyadingeka ku-static code analyzer. Ungafunda kabanzi ngalokhu esihlokweni esithi β
Uma umhlangano uphumelele, khona-ke siyafika ngemva_kwempumelelo, lapho senza ukuhlaziya okumile:
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
}
Ake sibhekisise imigqa elandelayo:
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
Umugqa wokuqala ukhiqiza ifayela lelayisense egameni lomsebenzisi nokhiye esiwushilo ekuqaleni lapho sisetha okuguquguqukayo kwemvelo ye-Travis CI.
Umugqa wesibili uqala ukuhlaziya ngqo. Flag -j ibeka inani lemicu ukuze ihlaziywe, ifulegi -l ikhombisa ilayisense, ifulege -o ichaza ifayela lokukhipha izingodo, kanye nefulegi -khubazaIlayisensiYokuphelelwa yisikhathiUkuhlola edingekayo ezinguqulweni zesilingo, kusukela ngokuzenzakalelayo pvs-studio-analyzer izoxwayisa umsebenzisi ukuthi ilayisensi isizophelelwa yisikhathi. Ukuze uvimbele lokhu ukuthi kungenzeki, ungacacisa leli fulegi.
Ifayela lokungena liqukethe okukhiphayo okungaphekiwe okungenakufundeka ngaphandle kokuguqulwa, ngakho kufanele uqale wenze ifayela lifundeke. Masidlule izingodo isiguquli sepulagi, futhi okukhiphayo kuyifayela le-html.
Kulesi sibonelo, nginqume ukuthumela imibiko ngeposi ngisebenzisa umyalo i-sendmail.
Ngenxa yalokho, sithole ifayela elilandelayo .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;
Manje sekuyisikhathi sokucindezela izinguquko endaweni yokugcina ye-git, ngemuva kwalokho i-Travis CI izosebenzisa ngokuzenzakalelayo ukwakhiwa. Chofoza ku-"ppsspp" ukuze uye emibikweni yokwakha:
Sizobona isifinyezo sesakhiwo samanje:
Uma isakhiwo siqedwa ngempumelelo, sizothola i-imeyili enemiphumela yokuhlaziywa okumile. Yebo, ukuthunyelwa kweposi akuyona ukuphela kwendlela yokuthola umbiko. Ungakhetha noma iyiphi indlela yokusebenzisa. Kodwa kubalulekile ukukhumbula ukuthi ngemva kokuqedwa kokwakhiwa, ngeke kwenzeke ukufinyelela kumafayela omshini we-virtual.
Isifinyezo sephutha
Siqede ngempumelelo ingxenye enzima kakhulu. Manje asiqinisekise ukuthi yonke imizamo yethu ikufanele. Ake sibheke amaphuzu athakazelisayo avela embikweni wokuhlaziya okumile oweza kimi ngeposi (akuzange ngikubonise ngeze).
Ukwenza kahle 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 ) );
}
Isexwayiso se-PVS-Studio:
Lolu cezu lwekhodi lutholakala kumojula ye-hashing evikelekile, nokho, luqukethe iphutha elikhulu lokuphepha (
; Line 355
mov r8d, 20
xor edx, edx
lea rcx, QWORD PTR sum$[rsp]
call memset
; Line 356
Konke kuhlelekile kanye nomsebenzi i-memset iyabulawa, ngaleyo ndlela ibhala ngaphezulu idatha ebalulekile ku-RAM, nokho, ungajabuli okwamanje. Ake sibheke uhlu oluhlanganisiwe lwenguqulo ekhishiwe ngokulungiselela:
; 354 :
; 355 : memset( sum, 0, sizeof( sum ) );
; 356 :}
Njengoba kubonakala ohlwini, umdidiyeli uzibe ucingo i-memset. Lokhu kungenxa yokuthi emsebenzini sha1 ngemva kocingo i-memset akusekho ukubhekisela kusakhiwo ctx. Ngakho-ke, umdidiyeli akaboni sizathu sokumosha isikhathi sokucubungula ukubhala phezu kwememori engasetshenziswa ngokuzayo. Ungalungisa lokhu ngokusebenzisa umsebenzi I-RtlSecureZeroMemory noma
Ngokuqondile:
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 ) );
}
Ukuqhathanisa okungadingekile
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);
}
}
Isexwayiso se-PVS-Studio:
Naka elinye igatsha okokuqala if. Ikhodi izokwenziwa kuphela uma zonke izimo leftvol > 0xFFFF || rightvol > 0xFFFF || leftvol < 0 || I-rightvol <0 kuzovela kungamanga. Ngakho-ke, sithola izitatimende ezilandelayo, ezizoba yiqiniso kwelinye igatsha: leftvol <= 0xFFFF, rightvol <= 0xFFFF, leftvol >= 0 ΠΈ I-rightvol > = 0. Phawula izitatimende ezimbili zokugcina. Ingabe kunengqondo ukuhlola ukuthi yisiphi isimo esidingekayo ukuze kusetshenziswe lesi siqeshana sekhodi?
Ngakho-ke singasusa ngokuphephile lezi zitatimende ezinemibandela:
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);
}
}
Esinye isimo. Kukhona uhlobo oluthile lwephutha olufihliwe ngemuva kwalezi zimo ezingafuneki. Mhlawumbe abazange bahlole ukuthi yini edingekayo.
U-Ctrl+C U-Ctrl+V Uhlasela Emuva
static u32 scePsmfSetPsmf(u32 psmfStruct, u32 psmfData) {
if (!Memory::IsValidAddress(psmfData) ||
!Memory::IsValidAddress(psmfData)) {
return hleReportError(ME, SCE_KERNEL_ERROR_ILLEGAL_ADDRESS, "bad address");
}
....
}
Naka isheke elingaphakathi if. Awucabangi ukuthi kuyamangaza ukuthi sihlole ukuthi ikheli livumelekile yini? psmfData, okuphindwe kabili? Ngakho-ke lokhu kubonakala kungavamile kimi... Eqinisweni, lokhu, yiqiniso, iphutha, futhi umqondo wawuwukuhlola kokubili imingcele yokufaka.
Inketho elungile:
static u32 scePsmfSetPsmf(u32 psmfStruct, u32 psmfData) {
if (!Memory::IsValidAddress(psmfStruct) ||
!Memory::IsValidAddress(psmfData)) {
return hleReportError(ME, SCE_KERNEL_ERROR_ILLEGAL_ADDRESS, "bad address");
}
....
}
Okuguquguqukayo okukhohliwe
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");
}
....
}
Isexwayiso se-PVS-Studio:
Leli phutha litholakala kufolda ext, ngakho-ke akubalulekile ngempela kuphrojekthi, kodwa isiphazamisi satholwa ngaphambi kokuba ngisiqaphele, ngakho nganquma ukusishiya. Phela, lesi sihloko asikho mayelana nokubuyekeza amaphutha, kodwa mayelana nokuhlanganiswa ne-Travis CI, futhi akukho ukucushwa kwe-analyzer okwenziwe.
Iyaguquguquka usayizi iqalwa ngokungaguquki, nokho, ayisetshenziswa nhlobo kukhodi, kuya phansi ku-opharetha if, okuyinto, yebo, enikeza bamanga ngenkathi sibheka izimo, ngoba, njengoba sikhumbula, usayizi ilingana noziro. Ukuhlola okulandelayo nakho akunangqondo.
Ngokusobala, umbhali wesiqeshana sekhodi ukhohlwe ukubhala phezu kokuhluka usayizi ngaphambi kwalokho.
Misa
Yilapho cishe sizogcina khona ngamaphutha. Inhloso yalesi sihloko ukukhombisa umsebenzi we-PVS-Studio kanye ne-Travis CI, hhayi ukuhlaziya iphrojekthi ngokucophelela ngangokunokwenzeka. Uma ufuna amaphutha amakhulu futhi amahle kakhulu, ungawancoma njalo
isiphetho
Ukusebenzisa izinsiza zewebhu ukwakha amaphrojekthi kanye nomkhuba wokuhlaziya okukhulayo kukuvumela ukuthi uthole izinkinga eziningi ngokushesha ngemva kokuhlanganisa ikhodi. Kodwa-ke, isakhiwo esisodwa singase singanele, ngakho-ke ukusetha ukuhlolwa kanye nokuhlaziywa okumile kuzothuthukisa kakhulu ikhwalithi yekhodi.
Izixhumanisi eziwusizo
Uma ufuna ukwabelana ngalesi sihloko nezithameli ezikhuluma isiNgisi, sicela usebenzise isixhumanisi sokuhumusha: UMaxim Zvyagintsev.
Source: www.habr.com