ProHoster > Blog > Rianachd > Mar a chuireas tu PVS-Studio air dòigh ann an Travis CI a’ cleachdadh an eisimpleir de emuladair tòcan geama PSP
Mar a chuireas tu PVS-Studio air dòigh ann an Travis CI a’ cleachdadh an eisimpleir de emuladair tòcan geama PSP
Tha Travis CI na sheirbheis lìn sgaoilte airson bathar-bog togail agus deuchainn a bhios a’ cleachdadh GitHub mar aoigheachd còd stòr. A bharrachd air na suidheachaidhean obrachaidh gu h-àrd, faodaidh tu do chuid fhèin a chuir ris le taing dha na roghainnean rèiteachaidh farsaing. San artaigil seo rèitichidh sinn Travis CI gus obrachadh le PVS-Studio a’ cleachdadh eisimpleir còd PPSSPP.
Ro-ràdh
Travis CI na sheirbheis lìn airson bathar-bog togail is deuchainn. Mar as trice bidh e air a chleachdadh ann an co-bhonn ri cleachdaidhean amalachaidh leantainneach.
PPSSPP - Emulator console geama PSP. Tha am prògram comasach air aithris a dhèanamh air cur air bhog geamannan sam bith bho dhealbhan diosc airson Sony PSP. Chaidh am prògram fhoillseachadh air 1 Samhain, 2012. Tha cead aig PPSSPP fo GPL v2. Faodaidh duine sam bith leasachaidhean a dhèanamh air Còd stòr a’ phròiseict.
PVS-Studio - anailis còd statach airson a bhith a’ lorg mhearachdan agus so-leòntachd a dh’ fhaodadh a bhith ann an còd prògram. San artaigil seo, airson atharrachadh, cuiridh sinn air bhog PVS-Studio chan ann gu h-ionadail air inneal an leasaiche, ach san sgòth, agus coimheadaidh sinn airson mearachdan ann am PPSSPP.
Rachamaid chun na làraich Travis CI. Às deidh cead a bhith a’ cleachdadh do chunntas GitHub, chì sinn liosta de stòran:
Airson an deuchainn, chuir mi air falbh PPSSPP.
Bidh sinn a’ gnìomhachadh an stòr-dàta a tha sinn airson a chruinneachadh:
Aig an àm seo, chan urrainn dha Travis CI ar pròiseact a thogail leis nach eil stiùireadh ann airson togail. Mar sin tha an t-àm ann airson rèiteachadh.
Rè an anailis, bidh cuid de chaochladairean feumail dhuinn, mar eisimpleir, an iuchair airson PVS-Studio, a bhiodh neo-mhiannach a shònrachadh anns an fhaidhle rèiteachaidh. Mar sin cuir sinn caochladairean àrainneachd ris a’ cleachdadh na roghainnean togail ann an Travis CI:
Feumaidh sinn:
PVS_USERNAME - ainm-cleachdaiche
PVS_KEY - iuchair
MAIL_USER - post-d a thèid a chleachdadh gus an aithisg a chur
MAIL_PASSWORD - facal-faire post-d
Tha an dithis mu dheireadh roghainneil. Thèid iad sin a chleachdadh gus toraidhean a chuir tron phost. Ma tha thu airson an aithisg a sgaoileadh ann an dòigh eile, chan fheum thu an comharrachadh.
Mar sin, tha sinn air na caochladairean àrainneachd a tha a dhìth oirnn a chur ris:
A-nis cruthaichidh sinn faidhle .travis.yml agus cuir e ann am freumh a’ phròiseict. Bha faidhle rèiteachaidh aig PPSSPP mu thràth airson Travis CI, ge-tà, bha e ro mhòr agus gu tur mì-fhreagarrach airson an eisimpleir, agus mar sin dh'fheumadh sinn a dhèanamh nas sìmplidhe gu mòr agus fàg a-mhàin na h-eileamaidean bunaiteach.
An toiseach, comharraich sinn an cànan, an dreach de Ubuntu Linux a tha sinn airson a chleachdadh san inneal brìgheil, agus na pacaidean riatanach airson an togail:
Tha feum air a h-uile pasgan a tha air an liostadh airson PPSSPP a-mhàin.
A-nis tha sinn a 'sealltainn an matrix cruinneachaidh:
matrix:
include:
- os: linux
compiler: "gcc"
env: PPSSPP_BUILD_TYPE=Linux PVS_ANALYZE=Yes
- os: linux
compiler: "clang"
env: PPSSPP_BUILD_TYPE=Linux
Beagan a bharrachd mun roinn Matrix. Ann an Travis CI, tha dà dhòigh air roghainnean togail a chruthachadh: is e a’ chiad fhear liosta de luchd-cruinneachaidh, seòrsachan siostam obrachaidh, caochladairean àrainneachd, msaa a shònrachadh, às deidh sin thèid matrix de gach cothlamadh a chruthachadh; tha an dàrna fear na chomharra soilleir air a’ mhaitrix. Gu dearbh, faodaidh tu an dà dhòigh-obrach seo a chur còmhla agus cùis shònraichte a chur ris, no, air an làimh eile, cuir a-mach e leis an earrainn dùnadh. Faodaidh tu barrachd a leughadh mu dheidhinn seo ann an Sgrìobhainnean Travis CI.
Chan eil air fhàgail ach stiùireadh cruinneachaidh sònraichte a thoirt seachad:
Leigidh Travis CI leat na h-òrdughan agad fhèin a chuir ris airson diofar ìrean de bheatha inneal brìgheil. Earrann ro-stàlaich air a chuir gu bàs mus stàlaich thu pacaidean. An uair sin stàlaich, a tha a 'leantainn stàladh pacaidean bhon liosta addons.apta dh'ainmich sinn gu h-àrd. Bidh an co-chruinneachadh fhèin a’ gabhail àite ann an sgriobt. Ma chaidh a h-uile càil gu math, lorg sinn sinn fhìn a-staigh às dèidh_soirbheachas (Is ann san roinn seo a bhios sinn a’ ruith mion-sgrùdadh statach). Chan e seo a h-uile ceum a ghabhas atharrachadh, ma tha feum agad air barrachd, bu chòir dhut coimhead a-steach Sgrìobhainnean Travis CI.
Airson a bhith furasta an leughadh, chaidh na h-òrdughan a chuir ann an sgriobt air leth .travis.sh, a tha air a chuir aig freumh a’ phròiseict.
Mar sin tha am faidhle a leanas againn .travis.yml:
Mus stàlaich sinn na pacaidean, bheir sinn ùrachadh air na fo-mhodalan. Tha feum air seo gus PPSSPP a thogail. Nach cuir sinn a’ chiad ghnìomh ri .travis.sh (Thoir an aire don leudachadh):
A-nis thig sinn gu dìreach gu bhith a’ stèidheachadh foillseachadh fèin-ghluasadach PVS-Studio ann an Travis CI. An toiseach feumaidh sinn am pasgan PVS-Studio a stàladh air an t-siostam:
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
}
Aig toiseach an gnìomh travis_install bidh sinn a’ stàladh an luchd-cruinneachaidh a dh’ fheumas sinn a’ cleachdadh caochladairean àrainneachd. An uairsin ma tha an caochlaideach $PVS_ANALYZE luach nan stòran Tha (dh’ainmich sinn e anns an earrainn approx rè rèiteachadh matrix togail), bidh sinn a’ stàladh a ’phacaid pvs-stiùidio. A bharrachd air an seo, tha pasganan air an comharrachadh cuideachd libio-socaid-ssl-perl и libnet-ssleay-perl, ge-tà, tha feum orra airson toraidhean postachd, agus mar sin chan eil iad riatanach ma tha thu air dòigh eile a thaghadh airson an aithisg agad a lìbhrigeadh.
gnìomh download_extract luchdaich sìos agus dì-phacaich an tasglann ainmichte:
Tha an t-àm ann am pròiseact a chur ri chèile. Bidh seo a’ tachairt anns an earrainn sgriobt:
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
}
Gu dearbh, is e rèiteachadh tùsail sìmplidh a tha seo, ach a-mhàin na loidhnichean sin:
if [ "$PVS_ANALYZE" = "Yes" ]; then
CMAKE_ARGS="-DCMAKE_EXPORT_COMPILE_COMMANDS=On ${CMAKE_ARGS}"
fi
Anns an earrainn seo den chòd a shuidhich sinn cmake bratach airson às-mhalairt òrdughan cruinneachaidh. Tha seo riatanach airson anailisiche còd statach. Faodaidh tu barrachd a leughadh mu dheidhinn seo san artaigil “Mar a ruitheas tu PVS-Studio air Linux agus macOS".
Ma bha an co-chruinneachadh soirbheachail, ruigidh sinn às dèidh_soirbheachas, far am bi sinn a’ dèanamh mion-sgrùdadh staitigeach:
Bidh a’ chiad loidhne a’ gineadh faidhle cead bhon ainm-cleachdaidh agus an iuchair a shònraich sinn aig an fhìor thoiseach nuair a bha sinn a’ stèidheachadh caochladairean àrainneachd Travis CI.
Bidh an dàrna loidhne a’ tòiseachadh an anailis gu dìreach. Bratach -j a’ suidheachadh àireamh nan snàithleanan airson mion-sgrùdadh, bratach -l comharrachadh cead, bratach -o a’ mìneachadh am faidhle airson a bhith a’ cur a-mach logaichean, agus a’ bhratach - cuir à comas Cead-sgrùdaidh Expiration riatanach airson dreachan deuchainn, oir gu bunaiteach pvs-stiùidio-anailisiche bheir e rabhadh don neach-cleachdaidh gu bheil an ceadachas gu bhith a’ tighinn gu crìch. Gus casg a chuir air seo, faodaidh tu am bratach seo a shònrachadh.
Tha toradh amh anns an fhaidhle log nach gabh a leughadh gun tionndadh, agus mar sin feumaidh tu am faidhle a leughadh an-toiseach. Bheir sinn seachad na logaichean troimhe plog-tionndaidh, agus is e faidhle html a th’ anns an toradh.
San eisimpleir seo, chuir mi romhpa aithisgean a chuir tron phost a’ cleachdadh an àithne post-dealain.
Mar thoradh air an sin, fhuair sinn am faidhle 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;
A-nis tha an t-àm ann na h-atharrachaidhean air an stòr git a phutadh, agus às deidh sin bidh Travis CI a’ ruith an togail gu fèin-ghluasadach. Cliog air “ppsspp” gus a dhol gu na h-aithisgean togail:
Chì sinn sealladh farsaing air an togalach làithreach:
Ma thèid an togail a chrìochnachadh gu soirbheachail, gheibh sinn post-d le toraidhean an sgrùdaidh statach. Gu dearbh, chan e post-d an aon dòigh air aithisg fhaighinn. Faodaidh tu modh buileachaidh sam bith a thaghadh. Ach tha e cudromach cuimhneachadh nach bi e comasach faighinn gu faidhlichean inneal brìgheil às deidh an togail a chrìochnachadh.
Geàrr-chunntas mearachd
Tha sinn air a’ phàirt as duilghe a chrìochnachadh gu soirbheachail. A-nis dèanamaid cinnteach gur fhiach ar n-oidhirpean gu lèir. Bheir sinn sùil air cuid de phuingean inntinneach bhon aithisg anailis statach a thàinig thugam tron phost (cha b’ ann airson rud sam bith a chomharraich mi e).
Rabhadh PVS-Studio: V597 Dh’ fhaodadh an compiler a’ ghairm gnìomh ‘memset’ a sguabadh às, a thathas a’ cleachdadh gus bufair ‘suim’ a shruthladh. Bu chòir an gnìomh RtlSecureZeroMemory() a chleachdadh gus an dàta prìobhaideach a dhubhadh às. sha1.cpp 325
Tha am pìos còd seo suidhichte anns a’ mhodal hashing tèarainte, ge-tà, tha fìor lochd tèarainteachd ann (CWE-14). Bheir sinn sùil air an liosta cruinneachaidh a thèid a chruthachadh nuair a bhios sinn a’ cur ri chèile an dreach Debug:
; Line 355
mov r8d, 20
xor edx, edx
lea rcx, QWORD PTR sum$[rsp]
call memset
; Line 356
Tha a h-uile dad ann an òrdugh agus an gnìomh memeset air a chur gu bàs, mar sin a’ sgrìobhadh thairis air dàta cudromach ann an RAM, ge-tà, na dèan gàirdeachas fhathast. Nach toir sinn sùil air liosta co-chruinneachaidh an dreach Release le optimization:
Mar a chithear bhon liostadh, cha tug an neach-cruinneachaidh an aire don ghairm memeset. Tha seo air sgàth gu bheil ann an gnìomh sha1 às deidh a’ ghairm memeset gun iomradh a bharrachd air structar ctx. Mar sin, chan eil an compiler a’ faicinn feum sam bith ann a bhith a’ caitheamh ùine pròiseasar a’ sgrìobhadh thairis air cuimhne nach eilear a’ cleachdadh san àm ri teachd. Faodaidh tu seo a chàradh le bhith a’ cleachdadh a’ ghnìomh RtlSecureZeroCuimhne no coltach rithe.
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);
}
}
Thoir aire don mheur eile airson a 'chiad uair if. Thèid an còd a chur an gnìomh a-mhàin ma tha a h-uile suidheachadh clìvol > 0xFFFF || còir> 0xFFFF || clìvol < 0 || còir <0 tionndaidhidh e gu bhi meallta. Mar sin, gheibh sinn na h-aithrisean a leanas, a bhios fìor airson a’ mheur eile: clìvol <= 0xFFFF, còir <= 0xFFFF, clì>= 0 и còir >= 0. Mothaich an dà aithris mu dheireadh. A bheil e ciallach dearbhadh dè an suidheachadh a tha riatanach airson a’ phìos còd seo a chur an gnìomh?
Mar sin is urrainn dhuinn na h-aithrisean cumhach seo a thoirt air falbh gu sàbhailte:
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);
}
}
Sgeul eile. Tha mearachd de sheòrsa air choreigin falaichte air cùl nan cumhachan sin nach eil feum. Is dòcha nach do rinn iad sgrùdadh air na bha a dhìth.
V501 Tha an aon fho-aithris ann '!Memory::IsValidAddress(psmfData)' air an taobh chlì agus air an làimh dheis den '||' gnìomhaiche. scPsmf.cpp 703
Thoir aire don t-seic a-staigh if. Nach eil thu a’ smaoineachadh gu bheil e neònach gun dèan sinn sgrùdadh a bheil an seòladh dligheach? psmf Dàta, a dhà uiread? Mar sin tha seo a 'coimhead neònach dhomh ... Gu dearbh, is e typo a tha seo, gu dearbh, agus b' e am beachd a bhith a 'sgrùdadh an dà pharaimear inntrigidh.
Tha am mearachd seo suidhichte sa phasgan ext, mar sin chan eil e gu math buntainneach don phròiseact, ach chaidh am biast a lorg mus do mhothaich mi e, agus mar sin chuir mi romhpa fhàgail. Às deidh na h-uile, chan eil an artaigil seo mu dheidhinn ath-sgrùdadh mhearachdan, ach mu bhith ag amalachadh le Travis CI, agus cha deach rèiteachadh an anailisiche a dhèanamh.
Caochlaideach meud air a thòiseachadh le seasmhach, ge-tà, chan eil e air a chleachdadh idir sa chòd, dìreach sìos chun ghnìomhaiche if, a tha, gu dearbh, a 'toirt seachad ceàrr agus sinn a’ cumail sùil air na suidheachaidhean, oir, mar a chuimhnicheas sinn, meud co-ionann ri neoni. Chan eil sgrùdaidhean às deidh sin a’ dèanamh ciall sam bith cuideachd.
A rèir choltais, dhìochuimhnich ùghdar a’ chriomag còd an caochladair a sgrìobhadh thairis meud roimhe sin.
stad
Seo far an tig sinn gu crìch leis na mearachdan. Is e adhbhar an artaigil seo obair PVS-Studio a thaisbeanadh còmhla ri Travis CI, agus gun a bhith a’ dèanamh mion-sgrùdadh air a’ phròiseact cho mionaideach ‘s a ghabhas. Ma tha thu ag iarraidh mearachdan nas motha agus nas bòidhche, faodaidh tu an-còmhnaidh a bhith gam meas an seo :).
co-dhùnadh
Le bhith a’ cleachdadh seirbheisean lìn gus pròiseactan a thogail còmhla ri cleachdadh mion-sgrùdadh mean air mhean leigidh sin dhut mòran dhuilgheadasan a lorg dìreach às deidh dhut còd a chur còmhla. Ach, dh’ fhaodadh nach bi aon togail gu leòr, agus mar sin le bhith a’ stèidheachadh deuchainn còmhla ri mion-sgrùdadh statach leasaichidh sin càileachd a’ chòd gu mòr.