ProHoster > Blog > fitantanan-draharaha > Ahoana ny fametrahana PVS-Studio ao amin'ny Travis CI amin'ny fampiasana ny emulator PSP ho ohatra
Ahoana ny fametrahana PVS-Studio ao amin'ny Travis CI amin'ny fampiasana ny emulator PSP ho ohatra
Travis CI dia serivisy tranonkala mizara ho an'ny fananganana sy fitsapana rindrambaiko izay mampiasa GitHub ho fampiantranoana kaody loharano. Ho fanampin'ireo toe-javatra miasa etsy ambony, azonao atao ny manampy ny fisaorana anao manokana amin'ny safidy fanitsiana be dia be. Amin'ity lahatsoratra ity dia hamboarina Travis CI hiara-miasa amin'ny PVS-Studio amin'ny fampiasana ny ohatra kaody PPSSPP.
fampidirana
Travis C.I. dia serivisy tranonkala ho an'ny fananganana sy fitiliana rindrambaiko. Matetika izy io no ampiasaina miaraka amin'ny fomba fampidirana mitohy.
PPSSPP - PSP lalao console emulator. Ny programa dia afaka maka tahaka ny fandefasana lalao rehetra avy amin'ny sary kapila natao ho an'ny Sony PSP. Navoaka taminβny 1 Novambra 2012 ilay fandaharana. PPSSPP dia nahazo alalana tamin'ny GPL v2. Afaka manao fanatsarana ny tsirairay kaody loharanon'ny tetikasa.
PVS Studio - mpanadihady kaody static amin'ny fitadiavana lesoka sy ny mety ho vulnerability amin'ny code program. Amin'ity lahatsoratra ity, ho an'ny fanovana, dia hanomboka ny PVS-Studio tsy eo an-toerana amin'ny milina mpamorona, fa amin'ny rahona, ary hitady lesoka ao amin'ny PPSSPP.
Andao ho any amin'ny tranokala Travis C.I.. Aorian'ny fanomezan-dΓ lana amin'ny fampiasana ny kaontinao GitHub dia hahita lisitr'ireo tahiry izahay:
Ho an'ny fitsapana, dia nitsambikina ny PPSSPP aho.
Mavitrika ny tahiry izay tiantsika angonina:
Amin'izao fotoana izao, Travis CI dia tsy afaka manangana ny tetikasanay satria tsy misy toromarika momba ny fananganana. Noho izany dia tonga ny fotoana hanaovana configuration.
Mandritra ny famakafakana dia mety hahasoa antsika ny variables sasany, ohatra, ny lakile ho an'ny PVS-Studio, izay tsy tiana holazaina amin'ny rakitra fanamafisana. Andao Γ ry hanampy ny fari-piainan'ny tontolo iainana amin'ny alΓ lan'ny fananganana fananganana ao amin'ny Travis CI:
Mila izany isika:
PVS_USERNAME - solonanarana
PVS_KEY - fanalahidy
MAIL_USER - mailaka ampiasaina handefasana ny tatitra
MAIL_PASSWORD - tenimiafina mailaka
Ny roa farany dia tsy voatery. Ireo dia hampiasaina handefasana valiny amin'ny mailaka. Raha te hizara ny tatitra amin'ny fomba hafa ianao dia tsy mila manondro azy ireo.
Noho izany, nampianay ny fari-piainan'ny tontolo iainana ilaintsika:
Andeha isika hamorona rakitra .travis.yml ary apetraho eo amin'ny fototry ny tetikasa izany. Ny PPSSPP dia efa nanana fisie fanamafisam-peo ho an'ny Travis CI, na izany aza, lehibe loatra izy io ary tsy mety amin'ny ohatra, ka tsy maintsy nanatsotra azy io izahay ary namela ireo singa fototra ihany.
Voalohany, andeha hojerentsika ny fiteny, ny dikan-tenin'ny Ubuntu Linux izay tiantsika hampiasaina amin'ny milina virtoaly, ary ny fonosana ilaina amin'ny fananganana:
Ny fonosana rehetra voatanisa dia ilaina manokana ho an'ny PPSSPP.
Izao dia manondro ny matrix assembly:
matrix:
include:
- os: linux
compiler: "gcc"
env: PPSSPP_BUILD_TYPE=Linux PVS_ANALYZE=Yes
- os: linux
compiler: "clang"
env: PPSSPP_BUILD_TYPE=Linux
Miresaka bebe kokoa momba ny fizarana teraka. Ao amin'ny Travis CI, misy fomba roa hamoronana safidy fananganana: ny voalohany dia ny mamaritra ny lisitry ny mpamoron-javatra, ny karazana rafitra miasa, ny fari-piainan'ny tontolo iainana, sns., ary avy eo ny matrix amin'ny fitambarana rehetra azo atao; ny faharoa dia famantarana mazava ny matrix. Mazava ho azy, azonao atao ny manambatra ireo fomba roa ireo ary manampy tranga tsy manam-paharoa, na, mifanohitra amin'izany, manilika izany amin'ny fampiasana ny fizarana manilika. Afaka mamaky bebe kokoa momba izany ianao ao amin'ny Travis CI documentation.
Ny hany sisa tavela dia ny manome torolΓ lana momba ny fivoriambe manokana:
Travis CI dia ahafahanao manampy ny baikonao manokana amin'ny dingana isan-karazany amin'ny fiainan'ny milina virtoaly. Faritra before_install novonoina alohan'ny fametrahana fonosana. dia hametraka, izay manaraka ny fametrahana fonosana avy amin'ny lisitra addons.aptizay voalazanay etsy ambony. Ny fivoriambe mihitsy no atao ao teny. Raha nandeha tsara ny zava-drehetra dia ho ao anatin'izany isika aorian_fahombiazana (Ao amin'ity fizarana ity no hanaovana fanadihadiana static). Tsy ireo dingana rehetra ireo no azo ovaina, raha mila bebe kokoa ianao dia tokony hijery Travis CI documentation.
Ho fanamorana ny famakiana dia napetraka ao anaty script mitokana ny baiko .travis.sh, izay apetraka eo amin'ny fototry ny tetikasa.
Noho izany dia manana ity rakitra manaraka ity izahay .travis.yml:
Alohan'ny hametrahana ny fonosana dia havaozinay ny submodules. Ilaina izany hananganana PPSSPP. Andeha ampio ny fiasa voalohany amin'ny .travis.sh (mariho ny fanitarana):
Ankehitriny dia tonga mivantana amin'ny fametrahana ny fandefasana mandeha ho azy ny PVS-Studio ao amin'ny Travis CI. Voalohany dia mila mametraka ny fonosana PVS-Studio amin'ny rafitra isika:
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
}
Amin'ny fiandohan'ny asa travis_install mametraka ny compiler ilaintsika amin'ny fampiasana ny fari-piainan'ny tontolo iainana. Dia raha ny variable $PVS_ANALYZE mitahiry sanda Eny (Nolazainay tao amin'ny fizarana izany mandefa mandritra ny fananganana matrix configuration), apetrakay ny fonosana pvs-studio. Ho fanampin'izany dia aseho ihany koa ny fonosana libio-socket-ssl-perl ΠΈ libnet-ssleay-perl, na izany aza, takiana amin'ny valin'ny mailaka izy ireo, ka tsy ilaina izany raha nisafidy fomba hafa handefasana ny tatitrao ianao.
asa download_extract misintona sy manala ny arisiva voatondro:
Fotoana izao hametrahana ny tetikasa. Izany dia mitranga ao amin'ny fizarana teny:
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
}
Raha ny marina, ity dia fanamafisam-peo tany am-boalohany, afa-tsy ireto andalana ireto:
if [ "$PVS_ANALYZE" = "Yes" ]; then
CMAKE_ARGS="-DCMAKE_EXPORT_COMPILE_COMMANDS=On ${CMAKE_ARGS}"
fi
Amin'ity fizarana code ity dia napetrakay cmake saina ho fanondranana baiko fanangonana. Ilaina izany ho an'ny mpanadihady kaody static. Afaka mamaky bebe kokoa momba izany ianao ao amin'ny lahatsoratra "Ahoana ny fampandehanana ny PVS-Studio amin'ny Linux sy macOS".
Raha nahomby ny fivoriambe dia tonga izahay aorian_fahombiazana, izay anaovanay analyse static:
Ny andalana voalohany dia mamorona rakitra fahazoan-dΓ lana avy amin'ny solon'anarana sy fanalahidy izay nofaritanay tany am-piandohana rehefa nanangana ny fari-piainan'ny Travis CI.
Ny andalana faharoa dia manomboka mivantana ny fanadihadiana. sainam-pirenena -j mametraka ny isan'ny kofehy hanaovana fanadihadiana, saina -l manondro lisansa, saina -o mamaritra ny rakitra ho an'ny famoahana logs, ary ny saina -disableLicenseExpirationCheck ilaina amin'ny dikan-teny andrana, satria amin'ny alΓ lan'ny default pvs-studio-analyzer hampitandrina ny mpampiasa fa efa ho lany ny fahazoan-dΓ lana. Mba hisorohana izany tsy hitranga, azonao atao ny mamaritra ity saina ity.
Ny rakitra log dia misy vokatra manta izay tsy azo vakiana raha tsy misy fiovam-po, noho izany dia tsy maintsy ataonao ho mora vakiana aloha ilay rakitra. Andao handalo ny logs plog-converter, ary ny vokatra dia rakitra html.
Amin'ity ohatra ity dia nanapa-kevitra ny handefa tatitra amin'ny mailaka aho amin'ny fampiasana ny baiko sendemail.
Vokatr'izany dia nahazo ity rakitra manaraka ity izahay .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;
Fotoana izao hanosehana ny fanovana ao amin'ny tahiry git, ary avy eo ny Travis CI dia hampandeha ho azy ny fananganana. Tsindrio ny "ppsspp" raha handeha amin'ny tatitra fananganana:
Ho hitantsika ny topimaso momba ny fananganana ankehitriny:
Raha vita soa aman-tsara ny fananganana dia hahazo mailaka misy ny valin'ny fanadihadiana static izahay. Mazava ho azy fa tsy ny mailaka ihany no fomba hahazoana tatitra. Afaka misafidy izay fomba fampiharana ianao. Saingy zava-dehibe ny mitadidy fa rehefa vita ny fananganana dia tsy azo atao ny miditra amin'ny rakitra milina virtoaly.
Famintinana diso
Nahavita soa aman-tsara ny ampahany sarotra indrindra izahay. Andeha hojerentsika izao fa mendrika ny ezaka rehetra ataontsika. Andeha hojerentsika ny hevitra mahaliana sasany avy amin'ny tatitra momba ny famakafakana static izay tonga tamiko tamin'ny alΓ lan'ny mailaka (tsy hoe tsy maninona no nambarako izany).
PVS-Studio fampitandremana: V597 Ny compiler dia afaka mamafa ny 'memset' function call, izay ampiasaina hanesorana ny 'sum' buffer. Ny fiasa RtlSecureZeroMemory() dia tokony ampiasaina hamafa ny angona manokana. sha1.cpp 325
Ity sombin-kaody ity dia hita ao amin'ny maodely hashing azo antoka, na izany aza, misy lesoka fiarovana lehibe (CWE-14). Andeha hojerentsika ny lisitry ny fivoriambe izay novokarina rehefa nanangona ny dikan-teny Debug:
; Line 355
mov r8d, 20
xor edx, edx
lea rcx, QWORD PTR sum$[rsp]
call memset
; Line 356
Milamina sy miasa ny zava-drehetra memeset dia novonoina, noho izany dia overwriting angona manan-danja ao amin'ny RAM, na izany aza, aza mifaly fotsiny. Andeha hojerentsika ny lisitry ny fivoriamben'ny famoahana famoahana miaraka amin'ny fanatsarana:
Araka ny hita amin'ny lisitra dia tsy noraharahain'ilay mpanangona ilay antso memeset. Izany dia noho ny zava-misy fa ao amin'ny asa sha1 aorian'ny antso memeset tsy misy resaka rafitra intsony CTX. Noho izany, ny compiler dia tsy mahita hevitra amin'ny fandaniam-potoana amin'ny processeur overwriting fahatsiarovana izay tsy ampiasaina amin'ny ho avy. Azonao atao ny manamboatra izany amin'ny fampiasana ny fiasa RtlSecureZeroMemory na toy izany koa aminy.
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);
}
}
Tandremo ny sampana hafa ho an'ny voalohany if. Ny kaody dia hotanterahina raha tsy misy fepetra rehetra leftvol > 0xFFFF || rightvol > 0xFFFF || leftvol < 0 || rightvol < 0 hivadika ho lainga. Noho izany dia mahazo ireto fanambarana manaraka ireto isika, izay ho marina amin'ny sampana hafa: voly havia <= 0xFFFF, rightvol <= 0xFFFF, leftvol >= 0 ΠΈ rightvol >= 0. Mariho ireo fanambarana roa farany. Misy dikany ve ny manamarina hoe inona no fepetra ilaina amin'ny fanatanterahana io fehezan-dalΓ na io?
Noho izany dia azontsika esorina soa aman-tsara ireto fanambarana misy fepetra ireto:
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);
}
}
V501 Misy zana-teny mitovy '!Memory::IsValidAddress(psmfData)' eo ankavia sy eo ankavanan'ny '||' mpandraharaha. scePsmf.cpp 703
Tandremo ny seky ao anatiny if. Tsy mahagaga ve ny manamarina raha marina ny adiresy? psmfData, avo roa heny? Ka toa hafahafa amiko izany... Raha ny marina, mazava ho azy fa diso izany, ary ny hevitra dia ny hanamarina ireo paramètre fampidirana.
Ity hadisoana ity dia hita ao amin'ny lahatahiry ext, ka tsy dia misy ifandraisany loatra amin'ilay tetikasa, fa ny bug dia hita talohan'ny nahatsikaritra azy, ka nanapa-kevitra ny handao azy aho. Raha ny marina, ity lahatsoratra ity dia tsy momba ny famerenana ny lesoka, fa momba ny fampidirana amin'ny Travis CI, ary tsy nisy ny fanamafisam-peo natao.
Miovaova habe dia natomboka tamin'ny tsy miova, na izany aza, tsy ampiasaina mihitsy ao amin'ny code, hatrany amin'ny operator if, izay, mazava ho azy, manome diso eo am-pandinihana ny fepetra, satria, araka ny tsaroantsika, habe mitovy amin'ny aotra. Tsy misy dikany koa ny fisavana manaraka.
Raha ny fahitana azy dia hadinon'ny mpanoratra ny sombin-kaody ny nanoro ny fari-piainana habe talohan'izay.
MijanΓ²na
Eto no mety hiafarantsika amin'ny fahadisoana. Ny tanjon'ity lahatsoratra ity dia ny hanehoana ny asan'ny PVS-Studio miaraka amin'i Travis CI, fa tsy hamakafaka ny tetikasa araka izay tratra. Raha mila fahadisoana lehibe sy tsara tarehy kokoa ianao, dia azonao atao ny midera azy ireo foana eto :).
famaranana
Ny fampiasana serivisy tranonkala hananganana tetikasa miaraka amin'ny fampiharana ny famakafakana fanampiny dia ahafahanao mahita olana maro avy hatrany aorian'ny fampifangaroana kaody. Na izany aza, mety tsy ho ampy ny fananganana iray, ka ny fametrahana fitiliana miaraka amin'ny famakafakana static dia hanatsara ny kalitaon'ny code.