Travis CI ndi ntchito yogawidwa yapaintaneti yomanga ndi kuyesa mapulogalamu omwe amagwiritsa ntchito GitHub monga gwero la code host. Kuphatikiza paziwonetsero zomwe zili pamwambapa, mutha kuwonjezera zikomo zanu pazosankha zambiri zosinthira. M'nkhaniyi tikonza Travis CI kuti igwire ntchito ndi PVS-Studio pogwiritsa ntchito chitsanzo cha PPSSPP code.
Mau oyamba
Kukhazikitsa Travis CI
Tidzafunika posungira pa GitHub, pomwe polojekiti yomwe tikufuna ili, komanso kiyi ya PVS-Studio (mutha kupeza
Tiyeni tipite kutsambali
Pakuyesa, ndinafowola PPSSPP.
Timatsegula nkhokwe yomwe tikufuna kutolera:
Pakalipano, Travis CI sangathe kumanga polojekiti yathu chifukwa palibe malangizo omanga. Ndiye nthawi yoti kasinthidwe.
Pakuwunika, zosintha zina zitha kukhala zothandiza kwa ife, mwachitsanzo, kiyi ya PVS-Studio, yomwe ingakhale yosafunikira kufotokoza mufayilo yosinthira. Chifukwa chake tiyeni tiwonjezere zosintha zachilengedwe pogwiritsa ntchito makonda omanga mu Travis CI:
Tidzafunika:
- PVS_USERNAME - dzina lolowera
- PVS_KEY - kiyi
- MAIL_USER - imelo yomwe idzagwiritsidwe ntchito kutumiza lipoti
- MAIL_PASSWORD - imelo achinsinsi
Awiri omaliza ndi osankha. Izi zidzagwiritsidwa ntchito kutumiza zotsatira ndi makalata. Ngati mukufuna kugawa lipotilo mwanjira ina, simuyenera kuwawonetsa.
Chifukwa chake, tawonjezera zosintha zachilengedwe zomwe tikufuna:
Tsopano tiyeni tipange fayilo .travis.yml ndi kuziyika muzu wa polojekiti. PPSSPP inali kale ndi fayilo yosinthika ya Travis CI, komabe, inali yaikulu kwambiri komanso yosayenerera mwachitsanzo, kotero tinayenera kuifewetsa kwambiri ndikusiya zinthu zokhazokha.
Choyamba, tiyeni tiwonetse chilankhulo, mtundu wa Ubuntu Linux womwe tikufuna kugwiritsa ntchito pamakina enieni, ndi phukusi lofunikira pakumanga:
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'
Maphukusi onse omwe adalembedwa amafunikira PPSSPP yokha.
Tsopano tikuwonetsa matrix a msonkhano:
matrix:
include:
- os: linux
compiler: "gcc"
env: PPSSPP_BUILD_TYPE=Linux PVS_ANALYZE=Yes
- os: linux
compiler: "clang"
env: PPSSPP_BUILD_TYPE=Linux
Zambiri za gawoli Matrix. Mu Travis CI, pali njira ziwiri zopangira zosankha zomangira: yoyamba ndiyo kufotokoza mndandanda wa ophatikiza, mitundu ya machitidwe ogwiritsira ntchito, kusintha kwa chilengedwe, ndi zina zotero, pambuyo pake matrix a zosakaniza zonse zomwe zingatheke amapangidwa; chachiwiri ndi chisonyezero chomveka bwino cha matrix. Zachidziwikire, mutha kuphatikiza njira ziwirizi ndikuwonjezera vuto lapadera, kapena, m'malo mwake, kusiya kugwiritsa ntchito gawoli. sungani. Mutha kuwerenga zambiri za izi mu
Zomwe zatsala ndikungopereka malangizo okhudzana ndi msonkhano:
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 imakulolani kuti muwonjezere malamulo anu pazigawo zosiyanasiyana za moyo wa makina enieni. Gawo before_install anaphedwa pamaso khazikitsa phukusi. Ndiye kukhazikitsa, zomwe zimatsatira kuyika kwa phukusi kuchokera pamndandanda addons.aptzomwe taziwonetsa pamwambapa. Msonkhano womwewo umachitikira script. Ngati zonse zidayenda bwino, ndiye kuti tidzipeza tokha pambuyo_kupambana (ndi m'gawo lino kuti tidzayendetsa static analysis). Izi sizinthu zonse zomwe zingasinthidwe, ngati mukufuna zina, muyenera kuyang'ana mkati
Kuti muwerenge mosavuta, malamulowo adayikidwa m'malemba osiyana .travis.sh, yomwe imayikidwa muzu wa polojekiti.
Chifukwa chake tili ndi fayilo yotsatirayi .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
Tisanakhazikitse phukusi, tidzasintha ma submodule. Izi ndizofunikira kuti mupange PPSSPP. Tiyeni tiwonjezere ntchito yoyamba .travis.sh (onani zowonjezera):
travis_before_install() {
git submodule update --init --recursive
}
Tsopano tabwera mwachindunji kukhazikitsa kukhazikitsidwa kwa PVS-Studio ku Travis CI. Choyamba tiyenera kukhazikitsa phukusi la PVS-Studio pa dongosolo:
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
}
Kumayambiriro kwa ntchito travis_install timayika ma compiler omwe timafunikira pogwiritsa ntchito zosintha zachilengedwe. Ndiye ngati variable $PVS_ANALYZE masitolo mtengo inde (tidaziwonetsa mu gawo kutumiza pakukonzekera matrix), timayika phukusi pvs studio. Kuphatikiza pa izi, mapaketi amawonetsedwanso libio-socket-ssl-perl ΠΈ libnet-ssleay-perl, komabe, amafunikira pazotsatira zamakalata, kotero sizofunika ngati mwasankha njira ina yoperekera lipoti lanu.
ntchito download_extract kutsitsa ndikutsegula zakale zomwe zatchulidwa:
download_extract() {
aria2c -x 16 $1 -o $2
tar -xf $2
}
Yakwana nthawi yoti tigwirizane. Izi zimachitika mu gawo script:
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
}
M'malo mwake, uku ndikusintha koyambirira kosavuta, kupatula mizere iyi:
if [ "$PVS_ANALYZE" = "Yes" ]; then
CMAKE_ARGS="-DCMAKE_EXPORT_COMPILE_COMMANDS=On ${CMAKE_ARGS}"
fi
Mu gawo ili la code timakhazikitsa cme mbendera yotumizira malamulo ophatikiza. Izi ndizofunikira pa static code analyzer. Mutha kuwerenga zambiri za izi m'nkhani yakuti "
Ngati msonkhanowo wapambana, ndiye kuti tifika pambuyo_kupambana, komwe timayesa static:
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
}
Tiyeni tiwone bwinobwino mizere iyi:
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
Mzere woyamba umapanga fayilo ya laisensi kuchokera ku dzina lolowera ndi kiyi yomwe tidatchula koyambirira pomwe tikukhazikitsa zosintha za Travis CI.
Mzere wachiwiri umayamba kusanthula mwachindunji. Mbendera -j imayika kuchuluka kwa ulusi wounika, mbendera -l limasonyeza chilolezo, mbendera -o imatanthauzira fayilo yotulutsa zipika, ndi mbendera -DibleLicenseExpirationCheck zofunikira pamitundu yoyeserera, popeza mwachisawawa pvs-studio-analyzer adzachenjeza wogwiritsa ntchito kuti chilolezo chatsala pang'ono kutha. Kuti izi zisachitike, mutha kufotokoza mbendera iyi.
Fayilo ya chipika ili ndi zotulutsa zosawerengeka zomwe sizingawerengedwe popanda kutembenuka, chifukwa chake muyenera kupanga fayiloyo kuwerengedwa. Tiyeni tidutse zipika pulagi-otembenuza, ndipo zotsatira zake ndi fayilo ya html.
Muchitsanzo ichi, ndinaganiza zotumiza malipoti pamakalata pogwiritsa ntchito lamulo sendmail.
Zotsatira zake, tapeza fayilo yotsatirayi .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;
Tsopano ndi nthawi yoti musunthire zosintha ku git repository, pambuyo pake Travis CI idzayendetsa yokha kumanga. Dinani pa "ppsspp" kuti mupite ku malipoti omanga:
Tikuwona mwachidule za zomangamanga zomwe zilipo:
Ngati kumangako kumalizidwa bwino, tidzalandira imelo ndi zotsatira za kusanthula kwa static. Inde, kutumiza makalata si njira yokhayo yolandirira lipoti. Mutha kusankha njira iliyonse yoyendetsera. Koma ndikofunikira kukumbukira kuti ntchitoyo ikamalizidwa, sikungatheke kupeza mafayilo amakina enieni.
Chidule cha zolakwika
Tamaliza bwinobwino gawo lovuta kwambiri. Tsopano tiyeni tionetsetse kuti khama lathu lonse nβlofunika. Tiyeni tiwone mfundo zochititsa chidwi kuchokera ku lipoti losasunthika lomwe lidabwera kwa ine kudzera pamakalata (sizinali pachabe zomwe ndidaziwonetsa).
Kukhathamiritsa kowopsa
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 ) );
}
Chenjezo la PVS-Studio:
Chidutswa ichi chili mu gawo lotetezedwa la hashing, komabe, lili ndi vuto lalikulu lachitetezo (
; Line 355
mov r8d, 20
xor edx, edx
lea rcx, QWORD PTR sum$[rsp]
call memset
; Line 356
Chilichonse chili mwadongosolo komanso ntchito yake memeset imachitidwa, potero imachotsa zofunikira mu RAM, komabe, musasangalale panobe. Tiyeni tiwone mndandanda wamtundu wa Release ndi kukhathamiritsa:
; 354 :
; 355 : memset( sum, 0, sizeof( sum ) );
; 356 :}
Monga tikuwonera pamndandanda, wophatikizayo adanyalanyaza kuyimba memeset. Ichi ndi chifukwa chakuti mu ntchito sha1 atatha kuyimba memeset palibenso kufotokoza za kapangidwe ctx pa. Chifukwa chake, wopangayo sawona chifukwa chowononga nthawi ya purosesa ndikulemba kukumbukira komwe sikudzagwiritsidwa ntchito mtsogolo. Mutha kukonza izi pogwiritsa ntchito ntchitoyi RtlSecureZeroMemory kapena
Molondola:
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 ) );
}
Kuyerekezera kosafunika
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);
}
}
Chenjezo la PVS-Studio:
Samalani ndi nthambi ina yoyamba if. Code idzachitidwa pokhapokha ngati zikhalidwe zonse leftvol> 0xFFFF || rightvol> 0xFFFF || leftvol <0 || rightvol <0 zidzasanduka zabodza. Chifukwa chake, timapeza mawu otsatirawa, omwe angakhale owona ku nthambi ina: leftvol <= 0xFFFF, rightvol <= 0xFFFF, leftvol = 0 ΠΈ mphamvu > = 0. Taonani ziganizo ziwiri zomaliza. Kodi n'zomveka kuyang'ana chomwe chiri chofunikira pakukwaniritsidwa kwa kachidutswa kameneka?
Chifukwa chake titha kuchotsa mosamala mawu awa:
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);
}
}
Zochitika zina. Pali mtundu wina wa zolakwika zomwe zabisika kuseri kwa zinthu zosafunikira izi. Mwina sanaone zimene zinkafunika.
Ctrl+C Ctrl+V Kumenya Mmbuyo
static u32 scePsmfSetPsmf(u32 psmfStruct, u32 psmfData) {
if (!Memory::IsValidAddress(psmfData) ||
!Memory::IsValidAddress(psmfData)) {
return hleReportError(ME, SCE_KERNEL_ERROR_ILLEGAL_ADDRESS, "bad address");
}
....
}
Samalani cheke mkati if. Kodi simukuganiza kuti ndizodabwitsa kuti tiyang'ane ngati adilesiyo ndi yovomerezeka? psmfData, kuwirikiza kawiri? Kotero izi zikuwoneka zachilendo kwa ine ... Ndipotu izi, ndithudi, typo, ndipo lingaliro linali loyang'ana magawo onse olowetsamo.
Njira yolondola:
static u32 scePsmfSetPsmf(u32 psmfStruct, u32 psmfData) {
if (!Memory::IsValidAddress(psmfStruct) ||
!Memory::IsValidAddress(psmfData)) {
return hleReportError(ME, SCE_KERNEL_ERROR_ILLEGAL_ADDRESS, "bad address");
}
....
}
Mwayiwala kusintha
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");
}
....
}
Chenjezo la PVS-Studio:
Vutoli lili mufoda p, kotero sizinali zogwirizana ndi polojekitiyi, koma cholakwikacho chinapezeka ndisanachizindikire, kotero ndinaganiza zochisiya. Kupatula apo, nkhaniyi sikunena za kuwunika zolakwika, koma za kuphatikiza ndi Travis CI, ndipo palibe kasinthidwe ka analyzer.
Zosiyanasiyana kukula imayambitsidwa ndi nthawi zonse, komabe, sichigwiritsidwa ntchito konse mu code, mpaka kwa woyendetsa if, zomwe, ndithudi, zimapereka zabodza poyang'ana zikhalidwe, chifukwa, monga tikukumbukira, kukula zofanana ndi ziro. Kufufuza kotsatira sikumvekanso.
Mwachiwonekere, wolemba kachidutswa ka code anaiwala kubwereza kusintha kukula zisanachitike.
Imani
Apa ndi pamene ife mwina mapeto ndi zolakwa. Cholinga cha nkhaniyi ndikuwonetsa ntchito ya PVS-Studio pamodzi ndi Travis CI, osati kusanthula pulojekitiyo mokwanira momwe mungathere. Ngati mukufuna zolakwika zazikulu komanso zokongola, mutha kuzisilira nthawi zonse
Pomaliza
Kugwiritsa ntchito mautumiki apaintaneti kuti mumange mapulojekiti limodzi ndi kusanthula kowonjezereka kumakupatsani mwayi wopeza zovuta zambiri mukangophatikiza ma code. Komabe, kumanga kumodzi sikungakhale kokwanira, kotero kukhazikitsa kuyesa pamodzi ndi kusanthula kwa static kudzasintha kwambiri khalidwe la code.
maulalo othandiza
Ngati mukufuna kugawana nkhaniyi ndi omvera olankhula Chingerezi, chonde gwiritsani ntchito ulalo womasulira: Maxim Zvyagintsev.
Source: www.habr.com