Travis CI ã¯ãGitHub ããœãŒã¹ ã³ãŒã ãã¹ãã£ã³ã°ãšããŠäœ¿çšãããœãããŠã§ã¢ã®æ§ç¯ãšãã¹ãã®ããã®åæ£ Web ãµãŒãã¹ã§ãã äžèšã®æäœã·ããªãªã«å ããŠãåºç¯ãªæ§æãªãã·ã§ã³ãå©çšããŠç¬èªã®æäœã·ããªãªãè¿œå ã§ããŸãã ãã®èšäºã§ã¯ãPPSSPP ã³ãŒãäŸã䜿çšããŠãPVS-Studio ã§åäœããããã« Travis CI ãæ§æããŸãã
å°å ¥
Travis CI ã®ã»ããã¢ãã
å¿
èŠãªãããžã§ã¯ããé
眮ãããŠãã GitHub äžã®ãªããžããªãšãPVS-Studio ã®ããŒãå¿
èŠã«ãªããŸã (å
¥æã§ããŸã)ã
çŸå Žã«è¡ã£ãŠã¿ãŸããã
ãã¹ãã®ããã«ãPPSSPPããã©ãŒã¯ããŸããã
åéããããªããžããªãã¢ã¯ãã£ãåããŸãã
çŸæç¹ã§ã¯ããã«ãã®æ瀺ããªããããTravis CI ã¯ãããžã§ã¯ãããã«ãã§ããŸããã ããã§ã¯ãèšå®ãããŠã¿ãŸãããã
åæäžã«ãæ§æãã¡ã€ã«ã§æå®ããã®ã¯æãŸãããªã PVS-Studio ã®ããŒãªã©ãããã€ãã®å€æ°ã圹ç«ã¡ãŸãã ããã§ã¯ãTravis CI ã®ãã«ãèšå®ã䜿çšããŠç°å¢å€æ°ãè¿œå ããŸãããã
ç§ãã¡ã¯ãå¿
èŠããããŸãã
- PVS_USERNAME - ãŠãŒã¶ãŒå
- PVS_KEY - ããŒ
- MAIL_USER - ã¬ããŒãã®éä¿¡ã«äœ¿çšãããé»åã¡ãŒã«
- MAIL_PASSWORD - ã¡ãŒã«ãã¹ã¯ãŒã
æåŸã® XNUMX ã€ã¯ãªãã·ã§ã³ã§ãã ãããã¯çµæãã¡ãŒã«ã§éä¿¡ããããã«äœ¿çšãããŸãã å¥ã®æ¹æ³ã§ã¬ããŒããé åžããå Žåã¯ãæå®ããå¿ èŠã¯ãããŸããã
ããã§ãå¿ èŠãªç°å¢å€æ°ãè¿œå ããŸããã
ããã§ã¯ãã¡ã€ã«ãäœæããŸããã .travis.yml ããããããžã§ã¯ãã®ã«ãŒãã«çœ®ããŸãã PPSSPP ã«ã¯ãã§ã« Travis CI çšã®èšå®ãã¡ã€ã«ããããŸãããã倧ããããŠäŸã«ãŸã£ããé©ããŠããªãã£ãããã倧å¹
ã«ç°¡ç¥åããŠåºæ¬èŠçŽ ã®ã¿ãæ®ãå¿
èŠããããŸããã
ãŸããèšèªãä»®æ³ãã·ã³ã§äœ¿çšãã Ubuntu Linux ã®ããŒãžã§ã³ããã«ãã«å¿ èŠãªããã±ãŒãžãæå®ããŸãããã
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'
ãªã¹ããããŠãããã¹ãŠã®ããã±ãŒãžã¯ãPPSSPP å°çšã«å¿ èŠã§ãã
ããã§ã¢ã»ã³ããªè¡åã瀺ããŸãã
matrix:
include:
- os: linux
compiler: "gcc"
env: PPSSPP_BUILD_TYPE=Linux PVS_ANALYZE=Yes
- os: linux
compiler: "clang"
env: PPSSPP_BUILD_TYPE=Linux
ãã®ã»ã¯ã·ã§ã³ã«ã€ããŠããå°ã詳ãã ãããªãã¯ã¹ã Travis CI ã§ã¯ããã«ã ãªãã·ã§ã³ãäœæããæ¹æ³ã XNUMX ã€ãããŸããXNUMX ã€ç®ã¯ãã³ã³ãã€ã©ããªãã¬ãŒãã£ã³ã° ã·ã¹ãã ã®çš®é¡ãç°å¢å€æ°ãªã©ã®ãªã¹ããæå®ãããã®åŸããã¹ãŠã®å¯èœãªçµã¿åããã®ãããªãã¯ã¹ãçæãããŸãã XNUMX çªç®ã¯è¡åãæ瀺çã«ç€ºããŸãã ãã¡ãããããã XNUMX ã€ã®ã¢ãããŒããçµã¿åãããŠåºæã®ã±ãŒã¹ãè¿œå ããããéã«ã»ã¯ã·ã§ã³ã䜿çšããŠãããé€å€ãããããããšãã§ããŸãã é€å€ããã ããã«ã€ããŠè©³ããã¯ã
æ®ã£ãŠããã®ã¯ããããžã§ã¯ãåºæã®çµã¿ç«ãŠæé ãæäŸããããšã ãã§ãã
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 ã䜿çšãããšãä»®æ³ãã·ã³ã®ã©ã€ããµã€ã¯ã«ã®ããŸããŸãªæ®µéã«å¿ããŠç¬èªã®ã³ãã³ããè¿œå ã§ããŸãã ã»ã¯ã·ã§ã³ ã€ã³ã¹ããŒã«å ããã±ãŒãžãã€ã³ã¹ããŒã«ããåã«å®è¡ãããŸãã ãããã installããªã¹ãããã®ããã±ãŒãžã®ã€ã³ã¹ããŒã«ã«ç¶ããŸã ã¢ããªã³.aptããã¯äžã§ç€ºãããšããã§ãã ã¢ã»ã³ããªèªäœã¯æ¬¡ã®å Žæã§è¡ãããŸã ã¹ã¯ãªããã ãã¹ãŠãããŸããã£ãå Žåãç§ãã¡ã¯æ¬¡ã®ããã«ãªããŸãã æååŸ (éç解æãå®è¡ããã®ã¯ãã®ã»ã¯ã·ã§ã³ã§ã)ã å€æŽã§ããæé ã¯ããã ãã§ã¯ãããŸãããããã«å¿
èŠãªå Žåã¯ã次ã®æé ãåç
§ããŠãã ããã
èªã¿ãããããããã«ãã³ãã³ãã¯å¥ã®ã¹ã¯ãªããã«é 眮ãããŸããã .ãã©ãŽã£ã¹ã»ã·ã¥ããããžã§ã¯ãã®ã«ãŒãã«é 眮ãããŸãã
ãããã£ãŠã次ã®ãã¡ã€ã«ããããŸã .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
ããã±ãŒãžãã€ã³ã¹ããŒã«ããåã«ããµãã¢ãžã¥ãŒã«ãæŽæ°ããŸãã ããã¯PPSSPPãæ§ç¯ããããã«å¿ èŠã§ãã æåã®é¢æ°ãè¿œå ããŸããã .ãã©ãŽã£ã¹ã»ã·ã¥ (æ¡åŒµåã«æ³šæããŠãã ãã):
travis_before_install() {
git submodule update --init --recursive
}
ããã§ãTravis CI ã§ã® PVS-Studio ã®èªåèµ·åã®èšå®ã«çŽæ¥é²ã¿ãŸãã ãŸããã·ã¹ãã ã« PVS-Studio ããã±ãŒãžãã€ã³ã¹ããŒã«ããå¿ èŠããããŸãã
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_install ç°å¢å€æ°ã䜿çšããŠå¿ èŠãªã³ã³ãã€ã©ãã€ã³ã¹ããŒã«ããŸãã 次ã«ãå€æ°ã $PVS_ANALYZE 䟡å€ãä¿åãã ã¯ã (ã»ã¯ã·ã§ã³ã§ããã瀺ããŸãã env ãã«ã ãããªãã¯ã¹ã®æ§æäž)ãããã±ãŒãžãã€ã³ã¹ããŒã«ããŸã pvsã¹ã¿ãžãªã ãã®ä»ã«ãããã±ãŒãžãèšèŒãããŠããŸã libio-ãœã±ãã-ssl-perl О libnet-ssleay-perlãã ããçµæãéµéããããã«å¿ èŠãªãããã¬ããŒãã®é ä¿¡ã«å¥ã®æ¹æ³ãéžæããå Žåã¯å¿ èŠãããŸããã
æ©èœ ããŠã³ããŒã_æœåº æå®ãããã¢ãŒã«ã€ããããŠã³ããŒãããŠè§£åããŸãã
download_extract() {
aria2c -x 16 $1 -o $2
tar -xf $2
}
ãããžã§ã¯ãããŸãšããææãæ¥ãŸããã ããã¯ã»ã¯ã·ã§ã³ã§çºçããŸã ã¹ã¯ãªãã:
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
}
å®éãããã¯æ¬¡ã®è¡ãé€ããŠãåçŽåãããå ã®æ§æã§ãã
if [ "$PVS_ANALYZE" = "Yes" ]; then
CMAKE_ARGS="-DCMAKE_EXPORT_COMPILE_COMMANDS=On ${CMAKE_ARGS}"
fi
ã³ãŒãã®ãã®ã»ã¯ã·ã§ã³ã§ã¯ã次ã®ããã«èšå®ããŸã cmake ã³ã³ãã€ã«ã³ãã³ãããšã¯ã¹ããŒãããããã®ãã©ã°ã ããã¯éçã³ãŒã ã¢ãã©ã€ã¶ãŒã«å¿
èŠã§ãã ããã«ã€ããŠã¯ãèšäºããã§è©³ããèªãããšãã§ããŸãã
ã¢ã»ã³ããªãæåãããã次ã®ããšãè¡ããŸãã æååŸããã§éçåæãå®è¡ããŸãã
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
}
次ã®è¡ã詳ããèŠãŠã¿ãŸãããã
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
æåã®è¡ã§ã¯ãTravis CI ç°å¢å€æ°ãèšå®ãããšãã«æåã«æå®ãããŠãŒã¶ãŒåãšããŒããã©ã€ã»ã³ã¹ ãã¡ã€ã«ãçæããŸãã
XNUMX è¡ç®ã¯åæãçŽæ¥éå§ããŸãã ãã©ã° -j åæçšã®ã¹ã¬ããæ°ãèšå®ãããã©ã°ãèšå®ããŸãã -l ã©ã€ã»ã³ã¹ããã©ã°ã瀺ããŸã -o ãã°ãåºåãããã¡ã€ã«ãšãã©ã°ãå®çŸ©ããŸãã -disableLicenseExpirationCheck è©Šçšçã«ã¯ããã©ã«ãã§å¿ é ãªã®ã§ã pvs-ã¹ã¿ãžãªã¢ãã©ã€ã¶ãŒ ã©ã€ã»ã³ã¹ã®æå¹æéãè¿ã¥ããŠããããšããŠãŒã¶ãŒã«èŠåããŸãã ãããé²ãããã«ããã®ãã©ã°ãæå®ã§ããŸãã
ãã° ãã¡ã€ã«ã«ã¯ãå€æããªããšèªã¿åãããšãã§ããªãçã®åºåãå«ãŸããŠãããããæåã«ãã¡ã€ã«ãèªã¿åãå¯èœã«ããå¿ èŠããããŸãã ãã°ãæž¡ããŠã¿ãŸããã ããã°ã³ã³ããŒã¿ãŒãåºå㯠html ãã¡ã€ã«ã§ãã
ãã®äŸã§ã¯ã次ã®ã³ãã³ãã䜿çšããŠã¬ããŒããã¡ãŒã«ã§éä¿¡ããããšã«ããŸããã ã¡ãŒã«ãéã.
ãã®çµæã以äžã®ãã¡ã€ã«ãåŸãããŸãã .ãã©ãŽã£ã¹ã»ã·ã¥:
#/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;
次ã«ãå€æŽã git ãªããžããªã«ããã·ã¥ããŸãããã®åŸãTravis CI ãèªåçã«ãã«ããå®è¡ããŸãã ãppssppããã¯ãªãã¯ããŠãã«ã ã¬ããŒãã«ç§»åããŸãã
çŸåšã®ãã«ãã®æŠèŠã衚瀺ãããŸãã
ãã«ããæ£åžžã«å®äºãããšãéç解æã®çµæãé»åã¡ãŒã«ã§å±ããŸãã ãã¡ãããã¬ããŒããåãåãæ¹æ³ã¯éµéã ãã§ã¯ãããŸããã ä»»æã®å®è£
æ¹æ³ãéžæã§ããŸãã ãã ãããã«ãã®å®äºåŸã¯ä»®æ³ãã·ã³ã®ãã¡ã€ã«ã«ã¢ã¯ã»ã¹ã§ããªããªãããšã«æ³šæããŠãã ããã
ãšã©ãŒã®æŠèŠ
æãå°é£ãªéšåãç¡äºã«å®äºããŸããã ä»ãç§ãã¡ã®ãã¹ãŠã®åªåã䟡å€ãããããšã確èªããŸãããã ç§ã«ã¡ãŒã«ã§å±ããéç解æã¬ããŒãããèå³æ·±ãç¹ãããã€ãèŠãŠã¿ãŸããã (ç§ããããææããã®ã¯ç¡é§ã§ã¯ãããŸããã§ãã)ã
å±éºãªæé©å
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 ã®èŠå:
ãã®ã³ãŒãéšåã¯ã»ãã¥ã¢ ããã·ã¥ ã¢ãžã¥ãŒã«å
ã«ãããŸãããé倧ãªã»ãã¥ãªãã£äžã®æ¬ é¥ãå«ãŸããŠããŸã (
; Line 355
mov r8d, 20
xor edx, edx
lea rcx, QWORD PTR sum$[rsp]
call memset
; Line 356
ãã¹ãŠãæ£åžžã«æ©èœãã ã¡ã¢ãªã»ãã ãå®è¡ããããšãRAM å ã®éèŠãªããŒã¿ãäžæžããããŸããããŸã åã¶å¿ èŠã¯ãããŸããã æé©åããããªãªãŒã¹ ããŒãžã§ã³ã®ã¢ã»ã³ã㪠ãªã¹ããèŠãŠã¿ãŸãããã
; 354 :
; 355 : memset( sum, 0, sizeof( sum ) );
; 356 :}
ãªã¹ããããããããã«ãã³ã³ãã€ã©ã¯åŒã³åºããç¡èŠããŸããã ã¡ã¢ãªã»ããã ããã¯ãé¢æ°å
㧠sha1 é»è©±ã®åŸ ã¡ã¢ãªã»ãã æ§é ãžã®èšåã¯ãããããŸãã CTXã ãããã£ãŠãã³ã³ãã€ã©ã¯ãå°æ¥äœ¿çšãããªãã¡ã¢ãªãäžæžãããŠããã»ããµæéãç¡é§ã«ããããšã«æå³ããããŸããã é¢æ°ã䜿çšããŠãããä¿®æ£ã§ããŸã RtlSecureZeroMemory ãŸãã¯
æ£ããïŒ
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 ) );
}
äžå¿ èŠãªæ¯èŒ
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 ã®èŠå:
æåã®elseãã©ã³ãã«æ³šç®ããŠãã ãã ifã ã³ãŒãã¯ãã¹ãŠã®æ¡ä»¶ãæºããããå Žåã«ã®ã¿å®è¡ãããŸãã å·Šããªã¥ãŒã > 0xFFFF || å³ããªã¥ãŒã > 0xFFFF || å·Šããªã¥ãŒã < 0 || å³ããªã¥ãŒã < 0 åã§ããããšãå€æããã§ãããã ãããã£ãŠã次ã®ã¹ããŒãã¡ã³ããåŸãããŸããããã¯ãelse ãã©ã³ãã«åœãŠã¯ãŸããŸãã å·Šããªã¥ãŒã <= 0xFFFF, rightvol <= 0xFFFF, å·Šããªã¥ãŒã >= 0 О å³ããªã¥ãŒã >= 0ã æåŸã® XNUMX ã€ã®ã¹ããŒãã¡ã³ãã«æ³šç®ããŠãã ããã ãã®ã³ãŒããå®è¡ããããã«å¿ èŠãªæ¡ä»¶ã確èªããã®ã¯æå³ãããã§ãããã?
ãããã£ãŠããããã®æ¡ä»¶ã¹ããŒãã¡ã³ããå®å šã«åé€ã§ããŸãã
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);
}
}
å¥ã®ã·ããªãªã ãããã®åé·ãªæ¡ä»¶ã®èåŸã«ã¯ãããçš®ã®ãšã©ãŒãé ããŠããŸãã ãããããå¿ èŠãªãã®ã確èªããŠããªãã£ãã®ã§ã¯ãªãã§ããããã
Ctrl+C Ctrl+V ã®é襲
static u32 scePsmfSetPsmf(u32 psmfStruct, u32 psmfData) {
if (!Memory::IsValidAddress(psmfData) ||
!Memory::IsValidAddress(psmfData)) {
return hleReportError(ME, SCE_KERNEL_ERROR_ILLEGAL_ADDRESS, "bad address");
}
....
}
äžã®ãã§ãã¯ã«æ³šç® ifã äœæãæå¹ãã©ããã確èªããã®ã¯å¥åŠã ãšæããŸããã? psmfããŒã¿ã XNUMXåå€ãã§ãïŒ ããã¯ç§ã«ã¯å¥åŠã«æããŸã...å®éãããã¯ãã¡ããã¿ã€ããã¹ã§ãããäž¡æ¹ã®å ¥åãã©ã¡ãŒã¿ããã§ãã¯ãããšããèãã§ããã
æ£ãããªãã·ã§ã³:
static u32 scePsmfSetPsmf(u32 psmfStruct, u32 psmfData) {
if (!Memory::IsValidAddress(psmfStruct) ||
!Memory::IsValidAddress(psmfData)) {
return hleReportError(ME, SCE_KERNEL_ERROR_ILLEGAL_ADDRESS, "bad address");
}
....
}
å¿ããããå€æ°
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 ã®èŠå:
ãã®ãšã©ãŒã¯æ¬¡ã®ãã©ã«ãã«ãããŸã EXTãªã®ã§ãããžã§ã¯ãã«ã¯ããŸãé¢ä¿ãªãã®ã§ããããã€ã®éã«ããã°ãèŠã€ãã£ãã®ã§æŸçœ®ããããšã«ããŸããã çµå±ã®ãšããããã®èšäºã¯ãšã©ãŒã®ã¬ãã¥ãŒã«é¢ãããã®ã§ã¯ãªããTravis CI ãšã®çµ±åã«é¢ãããã®ã§ãããã¢ãã©ã€ã¶ãŒã®æ§æã¯å®è¡ãããŠããŸããã
å¯å€ ãµã€ãº å®æ°ã«ãã£ãŠåæåãããŸãããã³ãŒãå ã§ã¯æŒç®åã«è³ããŸã§ãŸã£ãã䜿çšãããŸããã ifãã¡ãããããã«ããã false æ¡ä»¶ããã§ãã¯ããªããããªããªãç§ãã¡ãèŠããŠããããã«ã ãµã€ãº ãŒãã«çããã ãã®åŸã®ãã§ãã¯ãæå³ããããŸããã
ã©ããããã³ãŒããã©ã°ã¡ã³ãã®äœæè ãå€æ°ãäžæžãããã®ãå¿ããããã§ã ãµã€ãº ãã以åã¯ã
Force Stop
ããããããã§ééããçµããããšã«ãªãã§ãããã ãã®èšäºã®ç®çã¯ãPVS-Studio ãš Travis CI ã®åäœãå®èšŒããããšã§ããããããžã§ã¯ããå¯èœãªéã培åºçã«åæããããšã§ã¯ãããŸããã ãã£ãšå€§ãããŠçŸããééããããããã°ããã€ã§ããããè³è³ããããšãã§ããŸã
ãŸãšã
Web ãµãŒãã¹ã䜿çšããŠãããžã§ã¯ããæ§ç¯ããå¢ååæãå®è·µãããšãã³ãŒããããŒãžããçŽåŸã«å€ãã®åé¡ãèŠã€ããããšãã§ããŸãã ãã ããXNUMX ã€ã®ãã«ãã§ã¯ååã§ã¯ãªãå¯èœæ§ããããããéçåæãšçµã¿åãããŠãã¹ããèšå®ãããšãã³ãŒãã®å質ãå€§å¹ ã«åäžããŸãã
䟿å©ãªãªã³ã¯é
Linux ããã³ macOS ã§ã® PVS-Studio ã®èµ·å Docker ã§ã® PVS-Studio ã®èµ·å Travis CI ããã¥ã¡ã³ã
ãã®èšäºãè±èªåã®èªè
ãšå
±æãããå Žåã¯ã翻蚳ãªã³ã¯ãMaxim Zvyagintsevãã䜿çšããŠãã ããã
åºæïŒ habr.com