ProHoster > ΠΠ»ΠΎΠ³ > Maamulka > Sida loo habeeyo PVS-Studio gudaha Travis CI iyadoo la adeegsanayo tusaale ahaan emulator-ka ciyaarta ciyaarta PSP
Sida loo habeeyo PVS-Studio gudaha Travis CI iyadoo la adeegsanayo tusaale ahaan emulator-ka ciyaarta ciyaarta PSP
Travis CI waa adeeg shabakadeed oo loo qaybiyey dhisidda iyo tijaabinta software kaas oo u adeegsada GitHub martigelinta koodhka isha. Marka lagu daro xaaladaha hawlgalka ee kor ku xusan, waxaad ku dari kartaa adigaaga mahadsanid fursadaha qaabeynta ballaaran. Maqaalkan waxaan ku habeyn doonaa Travis CI si uu ula shaqeeyo PVS-Studio iyadoo la adeegsanayo tusaalaha koodhka PPSSPP.
PPSSPP - Emulator game console PSP. Barnaamijku waxa uu awood u leeyahay in uu ku dayo bilaabista ciyaar kasta oo ka timid sawirada diskooga loogu talagalay Sony PSP. Barnaamijka waxa uu soo baxay November 1, 2012 PPSSPP waxa ay ku shatiyeysan tahay GPL v2. Qof kasta ayaa hagaajin kara code isha mashruuca.
PVS-Studio - Falanqeeye koodhka taagan ee raadinta khaladaadka iyo dayacanka suurtagalka ah ee koodhka barnaamijka. Maqaalkan, isbeddelka, waxaanu bilaabi doonaa PVS-Studio ma aha gudaha mashiinka horumarinta, laakiin daruuraha, oo raadi khaladaadka PPSSPP.
Dejinta Travis CI
Waxaan u baahan doonaa meel kayd ah oo ku taal GitHub, halkaas oo mashruuca aan u baahanahay uu yaalo, iyo sidoo kale furaha PVS-Studio (waxaad heli kartaa furaha tijaabada ama bilaash ah mashaariicda Isha Furan).
Waqtigan xaadirka ah, Travis CI ma dhisi karo mashruucayaga sababtoo ah ma jiraan tilmaamo lagu dhisayo. Markaa waa waqtigii qaabaynta.
Inta lagu jiro falanqaynta, doorsoomayaasha qaarkood ayaa faa'iido inoo yeelan doona, tusaale ahaan, furaha PVS-Studio, kaas oo aan loo baahnayn in lagu qeexo faylka qaabeynta. Markaa aynu ku darno doorsoomayaasha deegaanka annagoo adeegsanayna goobaha dhismaha ee Travis CI:
Waxaan u baahan doonaa:
PVS_USERNAME - magaca isticmaalaha
PVS_KEY - fure
MAIL_USER - iimaylka loo isticmaali doono in lagu soo diro warbixinta
MAIL_PASSWORD - erayga sirta ah ee iimaylka
Labada ugu dambeeya waa ikhtiyaari. Kuwaas waxaa loo isticmaali doonaa in lagu soo diro natiijooyinka boostada. Haddii aad rabto inaad si kale u qaybiso warbixinta, uma baahnid inaad iyaga tilmaamto.
Markaa, waxaanu ku darnay doorsoomayaasha deegaanka ee aanu u baahanahay:
Hadda aan abuurno fayl .travis.yml oo dhig xididka mashruuca. PPSSPP waxay horey u haysatay faylka qaabeynta Travis CI, si kastaba ha ahaatee, waxay ahayd mid aad u weyn oo gebi ahaanba aan ku habboonayn tusaale ahaan, markaa waa inaan si weyn u fududeyno oo aan ka tagno oo kaliya qaybaha aasaasiga ah.
Marka hore, aan tilmaanno luqadda, nooca Ubuntu Linux ee aan rabno inaan ku isticmaalno mashiinka farsamada, iyo xirmooyinka lagama maarmaanka u ah dhismaha:
Dhammaan baakadaha liiska ku jira ayaa si gaar ah loogu baahan yahay PPSSPP.
Hadda waxaan tilmaannaa matrixka shirka:
matrix:
include:
- os: linux
compiler: "gcc"
env: PPSSPP_BUILD_TYPE=Linux PVS_ANALYZE=Yes
- os: linux
compiler: "clang"
env: PPSSPP_BUILD_TYPE=Linux
Wax yar oo dheeraad ah oo ku saabsan qaybta Matrix. Travis CI, waxaa jira laba siyaabood oo loo abuuro fursado dhismo: marka hore waa in la qeexo liiska isku-dubaridyada, noocyada nidaamka hawlgalka, doorsoomayaasha deegaanka, iwm. Midda labaad waa tilmaan cad oo shaxanka. Dabcan, waxaad isku dari kartaa labadan hab oo aad ku dari kartaa kiis gaar ah, ama, liddi ku ah, ka saar adigoo isticmaalaya qaybta ka baxsan. Waxaad wax badan oo arrintan ku saabsan ka akhriyi kartaa gudaha Dukumentiyada Travis CI.
Waxa hadhay oo dhan waa in la bixiyo hab-raacyada isu-ururinta ee mashruuca-gaarka ah:
Travis CI wuxuu kuu ogolaanayaa inaad ku darto amarradaada heerar kala duwan oo nolosha mashiinka farsamada ah. Qaybta ka hor_install la fuliyay ka hor inta aan la rakibin baakadaha. Markaa rakibi, kaas oo raacaya rakibaadda baakadaha liiska addons.ku habboonoo aan kor ku tilmaamnay. Golaha laftiisa ayaa ka dhaca script. Haddii wax walba si fiican u dhaceen, markaas waxaan is helaynaa gudaha kadib_guul (waa qaybtan in aan ku samayn doono falanqaynta taagan). Kuwani maaha dhammaan tallaabooyinka la beddeli karo, haddii aad u baahan tahay wax badan, markaa waa inaad eegtaa Dukumentiyada Travis CI.
Si loo fududeeyo akhrinta, amarrada waxaa lagu dhejiyay qoraal gaar ah .travis.sh, kaas oo la dhigo xididka mashruuca.
Markaa waxaan haynaa faylka soo socda .travis.yml:
Ka hor inta aan la rakibin xirmooyinka, waxaan cusbooneysiin doonaa submodules. Tan waxaa loo baahan yahay si loo dhiso PPSSPP. Aynu ku darno shaqada ugu horreysa .travis.sh (ogow kordhinta):
Hadda waxaan si toos ah u nimid inaan dejino si toos ah bilaabista PVS-Studio ee Travis CI. Marka hore waxaan u baahanahay inaan ku rakibno xirmada PVS-Studio nidaamka:
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
}
Bilowga shaqada travis_install waxaan ku rakibnaa qalabeeyayaasha aan u baahanahay anagoo adeegsanayna doorsoomayaasha deegaanka. Markaa haddii doorsoomuhu $PVS_ANALYZE kaydiya qiimaha Haa (waxaanu ku tilmaamnay qaybta dir inta lagu guda jiro qaabeynta matrixka), waxaan ku rakibnaa xirmada pvs-studio. Intaa waxaa dheer, baakadaha ayaa sidoo kale la tilmaamay libio-socket-ssl-perl ΠΈ libnet-ssleay-perl, si kastaba ha ahaatee, waxaa looga baahan yahay natiijooyinka boostada, markaa lagama maarmaan maaha haddii aad dooratay hab kale oo aad ku gudbiso warbixintaada.
function soo dejiso_saar soo dejiso oo ka furto kaydka la cayimay:
Waa waqtigii la isku dari lahaa mashruuca. Tani waxay ku dhacdaa qaybta 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
}
Dhab ahaantii, tani waa qaabeynta asalka ah ee la fududeeyay, marka laga reebo khadadkan:
if [ "$PVS_ANALYZE" = "Yes" ]; then
CMAKE_ARGS="-DCMAKE_EXPORT_COMPILE_COMMANDS=On ${CMAKE_ARGS}"
fi
Qaybtan koodka waxaan u dejinay samee calanka dhoofinta amarada isu-ururinta. Tani waxay lagama maarmaan u tahay falanqaynta koodhka taagan. Waxaad wax badan oo arrintan ku saabsan ka akhriyi kartaa maqaalka "Sida loo socodsiiyo PVS-Studio Linux iyo macOSΒ«.
Haddii golaha uu guulaystey, markaa waan helnaa kadib_guul, halkaas oo aan ku samayno falanqaynta taagan:
Xariiqda koowaad waxay soo saartaa faylka shatiga ee magaca isticmaalaha iyo furaha aan ku qeexnay bilawgii bilawgii markii la dejinayo doorsoomayaasha deegaanka Travis CI.
Sadarka labaad wuxuu si toos ah u bilaabayaa falanqaynta. Calan -j dejiyaa tirada dunta falanqaynta, calanka -l waxay tilmaamaysaa shatiga, calanka -o wuxuu qeexayaa faylka soo saarida logs, iyo calanka -DableLicenseExpirationCheck looga baahan yahay noocyada tijaabada, tan iyo markii default pvs-studio-analyzer wuxuu uga digayaa isticmaalaha in shatiga uu dhacayo. Si aysan taasi u dhicin, waxaad cayimi kartaa calankan.
Faylka loggu wuxuu ka kooban yahay wax soo saar cayriin ah oo aan la akhrin karin beddelaad la'aan, marka waa inaad marka hore ka dhigtaa faylka mid la akhriyi karo. Aan ka gudubno geedaha rog-beddele, oo wax soo saarku waa faylka html.
Natiijo ahaan, waxaan helnay faylka soo socda .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;
Hadda waa waqtigii lagu riixi lahaa isbeddelada kaydka git, ka dib Travis CI wuxuu si toos ah u maamuli doonaa dhismaha. Guji "ppsspp" si aad u tagto warbixinnada dhismaha:
Waxaan arki doonaa dulmar guud ee dhismaha hadda:
Haddii dhismuhu si guul leh u dhammaado, waxaan heli doonaa iimayl wata natiijooyinka falanqaynta taagan. Dabcan, boostada maaha habka kaliya ee lagu helo warbixinta. Waxaad dooran kartaa hab kasta oo hirgelinta. Laakiin waxaa muhiim ah in la xasuusto in ka dib markii la dhammeeyo dhismaha, ma suurtagal noqon doonto in la galo faylasha mashiinka farsamada.
Soo koobid khalad
Waxaan si guul ah u dhamaystirnay qaybtii ugu adkeyd. Hadda aynu hubinno in dhammaan dadaalkeena uu u qalmo. Bal aan eegno qodobbo xiiso leh oo ka mid ah warbixintii falanqaynta ma guurtada ah ee boostada iigu timid (ma ahayn mid aan ku tilmaamay).
Digniinta PVS-Studio: V597 Soo-sameeyaha ayaa tirtiri kara wicitaanka shaqada 'memset', kaas oo loo isticmaalo in lagu daadiyo 'wadarta' kaydka. Shaqada RtlSecureZeroMemory() waa in la isticmaalo si loo tirtiro xogta gaarka ah. sha1.cpp 325
Qaybtan koodka ah waxa ay ku dhex taal qaybta hashing-ka ee sugan, si kastaba ha ahaatee, waxa ku jira cilad amni oo halis ah (CWE-14). Aynu eegno liiska golaha ee la soo saaray marka la ururinayo nooca Debug:
; Line 355
mov r8d, 20
xor edx, edx
lea rcx, QWORD PTR sum$[rsp]
call memset
; Line 356
Wax walba waa hagaagsan yihiin iyo shaqada xusuus Waa la fuliyaa, oo sidaas ku beddela xogta muhiimka ah ee RAM, si kastaba ha ahaatee, ha ku farxin weli. Aynu eegno liiska golaha ee nooca Siideynta oo la hagaajinayo:
Sida ka muuqata liiska, iskudubariduhu wuu iska dhega tiray wicitaankii xusuus. Tani waxay sabab u tahay xaqiiqda ah in shaqada sha1 wicitaanka kadib xusuus ma jirto tixraac dheeraad ah oo ku saabsan qaabdhismeedka CTX. Sidaa darteed, compiler-ku wax macno ah uma arko in processor-ku wakhtiga ku luminayo xusuusta aan la isticmaalin mustaqbalka. Waxaad hagaajin kartaa tan adoo isticmaalaya shaqada RtlSecureZeroMemory ama la mid ah ku socota iyada.
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);
}
}
U fiirso laanta kale marka ugu horeysa if. Koodhka waxaa la fulin doonaa kaliya haddii dhammaan shuruudaha bidix> 0xFFFF || rightvol> 0xFFFF || bidix <0 || midigta <0 waxay noqon doontaa been. Sidaa darteed, waxaan helnaa weedhahan soo socda, oo run u noqon doona laanta kale: bidix <= 0xFFFF, midigta <= 0xFFFF, bidix >= 0 ΠΈ midigta>= 0. U fiirso labada hadal ee u dambeeya. Miyay macno samaynaysaa in la hubiyo waxa shardiga lagama maarmaanka u ah fulinta qaybtan koodka?
Markaa waxaan si badbaado leh uga saari karnaa weedhahan shuruudaysan:
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);
}
}
Xaalad kale. Waxaa jira nooc ka mid ah khaladka qarsoon ee ka dambeeya xaaladahan aan badnayn. Waxaa laga yaabaa inaysan hubin waxa loo baahan yahay.
V501 Waxa jira odhaah-hoosaadyo isku mid ah '!Memory::IsValidAddress(psmfData)' ee bidix iyo midig ee '||' hawlwadeen. scePsmf.cpp 703
U fiirso jeegga gudaha if. Miyaadan u malayn inay la yaab leh tahay in aan hubinno in ciwaanku uu sax yahay iyo in kale? psmfData, laba jeer ka badan? Markaa tani waxay iila muuqataa qariib... Dhab ahaantii, tani waa, dabcan, typo, fikraduna waxay ahayd in la hubiyo labada cabbir ee wax-gelinta.
Ciladani waxay ku taal galka dheer, si aan dhab ahaantii u khusayn mashruuca, laakiin cayayaanka ayaa la helay ka hor intaanan ogaanin, markaa waxaan go'aansaday inaan ka tago. Ka dib oo dhan, maqaalkani maaha mid ku saabsan dib u eegista khaladaadka, laakiin ku saabsan isdhexgalka Travis CI, iyo wax qaabeyn ah oo falanqeeye ah lama fulin.
Isbadal size waxaa lagu bilaabay si joogto ah, si kastaba ha ahaatee, laguma isticmaalo dhammaan koodka, ilaa hadda hawlwadeenka if, kaas oo, dabcan, bixiya been ah marka la hubinayo shuruudaha, sababtoo ah, sida aan xasuusano, size oo le'eg eber. Jeegaga xiga sidoo kale macno ma samaynayaan.
Tani waa halka ay u badan tahay in aan ku dhamaan doono khaladaadka. Ujeedada maqaalkani waa in la muujiyo shaqada PVS-Studio oo ay weheliso Travis CI, oo aan loo falanqeyn mashruuca sida ugu macquulsan. Haddii aad rabto khaladaad ka weyn oo qurux badan, mar walba waad u bogi kartaa iyaga halkan :).
gunaanad
Isticmaalka adeegyada shabakada si aad u dhisto mashaariicda si wadajir ah ula dhaqmaan falanqaynta kordhinta waxay kuu ogolaaneysaa inaad hesho dhibaatooyin badan isla markiiba ka dib marka la isku daro code. Si kastaba ha ahaatee, hal dhismo ayaa laga yaabaa inaanay ku filnayn, markaa samaynta tijaabada oo ay weheliso falanqaynta joogtada ah waxay si weyn u wanaajin doontaa tayada koodka.