O le Travis CI o se 'upega tafaʻilagi tufatufaina mo le fausiaina ma le suʻeina o polokalama faʻaoga e faʻaogaina ai le GitHub e avea ma punaoa faʻasalalauga. I le faʻaopoopoga i faʻataʻitaʻiga o loʻo i luga, e mafai ona e faʻaopoopoina lau lava faʻafetai i le tele o filifiliga faʻatulagaina. I lenei tusiga o le a matou faʻatulagaina Travis CI e galulue ma PVS-Studio e faʻaaoga ai le PPSSPP code faʻataʻitaʻiga.
Faatomuaga
Faʻatulagaina Travis CI
Matou te manaʻomia se fale teu oloa i GitHub, lea o loʻo i ai le poloketi matou te manaʻomia, faʻapea foʻi ma se ki mo PVS-Studio (e mafai ona e mauaina.
Tatou o i le saite
Mo le suʻega, na ou togiina le PPSSPP.
Matou te faʻagaoioia le faleoloa matou te manaʻo e aoina:
I le taimi nei, e le mafai e Travis CI ona fausia la matou poloketi ona e leai ni faʻatonuga mo le fausiaina. O lea ua oʻo i le taimi mo le faʻatulagaina.
I le taimi o le auʻiliʻiliga, o nisi fesuiaiga o le a aoga ia i tatou, mo se faʻataʻitaʻiga, le ki mo PVS-Studio, lea o le a le manaʻomia e faʻamaonia i le faila faila. O lea seʻi o tatou faʻaopoopo suiga o le siosiomaga e faʻaaoga ai le fausiaina o fale i Travis CI:
Matou te manaʻomia:
- PVS_USERNAME - igoa ole igoa
- PVS_KEY - ki
- MAIL_USER - imeli e fa'aoga e lafo ai le lipoti
- MAIL_PASSWORD - imeli password
O le lua mulimuli e filifili. O nei mea o le a fa'aaogaina e lafo ai fa'ai'uga i meli. Afai e te manaʻo e tufatufa atu le lipoti i se isi auala, e te le manaʻomia le faʻailoaina.
O lea la, ua matou faʻaopoopoina suiga o le siosiomaga matou te manaʻomia:
Sei o tatou faia se faila .travis.yml ma tuu i le a'a o le galuega. O le PPSSPP ua uma ona i ai se faila faʻapipiʻi mo Travis CI, peitaʻi, e telē tele ma e matua le talafeagai mo le faʻataʻitaʻiga, o lea e tatau ai ona matou faʻafaigofie tele ma tuʻu naʻo elemene autu.
Muamua, seʻi o tatou faʻaalia le gagana, le lomiga o le Ubuntu Linux tatou te manaʻo e faʻaoga i le masini masini, ma afifi talafeagai mo le fausiaina:
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'
O afifi uma o lo'o lisiina e mana'omia na'o le PPSSPP.
O lenei matou te faʻaalia le faʻapotopotoga matrix:
matrix:
include:
- os: linux
compiler: "gcc"
env: PPSSPP_BUILD_TYPE=Linux PVS_ANALYZE=Yes
- os: linux
compiler: "clang"
env: PPSSPP_BUILD_TYPE=Linux
O sina mea itiiti e uiga i le vaega Numera. I le Travis CI, e lua auala e fatuina ai le fausiaina o filifiliga: muamua o le faʻamaonia o se lisi o tuʻufaʻatasiga, ituaiga faiga faʻaogaina, fesuiaiga o le siosiomaga, ma isi, pe a maeʻa ona faʻatupuina se matrix o tuʻufaʻatasiga uma; o le lona lua o se faʻaaliga manino o le matrix. Ioe, e mafai ona e tuʻufaʻatasia nei auala e lua ma faʻaopoopo se tulaga tulaga ese, pe, i se isi itu, e le aofia ai le faʻaaogaina o le vaega. aloese. E mafai ona e faitau atili e uiga i lenei mea ile
Pau lava le mea o loʻo totoe o le tuʻuina atu lea o faʻatonuga faʻapitoa mo le faʻapotopotoga:
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 faʻatagaina oe e faʻaopoopo au oe lava poloaiga mo vaega eseese o le olaga o se masini komepiuta. Vaega before_install fa'atino a'o le'i fa'apipi'i afifi. Ona faʻapipiʻi, lea e mulimuli i le faʻapipiʻiina o afifi mai le lisi addons.aptlea na matou faailoa atu i luga. O le fono lava ia e faia i totonu tusilima. Afai na lelei mea uma, ona tatou maua ai lea oi tatou i totonu ina ua_manuia (o totonu o lenei vaega o le a matou faʻatautaia ai suʻesuʻega faʻapitoa). E le o laasaga uma ia e mafai ona suia, afai e te manaʻomia nisi mea, e tatau ona e vaʻai i totonu
Mo le faigofie o le faitau, na tuʻuina poloaiga i se isi tusitusiga .travis.sh, lea e tu'u i le a'a o le poloketi.
O lea ua matou maua le faila lea .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
Aʻo leʻi faʻapipiʻiina afifi, matou te faʻafouina ia submodules. E mana'omia lea e fausia ai le PPSSPP. Tatou fa'aopoopo le galuega muamua i .travis.sh (manatua le fa'aopoopoga):
travis_before_install() {
git submodule update --init --recursive
}
O lea ua matou sau sa'o i le fa'atulagaina o le fa'alauiloaina otometi o le PVS-Studio i Travis CI. Muamua e manaʻomia le faʻapipiʻiina o le PVS-Studio package i luga o le polokalama:
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
}
I le amataga o le gaioiga travis_install matou te faʻapipiʻi le tuʻufaʻatasiga matou te manaʻomia e faʻaaoga ai fesuiaiga o le siosiomaga. Ona afai o le fesuiaiga $PVS_ANALYZE faleoloa tau ioe (sa matou faʻaalia i le vaega auina atu i le taimi o le fausiaina o le matrix configuration), matou te faʻapipiʻi le afifi pvs-studio. E le gata i lea, o loʻo faʻaalia foi afifi libio-socket-ssl-perl и libnet-ssleay-perl, ae ui i lea, e mana'omia mo le meli i'uga, o lea e le mana'omia pe afai ua e filifilia se isi auala mo le tu'uina atu o lau lipoti.
galuega tauave download_extract la'u mai ma tatala le fa'amaumauga fa'apitoa:
download_extract() {
aria2c -x 16 $1 -o $2
tar -xf $2
}
Ua oo i le taimi e tuufaatasia ai le poloketi. E tupu lenei mea i le vaega tusilima:
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
}
O le mea moni, o se faʻamatalaga faigofie muamua, sei vagana ai laina nei:
if [ "$PVS_ANALYZE" = "Yes" ]; then
CMAKE_ARGS="-DCMAKE_EXPORT_COMPILE_COMMANDS=On ${CMAKE_ARGS}"
fi
I lenei vaega o le code ua matou setiina mo cmake fu'a mo le auina atu i fafo o poloaiga tu'ufa'atasi. E mana'omia lenei mea mo se su'esu'ega code static. E mafai ona e faitau atili e uiga i lenei mea i le tusiga "
Afai na manuia le faʻapotopotoga, ona tatou oʻo lea i ina ua_manuia, lea matou te faia ai suʻesuʻega faʻapitoa:
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
}
Sei o tatou tilotilo totoa i laina nei:
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
O le laina muamua e maua ai se faila laisene mai le igoa ole igoa ma le ki lea na matou faʻamaonia i le amataga pe a faʻatulagaina le suiga ole siosiomaga Travis CI.
O le laina lona lua e amata sa'o le au'ili'iliga. Fu'a -j fa'atulaga le numera o filo mo su'esu'ega, fu'a -l fa'ailoa laisene, fu'a -o fa'amatala le faila mo le fa'auluina o ogalaau, ma le fu'a -disableLicenseExpirationCheck mana'omia mo fa'ata'ita'iga fa'ata'ita'iga, talu ai e le mafai pvs-studio-analyzer o le a lapata'ia le tagata fa'aoga o le laisene ua lata ona muta. Ina ia taofia lenei mea mai le tupu, e mafai ona e faʻamaonia lenei fuʻa.
O le faila ogalaau o loʻo i ai mea faʻapitoa e le mafai ona faitau e aunoa ma le liua, o lea e tatau ai ona e faʻaogaina muamua le faila. Tatou pasi atu ogalaau fa'alili-liliu, ma o le gaioiga o se faila html.
I lenei faʻataʻitaʻiga, na ou filifili e auina atu lipoti i meli e faʻaaoga ai le poloaiga melimeli.
O se taunuuga, matou maua le faila lea .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;
Ua oʻo nei i le taimi e tuleia ai suiga i le git repository, a maeʻa lea o Travis CI o le a otometi lava ona faʻatautaia le fausiaina. Kiliki i luga o le "ppsspp" e alu i le fausiaina o lipoti:
O le a tatou vaʻai i se aotelega o le fausiaina o loʻo iai nei:
Afai e faʻamaeʻaina lelei le fausiaina, o le a matou mauaina se imeli ma faʻaiʻuga o suʻesuʻega faʻamau. Ioe, o le meli e le na o le pau lea o le auala e maua ai se lipoti. E mafai ona e filifilia soʻo se auala faʻatinoga. Ae e taua le manatua pe a maeʻa le fausiaina, o le a le mafai ona faʻaogaina faila masini masini.
Aotelega sese
Ua mae'a manuia le vaega pito sili ona faigata. Ia tatou mautinoa e aoga uma a tatou taumafaiga. Seʻi o tatou vaʻavaʻai i nisi o mea manaia mai le lipoti o suʻesuʻega faʻapitoa na oʻo mai ia te aʻu i meli (e le o se mea na ou faʻaalia ai).
Fa'atonuga mata'utia
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 lapataiga:
O lenei fasi code o loʻo tuʻuina i totonu o le faʻamaufaʻailoga faʻapipiʻi, peitaʻi, o loʻo i ai se faʻaletonu matuia o le puipuiga (
; Line 355
mov r8d, 20
xor edx, edx
lea rcx, QWORD PTR sum$[rsp]
call memset
; Line 356
O mea uma o loʻo faʻatulagaina ma le faʻatinoga faʻamanatu ua faʻataunuʻuina, ma faʻasolo ai faʻamatalaga taua i le RAM, ae ui i lea, aua le fiafia i le taimi nei. Se'i tatou va'ai i le lisi fa'apotopotoga o le Fa'asalalauga fa'atasi ma le fa'alelei:
; 354 :
; 355 : memset( sum, 0, sizeof( sum ) );
; 356 :}
E pei ona mafai ona vaʻaia mai le lisi, na le amanaʻia e le tagata faʻapipiʻi le valaau faʻamanatu. E mafua lenei mea i le mea moni i totonu o le galuega sha1 ina ua uma le valaau faʻamanatu le toe fa'asino i le fausaga CTX. O le mea lea, e le iloa e le tagata faʻapipiʻi se mea e faʻaumatia ai le taimi o le gaosiga e faʻaaogaina ai le manatua e le faʻaaogaina i le lumanaʻi. E mafai ona e faʻaleleia lenei mea e ala i le faʻaaogaina o le galuega RtlSecureZeroMemory poʻo
Tauagavale:
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 ) );
}
Faatusatusaga le talafeagai
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 lapataiga:
Faʻalogo i le isi lala mo le muamua if. O le code o le a fa'atinoina na'o tulaga uma leftvol > 0xFFFF || rightvol > 0xFFFF || leftvol < 0 || rightvol < 0 o le a iu ina pepelo. O le mea lea, matou te maua faʻamatalaga nei, lea o le a moni mo le isi lala: leftvol <= 0xFFFF, rightvol <= 0xFFFF, leftvol >= 0 и rightvol >= 0. Matau faamatalaga mulimuli e lua. E talafeagai le siakiina o le a le tulaga talafeagai mo le faʻatinoina o lenei fasi code?
O lea e mafai ai ona matou aveese ma le saogalemu ia faʻamatalaga faʻapitoa:
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);
}
}
O le isi fa'aaliga. O lo'o i ai se ituaiga o mea sese o lo'o natia i tua o nei tulaga fa'aletonu. Atonu latou te leʻi siakiina mea e manaʻomia.
Ctrl+C Ctrl+V Toe Toe
static u32 scePsmfSetPsmf(u32 psmfStruct, u32 psmfData) {
if (!Memory::IsValidAddress(psmfData) ||
!Memory::IsValidAddress(psmfData)) {
return hleReportError(ME, SCE_KERNEL_ERROR_ILLEGAL_ADDRESS, "bad address");
}
....
}
Fa'alogo lelei ile siaki i totonu if. E te le manatu ea o se mea uiga ese tatou te siaki pe aoga le tuatusi? psmfData, faaluaina? O lea la e foliga ese lenei mea ia te aʻu ... O le mea moni, o le mea moni, o se typo, ma o le manatu o le siakiina o faʻamaufaʻailoga uma e lua.
Filifiliga sa'o:
static u32 scePsmfSetPsmf(u32 psmfStruct, u32 psmfData) {
if (!Memory::IsValidAddress(psmfStruct) ||
!Memory::IsValidAddress(psmfData)) {
return hleReportError(ME, SCE_KERNEL_ERROR_ILLEGAL_ADDRESS, "bad address");
}
....
}
Fesuiaiga galo
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 lapataiga:
O lenei mea sese o loʻo i totonu o le faila la, e le talafeagai tele i le poloketi, ae na maua le pusa ae ou te leʻi matauina, o lea na ou filifili ai e alu ese. I le uma, o lenei tusiga e le o le toe iloiloina o mea sese, ae e uiga i le tuʻufaʻatasia ma Travis CI, ma e leai se faʻatulagaga o le suʻega na faia.
Fesuiaiga fua e amataina i se fa'aauau, peita'i, e le'o fa'aaogaina i le fa'ailoga, e o'o i lalo i le tagata fa'afoe if, lea, ioe, e maua ai sese a o siaki tulaga, aua, e pei ona tatou manatua, fua tutusa ma le leai. E leai foi se uiga o siaki mulimuli ane.
E foliga mai, na galo i le tusitala o le vaega o le code e sui ai le fesuiaiga fua i luma o lena.
taofi
Atonu o i'ina tatou te i'u ai i mea sese. O le faʻamoemoe o lenei tusiga o le faʻaalia lea o le galuega a le PVS-Studio faʻatasi ma Travis CI, ae le o le suʻesuʻeina o le poloketi i le maeʻaeʻa e mafai ai. Afai e te manaʻo i ni mea sese tetele ma sili atu ona matagofie, e mafai ona e faʻamemelo i taimi uma
iʻuga
O le fa'aogaina o 'au'aunaga i luga ole laiga e fausia ai galuega fa'atasi ma le fa'ata'ita'iga o su'esu'ega fa'aopoopo e mafai ai ona e maua le tele o fa'afitauli i le taimi lava e tu'ufa'atasia ai le code. Ae ui i lea, o le tasi fale atonu e le lava, o lea o le faʻatulagaina o suʻega faʻatasi ma suʻesuʻega static o le a faʻaleleia atili ai le lelei o le code.
aoga fesoʻotaʻiga
Afai e te manaʻo e faʻasoa lenei tusiga i se faʻalogo Igilisi, faʻamolemole faʻaoga le fesoʻotaʻiga faʻaliliu: Maxim Zvyagintsev.
puna: www.habr.com