Is seirbhís gréasáin dáilte é Travis CI chun bogearraí a thógáil agus a thástáil a úsáideann GitHub mar óstáil cód foinse. Chomh maith leis na cásanna oibriúcháin thuas, is féidir leat do bhuíochas féin a chur leis na roghanna cumraíochta fairsinge. San Airteagal seo, déanfaimid Travis CI a chumrú chun oibriú le PVS-Studio ag baint úsáide as an sampla cód PPSSPP.
Réamhrá
Travis CI a bhunú
Beidh stór de dhíth orainn ar GitHub, áit a bhfuil an tionscadal a theastaíonn uainn suite, chomh maith le eochair do PVS-Studio (is féidir leat a fháil
A ligean ar dul go dtí an suíomh
Don tástáil, forked mé PPSSPP.
Gníomhachtaimid an stór a theastaíonn uainn a bhailiú:
Faoi láthair, ní féidir le Travis CI ár dtionscadal a thógáil mar níl aon treoracha le haghaidh tógála. Mar sin tá sé in am le haghaidh cumraíochta.
Le linn na hanailíse, beidh roinnt athróg úsáideach dúinn, mar shampla, an eochair do PVS-Studio, a bheadh neamh-inmhianaithe a shonrú sa chomhad cumraíochta. Mar sin cuirimis athróga timpeallachta ag baint úsáide as na socruithe tógála in Travis CI:
Ní mór dúinn:
- PVS_USERNAME - ainm úsáideora
- PVS_KEY - eochair
- MAIL_USER - ríomhphost a úsáidfear chun an tuairisc a sheoladh
- MAIL_PASSWORD - pasfhocal ríomhphoist
Tá an dá cheann deiridh roghnach. Úsáidfear iad seo chun torthaí a sheoladh tríd an bpost. Más mian leat an tuarascáil a dháileadh ar bhealach eile, ní gá duit iad a chur in iúl.
Mar sin, tá na hathróga comhshaoil a theastaíonn uainn curtha leis againn:
Anois, déanaimis comhad a chruthú .travis.yml agus é a chur i bhfréamh an tionscadail. Bhí comhad cumraíochta ag PPSSPP do Travis CI cheana féin, áfach, bhí sé ró-mhór agus go hiomlán mí-oiriúnach don sampla, agus mar sin bhí orainn é a shimpliú go mór agus gan ach na bunghnéithe a fhágáil.
Ar dtús, cuirimis in iúl an teanga, an leagan de Ubuntu Linux a theastaíonn uainn a úsáid sa mheaisín fíorúil, agus na pacáistí riachtanacha don tógáil:
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'
Tá gach pacáiste atá liostaithe ag teastáil le haghaidh PPSSPP amháin.
Anois cuirimid an maitrís tionóil in iúl:
matrix:
include:
- os: linux
compiler: "gcc"
env: PPSSPP_BUILD_TYPE=Linux PVS_ANALYZE=Yes
- os: linux
compiler: "clang"
env: PPSSPP_BUILD_TYPE=Linux
Beagán níos mó faoin alt maitrís. I Travis CI, tá dhá bhealach ann chun roghanna tógála a chruthú: is é an chéad cheann liosta tiomsaitheoirí, cineálacha córais oibriúcháin, athróga timpeallachta, etc. a shonrú, agus ina dhiaidh sin gintear maitrís de gach teaglaim féideartha; is léiriú sainráite é an dara ceann ar an maitrís. Ar ndóigh, is féidir leat an dá chur chuige seo a chomhcheangal agus cás uathúil a chur leis, nó, ar a mhalairt, é a eisiamh ag baint úsáide as an alt eisiamh. Is féidir leat tuilleadh a léamh faoi seo i
Níl fágtha ach treoracha tionóil a bhaineann go sonrach le tionscadal a sholáthar:
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
Ceadaíonn Travis CI duit do chuid orduithe féin a chur leis le haghaidh céimeanna éagsúla de shaol an mheaisín fíorúil. Alt roimh_shuiteáil a fhorghníomhú roimh pacáistí a shuiteáil. Ansin shuiteáil, a leanann suiteáil na bpacáistí ón liosta addons.apta léirigh muid thuas. Bíonn an tionól féin ar siúl i script. Má chuaigh gach rud go maith, ansin táimid ag teacht isteach tar éis_rath (is san alt seo a rithfidh muid anailís statach). Ní hé seo na céimeanna go léir is féidir a mhodhnú, más gá duit níos mó, ba chóir duit breathnú isteach
Ar mhaithe le léamh, cuireadh na horduithe i script ar leith .travis.sh, a chuirtear ag fréamh an tionscadail.
Mar sin tá an comhad seo a leanas againn .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
Sula ndéantar na pacáistí a shuiteáil, déanfaimid na fo-mhodúil a nuashonrú. Tá sé seo ag teastáil chun PPSSPP a thógáil. Cuirimis an chéad fheidhm le .travis.sh (tabhair faoi deara an síneadh):
travis_before_install() {
git submodule update --init --recursive
}
Anois táimid ag teacht go díreach chuig seoladh uathoibríoch PVS-Studio in Travis CI a bhunú. Ar dtús ní mór dúinn an pacáiste PVS-Studio a shuiteáil ar an gcóras:
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
}
Ag tús na feidhme travis_shuiteáil suiteáilimid na tiomsaitheoirí a theastaíonn uainn ag baint úsáide as athróga timpeallachta. Ansin, má tá an athróg $PVS_ANALYZE luach siopaí Is ea (chuireamar in iúl é san alt env le linn cumraíocht maitrís a thógáil), suiteáilimid an pacáiste pvs-stiúideo. Chomh maith leis seo, cuirtear pacáistí in iúl freisin libio-soicéad-ssl-perl и libnet-ssleay-perl, áfach, tá siad ag teastáil le haghaidh torthaí postála, mar sin níl siad riachtanach má tá modh eile roghnaithe agat chun do thuairisc a sheachadadh.
Feidhm íoslódáil_sliocht íoslódáil agus díphacáil an chartlann sonraithe:
download_extract() {
aria2c -x 16 $1 -o $2
tar -xf $2
}
Tá sé in am an tionscadal a chur le chéile. Tarlaíonn sé seo sa rannóg 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
}
Go deimhin, is cumraíocht bhunaidh shimplithe é seo, ach amháin na línte seo:
if [ "$PVS_ANALYZE" = "Yes" ]; then
CMAKE_ARGS="-DCMAKE_EXPORT_COMPILE_COMMANDS=On ${CMAKE_ARGS}"
fi
Sa chuid seo den chód a shocraímid do cmake bratach chun orduithe tiomsaithe a onnmhairiú. Tá sé seo riachtanach le haghaidh anailísí cód statach. Is féidir leat tuilleadh a léamh faoi seo san alt “
Más rud é go n-éireodh leis an tionól, ansin déanaimid é tar éis_rath, áit a ndéanaimid anailís statach:
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
}
Breathnaímis níos géire ar na línte seo a leanas:
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
Gineann an chéad líne comhad ceadúnais ón ainm úsáideora agus ón eochair a shonraigh muid ag an tús nuair a bhí athróga timpeallachta Travis CI á mbunú.
Tosaíonn an dara líne an anailís go díreach. Bratach -j leagann sé amach líon na snáitheanna le haghaidh anailíse, bratach -l Léiríonn ceadúnas, bratach -ó sainmhíníonn an comhad le haghaidh outputting logs, agus an bhratach -disableLicenseExpirationCheck ag teastáil le haghaidh leaganacha trialach, ós rud é de réir réamhshocraithe pvs stiúideo-anailíseoir rabhadh a thabhairt don úsáideoir go bhfuil an ceadúnas ar tí dul in éag. Chun é seo a chosc, is féidir leat an bhratach seo a shonrú.
Tá aschur amh sa logchomhad nach féidir a léamh gan é a chomhshó, mar sin ní mór duit an comhad a léamh ar dtús. A ligean ar pas a fháil sa logs trí ploc-tiontaire, agus is comhad html an t-aschur.
Sa sampla seo, chinn mé tuairiscí a sheoladh tríd an bpost ag baint úsáide as an ordú seol ríomhphoist.
Mar thoradh air sin, fuair muid an comhad seo a leanas .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;
Anois tá sé in am na hathruithe ar an stór git a bhrú, agus ina dhiaidh sin reáchtálfaidh Travis CI an tógáil go huathoibríoch. Cliceáil ar “ppsspp” chun dul chuig na tuarascálacha tógála:
Feicfimid forbhreathnú ar an tógáil reatha:
Má chríochnaítear an tógáil go rathúil, gheobhaidh muid ríomhphost le torthaí na hanailíse statach. Ar ndóigh, ní hé an postáil an t-aon bhealach chun tuairisc a fháil. Is féidir leat aon mhodh cur chun feidhme a roghnú. Ach tá sé tábhachtach a mheabhrú, tar éis an tógáil a bheith críochnaithe, ní bheidh sé indéanta rochtain a fháil ar na comhaid meaisín fíorúil.
Achoimre earráide
Tá an chuid is deacra curtha i gcrích againn go rathúil. Anois déanaimis deimhin de gur fiú ár n-iarrachtaí go léir. Breathnaímis ar roinnt pointí suimiúla ón tuarascáil anailíse statach a tháinig chugam tríd an bpost (ní raibh sé in iúl do rud ar bith mé é).
Optimization contúirteacha
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 ) );
}
Rabhadh PVS-Studio:
Tá an píosa cód seo suite sa mhodúl hashing slán, áfach, tá locht slándála tromchúiseach ann (
; Line 355
mov r8d, 20
xor edx, edx
lea rcx, QWORD PTR sum$[rsp]
call memset
; Line 356
Tá gach rud in ord agus an fheidhm memeset a fhorghníomhú, ar an mbealach sin sonraí tábhachtacha a fhorscríobh i RAM, áfach, ná bíodh áthas ort go fóill. Breathnaímid ar an liosta tionóil den leagan Eisiúint le leas iomlán a bhaint as:
; 354 :
; 355 : memset( sum, 0, sizeof( sum ) );
; 356 :}
Mar is léir ón liostú, rinne an tiomsaitheoir neamhaird den ghlao memeset. Tá sé seo mar gheall ar an bhfíric go bhfuil sa fheidhm sha1 tar éis an ghlao memeset gan tagairt níos mó do struchtúr ctx. Dá bhrí sin, ní fheiceann an tiomsaitheoir aon phointe am próiseálaí a chur amú ag róscríobh cuimhne nach n-úsáidtear sa todhchaí. Is féidir leat é seo a shocrú tríd an bhfeidhm a úsáid RtlSecureZeroCuimhne nó
Ceart:
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 ) );
}
Comparáid gan ghá
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);
}
}
Rabhadh PVS-Studio:
Tabhair aird ar an mbrainse eile don chéad cheann if. Ní dhéanfar an cód a fhorghníomhú ach amháin má tá na coinníollacha go léir clévol > 0xFFFF || ceartvol > 0xFFFF || clébh < 0 || ceart<0 Beidh dul amach a bheith bréagach. Mar sin, faigheann muid na ráitis seo a leanas, a bheidh fíor don bhrainse eile: clévol <= 0xFFFF, ceartvol <= 0xFFFF, clé >= 0 и ceart >= 0. Tabhair faoi deara an dá ráiteas deiridh. An ndéanann sé ciall a sheiceáil cad is coinníoll riachtanach chun an píosa cód seo a fhorghníomhú?
Mar sin is féidir linn na ráitis choinníollacha seo a bhaint go sábháilte:
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);
}
}
Cás eile. Tá earráid de chineál éigin i bhfolach taobh thiar de na coinníollacha iomarcacha seo. B'fhéidir nár sheiceáil siad cad a bhí ag teastáil.
Ctrl+C Buaileann Ctrl+V Ar Ais
static u32 scePsmfSetPsmf(u32 psmfStruct, u32 psmfData) {
if (!Memory::IsValidAddress(psmfData) ||
!Memory::IsValidAddress(psmfData)) {
return hleReportError(ME, SCE_KERNEL_ERROR_ILLEGAL_ADDRESS, "bad address");
}
....
}
Tabhair aird ar an seic taobh istigh if. Nach gceapann tú go bhfuil sé aisteach go ndéanaimid seiceáil an bhfuil an seoladh bailí? psmf Sonraí, faoi dhó oiread? Is cosúil go bhfuil sé seo aisteach domsa... Go deimhin, is clóscríobh é seo ar ndóigh, agus ba é an smaoineamh an dá pharaiméadair ionchuir a sheiceáil.
Rogha ceart:
static u32 scePsmfSetPsmf(u32 psmfStruct, u32 psmfData) {
if (!Memory::IsValidAddress(psmfStruct) ||
!Memory::IsValidAddress(psmfData)) {
return hleReportError(ME, SCE_KERNEL_ERROR_ILLEGAL_ADDRESS, "bad address");
}
....
}
Athróg dearmadta
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");
}
....
}
Rabhadh PVS-Studio:
Tá an earráid seo suite san fhillteán ext, mar sin níl sé ábhartha i ndáiríre don tionscadal, ach fuarthas an fabht sular thug mé faoi deara é, agus mar sin chinn mé é a fhágáil. Tar éis an tsaoil, níl an t-alt seo faoi athbhreithniú a dhéanamh ar earráidí, ach faoi chomhtháthú le Travis CI, agus níor rinneadh aon chumraíocht den anailísí.
Athróg méid Tá tairiseach tosaithe aige, áfach, ní úsáidtear é ar chor ar bith sa chód, díreach síos go dtí an t-oibreoir if, a thugann, ar ndóigh bréagach agus na coinníollacha á seiceáil, mar, mar is cuimhin linn, méid comhionann le nialas. Ní dhéanann seiceálacha ina dhiaidh sin aon chiall freisin.
De réir dealraimh, rinne údar an bhlúire cód dearmad an athróg a scríobh méid roimhe sin.
stad
Seo nuair is dócha go gcríochnóidh muid leis na botúin. Is é cuspóir an ailt seo ná obair PVS-Studio in éineacht le Travis CI a léiriú, agus gan an tionscadal a anailísiú chomh críochnúil agus is féidir. Más mian leat botúin níos mó agus níos áille, is féidir leat admire i gcónaí iad
Conclúid
Trí úsáid a bhaint as seirbhísí gréasáin chun tionscadail a thógáil in éineacht le cleachtas anailíse incriminteach, is féidir leat go leor fadhbanna a aimsiú díreach tar éis cód a chumasc. Mar sin féin, b'fhéidir nach leor tógáil amháin, mar sin feabhsófar cáilíocht an chóid go mór trí thástáil a chur ar bun in éineacht le hanailís statach.
naisc úsáideacha
Más mian leat an t-alt seo a roinnt le lucht féachana Béarla, bain úsáid as an nasc aistriúcháin: Maxim Zvyagintsev.
Foinse: will.com