Travis CI ke ts'ebeletso e ajoang ea webo bakeng sa ho aha le ho etsa liteko software e sebelisang GitHub joalo ka mohloli oa khoutu ea mohloli. Ntle le maemo a kaholimo a ts'ebetso, o ka eketsa liteboho tsa hau ho likhetho tse pharalletseng tsa tlhophiso. Sehloohong sena re tla lokisa Travis CI ho sebetsa le PVS-Studio ho sebelisa mohlala oa khoutu ea PPSSPP.
Selelekela
Ho theha Travis CI
Re tla hloka polokelo ho GitHub, moo projeke eo re e hlokang e leng teng, hammoho le senotlolo sa PVS-Studio (o ka e fumana.
Ha re ee setšeng
Bakeng sa tlhahlobo, ke ferekane PPSSPP.
Re kenya sebaka sa polokelo seo re batlang ho se bokella:
Hona joale, Travis CI e ke ke ea haha morero oa rona hobane ha ho na litaelo tsa ho haha. Kahoo ke nako ea tlhophiso.
Nakong ea tlhahlobo, mefuta e meng e tla ba molemo ho rona, mohlala, senotlolo sa PVS-Studio, e leng ho ke keng ha e-ba molemo ho hlakisa faeleng ea tlhophiso. Kahoo ha re kenyelleng mefuta e fapaneng ea tikoloho re sebelisa litlhophiso tsa kaho ho Travis CI:
Re tla hloka:
- PVS_USERNAME - lebitso la mosebelisi
- PVS_KEY - senotlolo
- MAIL_USER - lengolo-tsoibila le tla sebelisoa ho romella tlaleho
- MAIL_PASSWORD - lengolo-tsoibila la lengolo-tsoibila
Tse peli tsa ho qetela ke tsa boikhethelo. Tsena li tla sebelisoa ho romella liphetho ka lengolo-tsoibila. Haeba u batla ho aba tlaleho ka tsela e 'ngoe, ha ho hlokahale hore u li bontše.
Kahoo, re ekelitse mefuta e fapaneng ea tikoloho eo re e hlokang:
Joale ha re theheng faele .travis.yml ebe u e beha motsong oa morero. PPSSPP e ne e se e ntse e e-na le faele ea tlhophiso bakeng sa Travis CI, leha ho le joalo, e ne e le khōlō haholo ebile e sa tšoanelehe ka ho feletseng bakeng sa mohlala, kahoo re ne re tlameha ho e nolofatsa haholo mme re siee lintlha tsa motheo feela.
Taba ea pele, ha re bonts'e puo, mofuta oa Ubuntu Linux oo re batlang ho o sebelisa mochining o fumanehang, le liphutheloana tse hlokahalang bakeng sa moaho:
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'
Liphutheloana tsohle tse thathamisitsoeng li hlokahala bakeng sa PPSSPP feela.
Joale re bonts'a matrix a kopano:
matrix:
include:
- os: linux
compiler: "gcc"
env: PPSSPP_BUILD_TYPE=Linux PVS_ANALYZE=Yes
- os: linux
compiler: "clang"
env: PPSSPP_BUILD_TYPE=Linux
Ho feta hanyane ka karolo matrix. Ho Travis CI, ho na le mekhoa e 'meli ea ho etsa likhetho tsa ho haha: ea pele ke ho hlalosa lethathamo la lihlopha, mefuta ea tsamaiso ea tsamaiso, mefuta-futa ea tikoloho, joalo-joalo, ka mor'a moo ho hlahisoa matrix a metsoako eohle e ka khonehang; ea bobeli ke pontšo e hlakileng ea matrix. Ehlile, o ka kopanya mekhoa ena e 'meli mme oa eketsa nyeoe e ikhethang, kapa, ho fapana le hoo, o e qhelele ka thoko ho sebelisa karolo. kenyeletsa. U ka bala haholoanyane ka sena ho
Ho setseng ke ho fana ka litaelo tse ikhethileng tsa morero:
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 e u lumella ho eketsa litaelo tsa hau bakeng sa mekhahlelo e fapaneng ea bophelo ba mochini o sebetsang. Karolo pele_kenya e etsoa pele o kenya liphutheloana. Joale kenya, e latelang ho kenngoa ha liphutheloana ho tsoa lethathamong addons.apteo re e bontšitseng ka holimo. Kopano ka boeona e ba teng rx. Haeba tsohle li tsamaile hantle, joale re tla iphumana re kene kamora_katleho (ke karolong ena moo re tla tsamaisa static analysis). Tsena ha se mehato eohle e ka fetoloang, haeba u hloka ho feta, u lokela ho sheba ho eona
Bakeng sa ho bala habonolo, litaelo li ne li kenngoa ka har'a script e arohaneng .travis.sh, e behiloeng motsong oa morero.
Kahoo re na le faele e latelang .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
Pele re kenya liphutheloana, re tla ntlafatsa li-submodules. Sena sea hlokahala ho aha PPSSPP. Ha re kenye tšebetsong ea pele ho .travis.sh (hlokomela katoloso):
travis_before_install() {
git submodule update --init --recursive
}
Hona joale re tla ka kotloloho ho theha tlhahiso ea othomathike ea PVS-Studio ho Travis CI. Pele re hloka ho kenya sephutheloana sa PVS-Studio ho sistimi:
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
}
Qalong ea mosebetsi travis_install re kenya li-compilers tseo re li hlokang re sebelisa mefuta-futa ea tikoloho. Joale haeba ho feto-fetoha $PVS_ANALYZE boleng ba mabenkele E (re e bontšitse karolong romeletsa nakong ea tlhophiso ea matrix), re kenya sephutheloana pvs-setudio. Ho phaella ho sena, liphutheloana li boetse li bontšoa libio-socket-ssl-perl и libnet-ssleay-perl, leha ho le joalo, lia hlokahala bakeng sa liphetho tsa poso, kahoo ha li hlokahale haeba u khethile mokhoa o mong oa ho fana ka tlaleho ea hau.
Mosebetsi download_extract khoa le ho notlolla polokelong e boletsoeng:
download_extract() {
aria2c -x 16 $1 -o $2
tar -xf $2
}
Ke nako ea ho kopanya morero. Sena se etsahala karolong rx:
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
}
Ebile, ena ke tlhophiso e nolofalitsoeng ea mantlha, ntle le mela ena:
if [ "$PVS_ANALYZE" = "Yes" ]; then
CMAKE_ARGS="-DCMAKE_EXPORT_COMPILE_COMMANDS=On ${CMAKE_ARGS}"
fi
Karolong ena ea khoutu re beha bakeng sa cmeke folakha bakeng sa ho romela litaelo tsa pokello. Sena sea hlokahala bakeng sa static code analyzer. U ka bala haholoanyane ka sena sehloohong "
Haeba kopano e ile ea atleha, joale re tla kamora_katleho, moo re etsang tlhahlobo e tsitsitseng:
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
}
Ha re shebeng mela e latelang ka botebo:
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
Mohala oa pele o hlahisa faele ea laesense ho tsoa ho lebitso la mosebelisi le senotlolo seo re se boletseng qalong ha re theha mefuta e fapaneng ea tikoloho ea Travis CI.
Mohala oa bobeli o qala tlhahlobo ka kotloloho. Folakha -j e beha palo ea likhoele bakeng sa tlhahlobo, folakha -l e bontša laesense, folakha -o e hlalosa faele bakeng sa ho hlahisa likutu, le folakha -disableLicenseExpirationCheck e hlokahalang bakeng sa liphetolelo tsa teko, kaha ka ho sa feleng pvs-studio-analyzer e tla lemosa mosebedisi hore laesense e haufi le ho fela. Ho thibela sena ho etsahala, o ka hlakisa folakha ena.
Faele ea log e na le tlhahiso e tala e ke keng ea baloa ntle le ho sokoloha, kahoo o tlameha ho qala ho etsa hore faele e balehe. Ha re feteng likutung mofetoheli oa pola, mme sephetho ke faele ea html.
Mohlala ona, ke nkile qeto ea ho romela litlaleho ka poso ke sebelisa taelo romelaemail.
Ka lebaka leo, re fumane faele e latelang .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;
Joale ke nako ea ho sutumelletsa liphetoho sebakeng sa polokelo ea git, kamora moo Travis CI e tla tsamaisa moaho ka bo eona. Tobetsa ho "ppsspp" ho ea litlalehong tsa kaho:
Re tla bona kakaretso ea moaho oa hajoale:
Haeba moaho o phethiloe ka katleho, re tla fumana lengolo-tsoibila le nang le liphetho tsa tlhahlobo e tsitsitseng. Ke ’nete hore ho romela mangolo hase eona feela tsela ea ho fumana tlaleho. U ka khetha mokhoa ofe kapa ofe oa ts'ebetsong. Empa ke habohlokoa ho hopola hore ka mor'a hore mohaho o phethoe, ho ke ke ha khoneha ho fumana lifaele tsa mochine oa sebele.
Kakaretso ea phoso
Re phethile ka katleho karolo e thata ka ho fetisisa. Joale a re tiiseng hore boiteko bohle boo re bo etsang ke ba bohlokoa. A re shebeng lintlha tse ling tse thahasellisang tse tsoang tlalehong ea static analysis e ileng ea tla ho 'na ka poso (e ne e se lefeela leo ke le bontšitseng).
Ntlafatso e kotsi
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 ) );
}
Tlhokomeliso ea PVS-Studio:
Karolo ena ea khoutu e ka har'a module ea hashing e sireletsehileng, leha ho le joalo, e na le phoso e tebileng ea ts'ireletso (
; Line 355
mov r8d, 20
xor edx, edx
lea rcx, QWORD PTR sum$[rsp]
call memset
; Line 356
Ntho e 'ngoe le e 'ngoe e hlophisitsoe le mosebetsi memeset e phethiloe, ka hona e hlakola data ea bohlokoa ho RAM, leha ho le joalo, u se ke ua thaba hajoale. Ha re shebeng lethathamo la kopano ea mofuta oa Release ka optimization:
; 354 :
; 355 : memset( sum, 0, sizeof( sum ) );
; 356 :}
Joalo ka ha ho bonoa lethathamong, moqapi o ile a iphapanyetsa mohala memeset. Sena se bakoa ke taba ea hore tšebetsong sha1 ka mora mohala memeset ha ho sa buuoa ka sebopeho ctx. Ka hona, moqapi ha a bone bohlokoa ba ho senya nako ea processor ho ngola mohopolo o sa sebelisoeng nakong e tlang. U ka lokisa sena ka ho sebelisa ts'ebetso RtlSecureZeroMemory kapa
E nepahetse:
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 ) );
}
Papiso e sa hlokahaleng
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);
}
}
Tlhokomeliso ea PVS-Studio:
Ela hloko lekala le leng bakeng sa pele if. Khoutu e tla etsoa feela haeba maemo ohle leftvol > 0xFFFF || rightvol> 0xFFFF || leftvol < 0 || rightvol <0 e tla fetoha leshano. Ka hona, re fumana lipolelo tse latelang, tse tla ba 'nete bakeng sa lekala le leng: leftvol <= 0xFFFF, rightvol <= 0xFFFF, leftvol >= 0 и rightvol>= 0. Hlokomela lipolelo tse peli tsa ho qetela. Na hoa utloahala ho hlahloba hore na ke boemo bofe bo hlokahalang bakeng sa ho phethahatsa karolo ee ea khoutu?
Kahoo re ka tlosa lipolelo tsena ka mokhoa o sireletsehileng:
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);
}
}
Boemo bo bong. Ho na le mofuta o itseng oa phoso o patiloeng ka mor'a maemo ana a sa hlokahaleng. Mohlomong ha baa ka ba hlahloba hore na ho hlokahala eng.
Ctrl+C Ctrl+V E Hlasela Morao
static u32 scePsmfSetPsmf(u32 psmfStruct, u32 psmfData) {
if (!Memory::IsValidAddress(psmfData) ||
!Memory::IsValidAddress(psmfData)) {
return hleReportError(ME, SCE_KERNEL_ERROR_ILLEGAL_ADDRESS, "bad address");
}
....
}
Ela hloko cheke ka hare if. Na ha u nahane hore hoa makatsa hore ebe re hlahloba hore na aterese e nepahetse? psmfData, ho feta habeli? Kahoo sena se bonahala se makatsa ho 'na ... Ha e le hantle, sena ke, ha e le hantle, ke typo, 'me khopolo e ne e le ho hlahloba likarolo tse peli tsa ho kenya letsoho.
Khetho e nepahetseng:
static u32 scePsmfSetPsmf(u32 psmfStruct, u32 psmfData) {
if (!Memory::IsValidAddress(psmfStruct) ||
!Memory::IsValidAddress(psmfData)) {
return hleReportError(ME, SCE_KERNEL_ERROR_ILLEGAL_ADDRESS, "bad address");
}
....
}
Phetoho e lebetsoeng
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");
}
....
}
Tlhokomeliso ea PVS-Studio:
Phoso ena e fumaneha ka har'a sephutheli ho hang, kahoo ha e hlile ha e amane le morero, empa kokoana e ile ea fumanoa pele ke e hlokomela, kahoo ke ile ka etsa qeto ea ho e tlohela. Ntle le moo, sengoloa sena ha se mabapi le ho hlahloba liphoso, empa mabapi le ho kopanngoa le Travis CI, mme ha ho na tlhophiso ea mohlahlobi e entsoeng.
E fapaneng boholo e qalisoa ke kamehla, leha ho le joalo, ha e sebelisoe ho hang ka khoutu, ho fihlela ho opareitara if, eo, ha e le hantle, e fanang ka eona bohata ha re ntse re hlahloba maemo, hobane, joalo ka ha re hopola, boholo lekana le zero. Licheke tse latelang le tsona ha li na kelello.
Kamoo ho bonahalang kateng, mongoli oa sekhechana sa khoutu o lebetse ho hlakola phapang boholo pele ho moo.
Ema
Mona ke moo mohlomong re tla qetella ka liphoso. Morero oa sengoloa sena ke ho bonts'a mosebetsi oa PVS-Studio hammoho le Travis CI, eseng ho sekaseka morero ka botlalo kamoo ho ka khonehang. Haeba u batla liphoso tse kholoanyane le tse ntle, u ka li rata kamehla
fihlela qeto e
Ho sebelisa lits'ebeletso tsa marang-rang ho aha merero hammoho le tloaelo ea tlhahlobo e ntseng e eketseha ho u lumella ho fumana mathata a mangata hang kamora ho kopanya khoutu. Leha ho le joalo, mohaho o le mong o ka 'na oa se ke oa lekana, kahoo ho theha tlhahlobo hammoho le tlhahlobo e tsitsitseng ho tla ntlafatsa haholo boleng ba khoutu.
likhokahano tse sebetsang
Haeba u batla ho arolelana sengoloa sena le bamameli ba buang Senyesemane, ka kopo sebelisa sehokelo sa phetolelo: Maxim Zvyagintsev.
Source: www.habr.com