Travis CI yog ib qho kev pabcuam hauv lub vev xaib rau kev tsim thiab kev sim software uas siv GitHub ua qhov code hosting. Ntxiv rau qhov kev ua haujlwm saum toj no, koj tuaj yeem ntxiv koj tus kheej ua tsaug rau cov kev xaiv dav dav. Hauv kab lus no peb yuav teeb tsa Travis CI ua haujlwm nrog PVS-Studio siv PPSSPP code piv txwv.
Taw qhia
Teeb tsa Travis CI
Peb yuav xav tau lub chaw cia khoom ntawm GitHub, qhov chaw peb xav tau nyob, nrog rau tus yuam sij rau PVS-Studio (koj tuaj yeem tau txais
Wb mus rau qhov chaw
Rau qhov kev xeem, kuv forked PPSSPP.
Peb qhib lub repository uas peb xav mus sau:
Tam sim no, Travis CI tsis tuaj yeem tsim peb qhov project vim tias tsis muaj cov lus qhia rau kev tsim. Yog li nws yog lub sijhawm rau kev teeb tsa.
Thaum lub sij hawm tsom xam, qee qhov kev hloov pauv yuav muaj txiaj ntsig zoo rau peb, piv txwv li, tus yuam sij rau PVS-Studio, uas yuav tsis xav tau los qhia meej hauv cov ntaub ntawv teeb tsa. Yog li cia peb ntxiv qhov hloov pauv ib puag ncig siv cov teeb tsa tsim hauv Travis CI:
Peb yuav tsum tau:
- PVS_USERNAME - tus neeg siv lub npe
- PVS_KEY - key
- MAIL_USER - email uas yuav siv los xa daim ntawv tshaj tawm
- MAIL_PASSWORD - email password
Qhov kawg ob yog xaiv tau. Cov no yuav raug siv los xa cov txiaj ntsig los ntawm kev xa ntawv. Yog tias koj xav xa daim ntawv tshaj tawm rau lwm txoj hauv kev, koj tsis tas yuav qhia lawv.
Yog li, peb tau ntxiv qhov hloov pauv ib puag ncig peb xav tau:
Tam sim no cia peb tsim cov ntaub ntawv .travis.yml thiab muab tso rau hauv lub hauv paus ntawm qhov project. PPSSPP twb muaj cov ntaub ntawv teeb tsa rau Travis CI, txawm li cas los xij, nws loj dhau thiab tsis haum rau qhov piv txwv, yog li peb yuav tsum ua kom yooj yim rau nws thiab tawm tsuas yog cov ntsiab lus tseem ceeb.
Ua ntej, cia peb qhia cov lus, version ntawm Ubuntu Linux uas peb xav siv hauv lub tshuab virtual, thiab cov pob tsim nyog rau kev tsim:
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'
Txhua pob khoom uas tau teev tseg yog xav tau tshwj xeeb rau PPSSPP.
Tam sim no peb qhia qhov sib dhos matrix:
matrix:
include:
- os: linux
compiler: "gcc"
env: PPSSPP_BUILD_TYPE=Linux PVS_ANALYZE=Yes
- os: linux
compiler: "clang"
env: PPSSPP_BUILD_TYPE=Linux
Ib me ntsis ntxiv txog ntu Matrix. Hauv Travis CI, muaj ob txoj hauv kev los tsim cov kev xaiv tsim: thawj yog los qhia cov npe ntawm cov compilers, hom kev ua haujlwm, ib puag ncig hloov pauv, thiab lwm yam, tom qab ntawd cov matrix ntawm txhua qhov sib xyaw ua ke tau tsim; qhov thib ob yog qhov qhia meej ntawm matrix. Tau kawg, koj tuaj yeem ua ke ob txoj hauv kev no thiab ntxiv cov ntaub ntawv tshwj xeeb, lossis, ntawm qhov tsis sib xws, tsis suav nrog nws siv ntu tsis suav. Koj tuaj yeem nyeem ntxiv txog qhov no hauv
Txhua yam uas tseem tshuav yog muab cov lus qhia tshwj xeeb rau kev sib dhos ua ke:
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 tso cai rau koj ntxiv koj tus kheej cov lus txib rau ntau theem ntawm lub neej ntawm lub tshuab virtual. Tshooj ua ntej_install ua ntej txhim kho pob khoom. Ces nruab, uas ua raws li kev teeb tsa ntawm cov pob khoom los ntawm cov npe addons.aptuas peb tau qhia saum toj no. Lub rooj sib txoos nws tus kheej yuav siv qhov chaw hauv tsab ntawv. Yog tias txhua yam mus zoo, ces peb pom peb tus kheej hauv tom qab_ua tiav (nws yog nyob rau hauv seem no uas peb yuav khiav static tsom xam). Cov no tsis yog tag nrho cov kauj ruam uas tuaj yeem hloov kho, yog tias koj xav tau ntau dua, ces koj yuav tsum saib hauv
Kom yooj yim ntawm kev nyeem ntawv, cov lus txib tau muab tso rau hauv ib tsab ntawv cais .travis.sh, uas yog muab tso rau ntawm qhov project hauv paus.
Yog li peb muaj cov ntaub ntawv hauv qab no .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
Ua ntej txhim kho cov pob khoom, peb yuav hloov kho cov submodules. Qhov no yog xav tau los tsim PPSSPP. Cia peb ntxiv thawj qhov ua haujlwm rau .travis.sh (nco qhov txuas ntxiv):
travis_before_install() {
git submodule update --init --recursive
}
Tam sim no peb tuaj ncaj qha mus teeb tsa qhov kev tso tawm tsis siv neeg ntawm PVS-Studio hauv Travis CI. Ua ntej peb yuav tsum nruab PVS-Studio pob ntawm lub kaw lus:
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
}
Thaum pib ntawm kev ua haujlwm travis_install peb nruab cov compilers peb xav tau siv ib puag ncig variables. Ces yog qhov sib txawv $PVS_ANALYZE khaws nqi Yog (Peb tau qhia nws hauv ntu kwv yees thaum tsim matrix configuration), peb nruab lub pob pvs-studio. Ntxiv rau qhov no, cov pob khoom kuj tau qhia libio-socket-ssl-perl ΠΈ libnet-ssleay-perlTxawm li cas los xij, lawv yuav tsum tau xa cov txiaj ntsig, yog li lawv tsis tsim nyog yog tias koj tau xaiv lwm txoj hauv kev xa koj daim ntawv tshaj tawm.
muaj nuj nqi download_extract downloads thiab unpacks cov ntaub ntawv teev tseg:
download_extract() {
aria2c -x 16 $1 -o $2
tar -xf $2
}
Nws yog lub sijhawm los muab qhov project ua ke. Qhov no tshwm sim hauv ntu tsab ntawv:
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
}
Qhov tseeb, qhov no yog ib qho yooj yim thawj configuration, tshwj tsis yog rau cov kab no:
if [ "$PVS_ANALYZE" = "Yes" ]; then
CMAKE_ARGS="-DCMAKE_EXPORT_COMPILE_COMMANDS=On ${CMAKE_ARGS}"
fi
Hauv seem no code peb teem rau cmak ua chij rau exporting compilation commands. Qhov no yog tsim nyog rau ib tug static code analyzer. Koj tuaj yeem nyeem ntxiv txog qhov no hauv kab lus "
Yog tias lub rooj sib txoos ua tiav, ces peb tau mus tom qab_ua tiav, qhov twg peb ua static tsom xam:
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
}
Cia peb ua tib zoo saib cov kab hauv qab no:
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
Thawj kab tsim cov ntawv tso cai los ntawm tus neeg siv lub npe thiab tus yuam sij uas peb tau teev tseg thaum pib thaum teeb tsa Travis CI ib puag ncig hloov pauv.
Cov kab thib ob pib qhov kev tsom xam ncaj qha. Chij -j teev tus naj npawb ntawm threads rau kev tsom xam, chij -l qhia daim ntawv tso cai, chij -o txhais cov ntaub ntawv rau outputting cav, thiab tus chij -disableLicenseExpirationCheck yuav tsum tau mus sib versions, txij li thaum los ntawm lub neej ntawd pvs-studio-analyzer yuav ceeb toom rau tus neeg siv tias daim ntawv tso cai yuav tas sijhawm. Txhawm rau tiv thaiv qhov no tshwm sim, koj tuaj yeem teev tus chij no.
Cov ntaub ntawv cav muaj cov ntaub ntawv nyoos uas tsis tuaj yeem nyeem tsis tau hloov dua siab tshiab, yog li koj yuav tsum xub ua kom cov ntaub ntawv nyeem tau. Cia peb hla lub cav dhau los Plog converter, thiab cov zis yog cov ntaub ntawv html.
Hauv qhov piv txwv no, kuv txiav txim siab xa cov ntawv ceeb toom los ntawm kev xa ntawv siv cov lus txib xa email.
Yog li ntawd, peb tau txais cov ntaub ntawv hauv qab no .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;
Tam sim no nws yog lub sijhawm los thawb cov kev hloov pauv rau git repository, tom qab uas Travis CI yuav cia li khiav qhov tsim. Nyem rau ntawm "ppsspp" mus rau cov ntaub ntawv tsim:
Peb yuav pom lub ntsiab lus ntawm kev tsim tam sim no:
Yog tias kev tsim ua tiav tiav, peb yuav tau txais email nrog cov txiaj ntsig ntawm kev txheeb xyuas zoo li qub. Tau kawg, kev xa ntawv tsis yog tib txoj hauv kev kom tau txais daim ntawv qhia. Koj tuaj yeem xaiv txhua txoj kev siv. Tab sis nws tseem ceeb heev uas yuav tsum nco ntsoov tias tom qab tsim tiav, nws yuav tsis tuaj yeem nkag mus rau cov ntaub ntawv tshuab virtual.
Cov ntsiab lus yuam kev
Peb tau ua tiav qhov nyuaj tshaj plaws. Tam sim no cia peb ua kom paub tseeb tias tag nrho peb cov kev siv zog tsim nyog. Cia peb saib qee cov ntsiab lus nthuav tawm los ntawm daim ntawv qhia kev txheeb xyuas zoo li qub uas tuaj rau kuv hauv kev xa ntawv (nws tsis yog rau tsis muaj dab tsi uas kuv tau qhia nws).
Kev ua kom zoo txaus ntshai
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 ) );
}
PVS-Studio ceeb toom:
Daim code no nyob rau hauv qhov kev ruaj ntseg hashing module, txawm li cas los xij, nws muaj qhov tsis txaus ntseeg loj (
; Line 355
mov r8d, 20
xor edx, edx
lea rcx, QWORD PTR sum$[rsp]
call memset
; Line 356
Txhua yam yog nyob rau hauv kev txiav txim thiab muaj nuj nqi memeset raug tua, yog li overwriting cov ntaub ntawv tseem ceeb hauv RAM, txawm li cas los xij, tsis zoo siab tam sim no. Cia peb saib ntawm cov npe sib dhos ntawm Tso Tawm version nrog optimization:
; 354 :
; 355 : memset( sum, 0, sizeof( sum ) );
; 356 :}
Raws li tuaj yeem pom los ntawm cov npe, lub compiler ignored hu memeset. Qhov no yog vim qhov tseeb tias hauv kev ua haujlwm sha1 tom qab hu memeset tsis muaj ntau siv rau cov qauv xwm ctx. Yog li ntawd, lub compiler pom tsis muaj ntsiab lus nyob rau hauv nkim processor sij hawm overwriting nco uas tsis siv yav tom ntej. Koj tuaj yeem kho qhov no los ntawm kev siv lub luag haujlwm RtlSecureZeroMemory los yog
Yog lawm:
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 ) );
}
Kev sib piv tsis tsim nyog
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);
}
}
PVS-Studio ceeb toom:
Ua tib zoo saib lwm ceg rau thawj if. Cov cai yuav raug ua tsuas yog tias txhua yam xwm txheej leftvol > 0xFFFF || rightvol > 0xFFFF || sab laug <0 || txoj cai <0 yuav tig los ua cuav. Yog li ntawd, peb tau txais cov nqe lus hauv qab no, uas yuav muaj tseeb rau lwm ceg: leftvol <= 0xFFFF, rightvol <= 0xFFFF, luas >= 0 ΠΈ rightvol >= 0. Pom ob nqe lus kawg. Nws puas tsim nyog los xyuas seb qhov twg yog qhov tsim nyog rau kev ua tiav ntawm daim ntawv no?
Yog li peb tuaj yeem tshem tawm cov lus hais raws li nram no:
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);
}
}
Lwm qhov xwm txheej. Muaj qee yam kev ua yuam kev zais tom qab cov xwm txheej tsis txaus ntseeg no. Tej zaum lawv tsis tau txheeb xyuas qhov yuav tsum tau ua.
Ctrl + C Ctrl + V Strikes Back
static u32 scePsmfSetPsmf(u32 psmfStruct, u32 psmfData) {
if (!Memory::IsValidAddress(psmfData) ||
!Memory::IsValidAddress(psmfData)) {
return hleReportError(ME, SCE_KERNEL_ERROR_ILLEGAL_ADDRESS, "bad address");
}
....
}
Ua tib zoo saib rau daim tshev sab hauv if. Koj tsis xav tias nws yog qhov txawv uas peb tshawb xyuas seb qhov chaw nyob puas siv tau? psmfData, ob npaug ntau npaum li cas? Yog li qhov no zoo li coj txawv txawv rau kuv... Qhov tseeb, qhov no yog, ntawm chav kawm, typo, thiab lub tswv yim yog los xyuas ob qho tib si input tsis.
Kev xaiv raug:
static u32 scePsmfSetPsmf(u32 psmfStruct, u32 psmfData) {
if (!Memory::IsValidAddress(psmfStruct) ||
!Memory::IsValidAddress(psmfData)) {
return hleReportError(ME, SCE_KERNEL_ERROR_ILLEGAL_ADDRESS, "bad address");
}
....
}
Tsis nco qab variable
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");
}
....
}
PVS-Studio ceeb toom:
Qhov kev ua yuam kev no nyob hauv daim ntawv tais ceev tseg ext, yog li tsis tshua muaj feem cuam tshuam rau qhov project, tab sis tus kab mob tau pom ua ntej kuv pom nws, yog li kuv txiav txim siab tawm nws. Tom qab tag nrho, tsab xov xwm no tsis yog hais txog kev tshuaj xyuas qhov yuam kev, tab sis hais txog kev koom ua ke nrog Travis CI, thiab tsis muaj kev teeb tsa ntawm lub ntsuas ntsuas tau ua tiav.
Kuj tsis paub meej loj yog pib los ntawm qhov tsis tu ncua, txawm li cas los xij, nws tsis siv tag nrho hauv cov lej, txoj cai nqes mus rau tus neeg teb xov tooj if, uas, ntawm chav kawm, muab cuav thaum kuaj xyuas cov xwm txheej, vim tias, raws li peb nco qab, loj sib npaug rau xoom. Cov kev txheeb xyuas tom ntej kuj tsis muaj txiaj ntsig.
Thaj, tus sau ntawm cov kab lus tawg tsis nco qab los sau qhov sib txawv loj ua ntej ntawd.
Tsis txhob
Qhov no yog qhov uas peb yuav zaum kawg nrog qhov yuam kev. Lub hom phiaj ntawm tsab xov xwm no yog los qhia txog kev ua haujlwm ntawm PVS-Studio ua ke nrog Travis CI, thiab tsis yog txhawm rau txheeb xyuas qhov project kom meej li sai tau. Yog tias koj xav yuam kev loj dua thiab zoo nkauj dua, koj tuaj yeem qhuas lawv txhua lub sijhawm
xaus
Siv cov kev pabcuam hauv lub vev xaib los tsim cov haujlwm ua ke nrog kev coj ua ntawm kev ntsuas ntxiv tso cai rau koj pom ntau yam teeb meem tam sim tom qab sib koom ua ke. Txawm li cas los xij, ib qho kev tsim yuav tsis txaus, yog li kev teeb tsa kev sim ua ke nrog kev txheeb xyuas zoo li qub yuav ua rau muaj txiaj ntsig zoo ntawm cov cai.
Pab kev sib txuas lus
Yog tias koj xav qhia cov kab lus no nrog cov neeg hais lus Askiv, thov siv qhov txuas txhais lus: Maxim Zvyagintsev.
Tau qhov twg los: www.hab.com