Travis CI ibasa rewebhu rakagoverwa yekuvaka uye yekuyedza software inoshandisa GitHub sesosi kodhi yekutambira. Kuwedzera kune ari pamusoro ekushanda mamiriro, iwe unogona kuwedzera yako yekutenda kune yakakura magadzirirwo sarudzo. Muchikamu chino tichagadzirisa Travis CI kushanda nePVS-Studio tichishandisa PPSSPP kodhi muenzaniso.
Nhanganyaya
Kugadzira Travis CI
Tichada repository paGitHub, uko chirongwa chatinoda chiripo, pamwe nekiyi yePVS-Studio (unogona kuwana
Handei kune saiti
Paye bvunzo, ndakaforoma PPSSPP.
Isu tinomisa iyo repository yatinoda kuunganidza:
Parizvino, Travis CI haigone kuvaka chirongwa chedu nekuti hapana mirairo yekuvaka. Saka yave nguva yekugadzirisa.
Munguva yekuongorora, zvimwe zvinosiyana zvichatibatsira, semuenzaniso, kiyi yePVS-Studio, izvo zvingave zvisina kufanira kutsanangura mufaira rekugadzirisa. Saka ngatiwedzerei nharaunda dzakasiyana tichishandisa zvigadziriso zvekuvaka muTravis CI:
Tichada:
- PVS_USERNAME - zita rekushandisa
- PVS_KEY - kiyi
- MAIL_USER - email ichashandiswa kutumira irori
- MAIL_PASSWORD - email password
Iwo maviri ekupedzisira ndeokusarudza. Izvi zvichashandiswa kutumira mhinduro netsamba. Kana uchida kugovera mushumo neimwe nzira, haufaniri kuvaratidza.
Saka, isu takawedzera nharaunda dzakasiyana dzatinoda:
Zvino ngatigadzirirei faira .travis.yml woiisa mumudzi wepurojekiti. PPSSPP yainge yatove nefaira yekumisikidza yeTravis CI, zvisinei, yaive yakakura uye isingakodzeri zvachose kumuenzaniso, saka taifanira kurerutsa zvakanyanya uye kusiya chete zvinhu zvakakosha.
Kutanga, ngatiratidze mutauro, vhezheni yeUbuntu Linux yatinoda kushandisa mumushini chaiwo, uye mapakeji anodiwa ekuvaka:
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'
Ese mapakeji akanyorwa anodiwa chete kuPPSSPP.
Iye zvino tinoratidza matrix yegungano:
matrix:
include:
- os: linux
compiler: "gcc"
env: PPSSPP_BUILD_TYPE=Linux PVS_ANALYZE=Yes
- os: linux
compiler: "clang"
env: PPSSPP_BUILD_TYPE=Linux
Zvimwe zvishoma pamusoro pechikamu matrix. MuTravis CI, kune nzira mbiri dzekugadzira sarudzo dzekuvaka: yekutanga ndeyekutsanangura rondedzero yevagadziri, mhando dzemashandisirwo emhando, shanduko yemamiriro ekunze, nezvimwe, mushure mezvo matrix ezvese zvinosanganiswa zvinogadzirwa; yechipiri chiratidzo chakajeka chematrix. Ehe, iwe unogona kusanganisa nzira mbiri idzi uye wowedzera yakasarudzika kesi, kana, zvinopesana, isaisanganise uchishandisa chikamu. kusanganisa. Unogona kuverenga zvakawanda pamusoro peizvi mu
Chinosara ndechekupa mirairo yegungano-yakananga:
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 inokutendera kuti uwedzere yako mirairo yematanho akasiyana ehupenyu hwemuchina chaiwo. Chikamu before_install kuurayiwa usati waisa mapakeji. Zvadaro install, iyo inotevera kuiswa kwemapakeji kubva pane rondedzero addons.aptzvataratidza pamusoro. Gungano pacharo rinoitwa mukati chinyorwa. Kana zvese zvikafamba zvakanaka, tinozviwana tapinda after_success (muchikamu chino tichamhanya static analysis). Aya haasi ese matanho anogona kugadziridzwa, kana iwe uchida mamwe, saka iwe unofanirwa kutarisa mukati
Kuti zvive nyore kuverenga, mirairo yakaiswa mune imwe script .travis.sh, iyo inoiswa pamudzi weprojekti.
Saka tine faira inotevera .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
Tisati taisa mapakeji, isu tichavandudza ma submodules. Izvi zvinodiwa kuvaka PPSSPP. Ngatiwedzerei basa rekutanga ku .travis.sh (cherechedza kuwedzera):
travis_before_install() {
git submodule update --init --recursive
}
Iye zvino tauya zvakananga kumisikidza otomatiki kuvhurwa kwePVS-Studio muTravis CI. Kutanga isu tinoda kuisa iyo PVS-Studio package pane system:
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
}
Pakutanga kwebasa travis_install isu tinoisa ma compilers atinoda tichishandisa zvakatipoteredza zvakasiyana. Zvino kana shanduko $PVS_ANALYZE zvitoro kukosha Ehe (takazviratidzira muchikamu approx panguva yekuvaka matrix kumisikidzwa), isu tinoisa iyo package pvs-studio. Pamusoro peizvi, mapakeji anoratidzwa zvakare libio-socket-ssl-perl ΠΈ libnet-ssleay-perl, zvisinei, ivo vanodiwa pamibairo yekutumira, saka ivo havafanirwe kana wakasarudza imwe nzira yekuendesa mushumo wako.
shanda download_extract kudhawunirodha uye kusunungura iyo yakatsanangurwa archive:
download_extract() {
aria2c -x 16 $1 -o $2
tar -xf $2
}
Yasvika nguva yekuisa chirongwa pamwe chete. Izvi zvinoitika muchikamu chinyorwa:
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
}
Muchokwadi, iyi igadziriso yakarerutswa yepakutanga, kunze kweiyi mitsetse:
if [ "$PVS_ANALYZE" = "Yes" ]; then
CMAKE_ARGS="-DCMAKE_EXPORT_COMPILE_COMMANDS=On ${CMAKE_ARGS}"
fi
Muchikamu chino chekodhi tinoisa cmake mureza wekutumira kunze mirairo yekubatanidza. Izvi zvinodikanwa kune static code analyzer. Unogona kuverenga zvakawanda pamusoro peizvi mune chinyorwa "
Kana gungano rakabudirira, saka tinosvika after_success, kwatinoita static analysis:
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
}
Ngatitarisei pamitsetse inotevera:
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
Mutsetse wekutanga unoburitsa rezinesi faira kubva kuzita rekushandisa uye kiyi yatakatsanangura pakutanga chaipo pakumisikidza iyo Travis CI nharaunda inosiyana.
Mutsara wechipiri unotanga kuongorora zvakananga. Flag -j inoseta nhamba yeshinda dzekuongorora, mureza -l inoratidza rezinesi, mureza -o inotsanangura faira rekuburitsa matanda, uye mureza -dzimaLicenseExpirationCheck inodiwa kune vhezheni dzekuyedza, kubva nekusarudzika pvs-studio-analyzer ichayambira mushandisi kuti rezinesi rava kuda kupera. Kuti izvi zvisaitike, unogona kudoma mureza uyu.
Iyo faira regi ine yakaomeswa yakabuda isingagone kuverengwa pasina kutendeuka, saka unofanira kutanga waita kuti faira riverengeke. Ngatipfuurei matanda purogi-inoshandura, uye zvakabuda ndeye html faira.
Mumuenzaniso uyu, ndakafunga kutumira mishumo netsamba ndichishandisa murairo sendmail.
Somugumisiro, takawana faira inotevera .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;
Iye zvino yave nguva yekusundidzira shanduko kune git repository, mushure meizvozvo Travis CI inozomhanyisa kuvaka. Dzvanya pa "ppsspp" kuenda kumishumo yekuvaka:
Tichaona mhedziso yezvino kuvaka:
Kana iyo kuvaka ikapedzwa zvinobudirira, isu tinogashira email ine mhedzisiro ye static ongororo. Chokwadika, kutumira tsamba handiyo nzira bedzi yokugamuchira nayo mushumo. Iwe unogona kusarudza chero nzira yekushandisa. Asi zvakakosha kuyeuka kuti mushure mekuvaka kwapera, hazvizogoneke kuwana iyo chaiyo muchina mafaera.
Mhosho muchidimbu
Takabudirira kupedza chikamu chakaoma zvikuru. Zvino ngativei nechokwadi chokuti kuedza kwedu kwose kwakakodzera. Ngatitarisei mamwe mapoinzi anonakidza kubva kune static yekuongorora rondedzero yakauya kwandiri nepositi (yakanga isiri pasina iyo yandakaratidza).
Dangerous optimization
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 yambiro:
Ichi chidimbu chekodhi chiri mune yakachengeteka hashing module, zvisinei, ine yakakomba kuchengetedza kukanganisa (
; Line 355
mov r8d, 20
xor edx, edx
lea rcx, QWORD PTR sum$[rsp]
call memset
; Line 356
Zvese zvakarongeka uye basa racho memeset inourayiwa, nekudaro ichinyora yakakosha data mu RAM, zvisinei, usafare izvozvi. Ngatitarisei pagungano rondedzero yeRelease vhezheni ne optimization:
; 354 :
; 355 : memset( sum, 0, sizeof( sum ) );
; 356 :}
Sezvinoonekwa kubva pane rondedzero, mugadziri akafuratira kufona memeset. Izvi zvinokonzerwa nekuti mune basa sha1 mushure mekufona memeset hapasisina chirevo chechimiro ctx. Naizvozvo, iyo compiler haioni chikonzero chekutambisa processor nguva kunyora ndangariro iyo isingashandiswe mune ramangwana. Iwe unogona kugadzirisa izvi nekushandisa basa RtlSecureZeroMemory kana
Zvakarurama:
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 ) );
}
Kuenzanisa kusingakoshi
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 yambiro:
Teerera kune rimwe bazi rekutanga if. Iyo kodhi ichaitwa chete kana mamiriro ese leftvol > 0xFFFF || rightvol > 0xFFFF || leftvol < 0 || rightvol <0 zvichava zvenhema. Naizvozvo, tinowana zvirevo zvinotevera, izvo zvichave zvechokwadi kune rimwe bazi: leftvol <= 0xFFFF, rightvol <= 0xFFFF, leftvol > = 0 ΠΈ rightvol>= 0. Cherechedza zvirevo zviviri zvekupedzisira. Zvine musoro here kutarisa kuti chii chinodiwa mamiriro ekuitwa kweiyi chidimbu chekodhi?
Saka isu tinokwanisa kubvisa zvakachengeteka izvi zvirevo zvine zvirevo:
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);
}
}
Chimwe chiitiko. Pane imwe mhando yekukanganisa yakavanzwa kuseri kwezvisina basa izvi. Pamwe havana kutarisa zvaidiwa.
Ctrl+C Ctrl+V Inorova Kumashure
static u32 scePsmfSetPsmf(u32 psmfStruct, u32 psmfData) {
if (!Memory::IsValidAddress(psmfData) ||
!Memory::IsValidAddress(psmfData)) {
return hleReportError(ME, SCE_KERNEL_ERROR_ILLEGAL_ADDRESS, "bad address");
}
....
}
Nyatsoteerera cheki mukati if. Haufungi here kuti zvinoshamisa kuti titarise kana kero iriko? psmfData, zvakapetwa kaviri? Saka izvi zvinoita sezvisinganzwisisike kwandiri... Muchokwadi, izvi ndezvechokwadi, typo, uye pfungwa yaive yekutarisa ese ari maviri ekuisa paramita.
Sarudzo chaiyo:
static u32 scePsmfSetPsmf(u32 psmfStruct, u32 psmfData) {
if (!Memory::IsValidAddress(psmfStruct) ||
!Memory::IsValidAddress(psmfData)) {
return hleReportError(ME, SCE_KERNEL_ERROR_ILLEGAL_ADDRESS, "bad address");
}
....
}
Kukanganwa chinja
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 yambiro:
Kukanganisa uku kuri mufolder ext, saka haina kunyatsoenderana nebasa, asi bug yakawanikwa ndisati ndazviona, saka ndakasarudza kuisiya. Mushure mezvose, chinyorwa ichi hachisi chekuongorora zvikanganiso, asi nezvekubatanidza neTravis CI, uye hapana kugadziridzwa kweanalyzer kwakaitwa.
Variable zera inotangwa neanogara, zvisinei, haisati yashandiswa zvachose mukodhi, kusvika pasi kune opareta if, izvo, zvechokwadi, zvinopa venhema tichitarisa mamiriro acho, nekuti, sezvatinorangarira, zera zvakaenzana ne zero. Macheki anotevera zvakare haana musoro.
Sezviri pachena, munyori weiyo code fragment akakanganwa kupfuudza shanduko zera zvisati zvaitika.
mira
Apa ndipo patingazopedzisira nekukanganisa. Chinangwa chechinyorwa chino ndechekuratidza basa rePVS-Studio pamwe chete naTravis CI, uye kwete kuongorora chirongwa ichi zvakanyanya sezvinobvira. Kana iwe uchida zvikanganiso zvakakura uye zvakanyanya kunaka, unogona kugara uchiyemura
mhedziso
Kushandisa webhu masevhisi kuvaka mapurojekiti pamwe chete netsika yekuwedzera ongororo inobvumidza iwe kuwana akawanda matambudziko nekukurumidza mushure mekubatanidza kodhi. Nekudaro, imwe kuvaka inogona kunge isina kukwana, saka kumisikidza kuyedzwa pamwe chete ne static kuongororwa kuchavandudza zvakanyanya kunaka kwekodhi.
Useful links
Kana iwe uchida kugovera chinyorwa ichi nevateereri vanotaura Chirungu, tapota shandisa shanduro yekushandura: Maxim Zvyagintsev.
Source: www.habr.com