Travis CI ืืื ืฉืืจืืช ืืื ืืจื ื ืืืืืจ ืืื ืืืช ืืืืืงืช ืชืืื ืืช ืืืฉืชืืฉ ื-GitHub ืืืืกืื ืงืื ืืงืืจ. ืื ืืกืฃ ืืชืจืืืฉื ืืืคืขืื ืื "ื, ืืชื ืืืื ืืืืกืืฃ ืืฉืื ืืืืืช ืืืคืฉืจืืืืช ืืชืฆืืจื ืื ืจืืืืช. ืืืืืจ ืื ื ืืืืจ ืืช Travis CI ืืขืืื ืขื PVS-Studio ืืืืฆืขืืช ืืืืื ืืงืื PPSSPP.
ืืืื
ืืืืจืช Travis CI
ื ืฆืืจื ืืืืจ ื-GitHub, ืฉืื ื ืืฆื ืืคืจืืืงื ืฉืื ื ืฆืจืืืื, ืืื ืื ืืคืชื ืขืืืจ PVS-Studio (ืชืืื ืืงืื
ืืื ื ืื ืืืชืจ
ืืืืืงื, ืืืืคืชื PPSSPP.
ืื ื ืืคืขืืืื ืืช ืืืืืจ ืฉืื ื ืจืืฆืื ืืืกืืฃ:
ืืจืืข, Travis CI ืื ืืืื ืืื ืืช ืืช ืืคืจืืืงื ืฉืื ื ืื ืืื ืืืจืืืช ืืื ืืื. ืื ืืืืข ืืืื ืืืืืจื.
ืืืืื ืื ืืชืื, ืืื ืืฉืชื ืื ืืืื ืฉืืืืฉืืื ืขืืืจื ื, ืืืฉื, ืืืคืชื ืขืืืจ PVS-Studio, ืฉืื ืจืฆืื ืืฆืืื ืืงืืืฅ ืืชืฆืืจื. ืื ืืืื ื ืืกืืฃ ืืฉืชื ื ืกืืืื ืืืืฆืขืืช ืืืืจืืช ืืื ืืื ื-Travis CI:
ืื ืื ื ืฆืจืืืื:
- PVS_USERNAME - ืฉื ืืฉืชืืฉ
- PVS_KEY - ืืคืชื
- MAIL_USER - ืืืืืื ืฉืืฉืืฉ ืืฉืืืืช ืืืื
- MAIL_PASSWORD - ืกืืกืืช ืืื"ื
ืฉื ื ืืืืจืื ืื ืื ืืืคืฆืืื ืืืื. ืืื ืืฉืืฉื ืืฉืืืืช ืชืืฆืืืช ืืืืืจ. ืื ืืจืฆืื ื ืืืคืืฅ ืืช ืืืื ืืืจื ืืืจืช, ืืื ืฆืืจื ืืฆืืื ืืืชื.
ืื, ืืืกืคื ื ืืช ืืฉืชื ื ืืกืืืื ืืืจืืฉืื ืื ื:
ืขืืฉืื ืืืื ื ืืฆืืจ ืงืืืฅ .travis.yml ืืืืงื ืืืชื ืืฉืืจืฉ ืืคืจืืืงื. ื-PPSSPP ืืืจ ืืื ืงืืืฅ ืชืฆืืจื ืขืืืจ Travis CI, ืขื ืืืช, ืืื ืืื ืืืื ืืื ืืืืืจื ืื ืืชืืื ืืืืืื, ืื ืืืื ื ืฆืจืืืื ืืคืฉื ืืืชื ืืืื ืืืืฉืืืจ ืจืง ืืช ืืืืื ืืื ืืืกืืกืืื.
ืจืืฉืืช, ื ืฆืืื ืืช ืืฉืคื, ืืช ืืืจืกื ืฉื ืืืืื ืื ืืื ืืงืก ืื ืื ื ืจืืฆืื ืืืฉืชืืฉ ืืืืื ื ืืืืจืืืืืืช, ืืืืืืืืช ืืืจืืฉืืช ืืื ืืื:
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 ืืฉื ื ืฉืชื ืืจืืื ืืืฆืืจ ืืคืฉืจืืืืช ืื ืืื: ืืจืืฉืื ื ืืื ืืฆืืื ืจืฉืืื ืฉื ืืืืจืื, ืกืืื ืืขืจืืืช ืืคืขืื, ืืฉืชื ื ืกืืืื ืืื', ืืืืืจ ืืื ื ืืฆืจืช ืืืจืืฆื โโืฉื ืื ืืฉืืืืืื ืืืคืฉืจืืื; ืืฉื ื ืืื ืืื ืืืงืฆืื ืืคืืจืฉืช ืฉื ืืืืจืืฆื. ืืืืื, ื ืืชื ืืฉืื ืืช ืฉืชื ืืืืฉืืช ืืืื ืืืืืกืืฃ ืืงืจื ืืืืืื, ืื ืืืืคื, ืื ืืืืื ืืืชื ืืืืฆืขืืช ืืกืขืืฃ ืืืืฆืื. ืืชื ืืืื ืืงืจืื ืขืื ืขื ืื ื
ืื ืื ืฉื ืืชืจ ืืื ืืกืคืง ืืืจืืืช ืืจืืื ืกืคืฆืืคืืืช ืืคืจืืืงื:
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 ืืืคืฉืจ ืื ืืืืกืืฃ ืคืงืืืืช ืืฉืื ืขืืืจ ืฉืืืื ืฉืื ืื ืืืืื ืฉื ืืืื ื ืืืจืืืืืืช. ืกึธืขึดืืฃ ืืคื ื_ืืชืงื ื ืืืฆืข ืืคื ื ืืชืงื ืช ืืืืืืช. ืืืืจ ืืื ืืืชืงืื, ืืฉืจ ืขืืงื ืืืจ ืืชืงื ืช ืืืืืืืช ืืืจืฉืืื addons.aptืฉืฆืืื ื ืืืขืื. ืืืจืืื ืขืฆืื ืืชืงืืืืช ื ืชืกืจืื. ืื ืืื ืืื ืืฉืืจื, ืื ืื ืื ื ืืืฆืืื ืืช ืขืฆืื ื ืคื ืืื ืืืจื_ืืฆืืื (ืืืืง ืื ื ืคืขืื ื ืืชืื ืกืืื). ืืื ืื ืื ืืฉืืืื ืฉื ืืชื ืืฉื ืืช, ืื ืืชื ืฆืจืื ืืืชืจ, ืื ืืชื ืฆืจืื ืืืกืชืื ืคื ืืื
ืืื ืืืงื ืขื ืืงืจืืื, ืืคืงืืืืช ืืืฆืื ืืกืงืจืืคื ื ืคืจื .travis.sh, ืืฉืจ ืืืืงื ืืฉืืจืฉ ืืคืจืืืงื.
ืื ืืฉ ืื ื ืืช ืืงืืืฅ ืืื .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.sh (ืฉืืื ืื ืืืจืืื):
travis_before_install() {
git submodule update --init --recursive
}
ืืขืช ืื ื ืืืืขืื ืืฉืืจืืช ืืืืืจืช ืืืฉืงื ืืืืืืืืืช ืฉื PVS-Studio ื-Travis CI. ืจืืฉืืช ืขืืื ื ืืืชืงืื ืืช ืืืืืช 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-studio. ืื ืืกืฃ ืืื, ืืฆืืื ืืช ืื ืืืืืืช libio-socket-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
ืืืืง ืื ืฉื ืืงืื ืฉืงืืขื ื ืขืืืจ cmmake ืืื ืืืืฆืื ืคืงืืืืช ืงืืืคืืืฆืื. ืื ืืืจืื ืขืืืจ ืื ืชื ืงืื ืกืืื. ืชืืื ืืงืจืื ืขืื ืขื ืื ืืืืืจ "
ืื ืืืจืืื ืืืืชื ืืืฆืืืช, ืื ื ืืืข ืืืจื_ืืฆืืื, ืฉืื ืื ื ืืืฆืขืื ื ืืชืื ืกืืื:
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.
ืืฉืืจื ืืฉื ืืื ืืชืืืื ืืช ืื ืืชืื ืืฉืืจืืช. ืึถืึถื -ื ืืืืืจ ืืช ืืกืคืจ ืืฉืจืฉืืจืื ืื ืืชืื, ืืื -ื ืืฆืืื ืจืืฉืืื, ืืื -ืื ืืืืืจ ืืช ืืงืืืฅ ืืคืื ืืืื ืื, ืืืช ืืืื -disableLicenseExpirationCheck ื ืืจืฉ ืขืืืจ ืืจืกืืืช ื ืืกืืื, ืฉืื ืืืจืืจืช ืืืื pvs-studio-analyzer ืืืืืจ ืืช ืืืฉืชืืฉ ืฉืืจืืฉืืื ืขืืื ืืคืื. ืืื ืืื ืืข ืืช ืื, ืืชื ืืืื ืืฆืืื ืืื ืื.
ืงืืืฅ ืืืืื ืืืื ืคืื ืืืืื ืฉืื ื ืืชื ืืงืจืื ืืื ืืืจื, ืื ืชืืืื ืขืืื ืืืคืื ืืช ืืงืืืฅ ืืงืจืื. ืืืื ื ืขืืืจ ืืช ืืืืื ืื ืืืืจ-plog, ืืืคืื ืืื ืงืืืฅ HTML.
ืืืืืื ืื, ืืืืืชื ืืฉืืื ืืืืืช ืืืืืจ ืืืืฆืขืืช ืืคืงืืื ืฉืื ืืืืืื.
ืืชืืฆืื ืืื, ืงืืืื ื ืืช ืืงืืืฅ ืืื .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;
ืขืืฉืื ืืืืข ืืืื ืืืืืฃ ืืช ืืฉืื ืืืื ืืืืืจ git, ืืืืืจ ืืื Travis CI ืืจืืฅ ืืืืืืืืช ืืช ื-build. ืืืฅ ืขื "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. ืืงืื ืืืืฆืข ืจืง ืื ืื ืืชื ืืื leftvol > 0xFFFF || rightvol > 0xFFFF || leftvol < 0 || rightvol < 0 ืืชืืจืจ ืืฉืงืจื. ืืื, ืื ื ืืงืืืื ืืช ืืืฆืืจืืช ืืืืืช, ืฉืืืื ื ืืื ืืช ืขืืืจ ืขื ืฃ else: leftvol <= 0xFFFF, rightvol <= 0xFFFF, leftvol >= 0 ะธ rightvol >= 0. ืฉืืื ืื ืืฉืชื ืืืฆืืจืืช ืืืืจืื ืืช. ืืื ืืฉ ืืขื ืืืืืง ืืื ืชื ืื ืืืจืื ืืืืฆืืข ืงืืข ืงืื ืื?
ืื ื ืืื ืืืกืืจ ืืืืื ืืช ืืืฆืืจืืช ืืืืชื ืืช ืืืื:
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. ืืชื ืื ืืืฉื ืฉืื ืืืืจ ืฉืื ืื ื ืืืืงืื ืื ืืืชืืืช ืชืงืคื? psmfData, ืคื ืฉืชืืื? ืื ืื ื ืจืื ืื ืืืืจ... ืืืขืฉื, ืื ืืืืื ืืขืืช ืืงืืื, ืืืจืขืืื ืืื ืืืืืง ืืช ืฉื ื ืคืจืืืจื ืืงืื.
ืืคืฉืจืืช ื ืืื ื:
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:
ืฉืืืื ืื ืืืืงืืช ืืชืืงืืื ืฉืืืื, ืื ืื ืืืฉ ืจืืืื ืื ืืคืจืืืงื, ืืื ืืืื ื ืืฆื ืืคื ื ืฉืืืื ืชื ืื, ืื ืืืืืชื ืืขืืื ืืืชื. ืืืจื ืืื, ืืืืจ ืื ืื ืขืืกืง ืืืืืงืช ืฉืืืืืช, ืืื ืืืื ืืืจืฆืื ืขื Travis CI, ืืื ืืืฆืขื ืชืฆืืจื ืฉื ืื ืชื.
ืืฉืชื ื ืืืื ืืชืืื ืขื ืืื ืงืืืข, ืขื ืืืช, ืืื ืืื ื ืืฉืืืืฉ ืืื ืืงืื, ืขื ืืืืคืจืืืจ if, ืื ืฉืืืืื ื ืืชื ืฉืงืจ ืชืื ืืื ืืืืงืช ืืชื ืืื, ืื ืืืืืจ, ืืืื ืฉืืื ืืืคืก. ืื ืืืืืงืืช ืืืืืช ืืื ืืืืืื.
ืืื ืื ืจืื, ืืืืืจ ืฉื ืงืืข ืืงืื ืฉืื ืืืืืืฃ ืืช ืืืฉืชื ื ืืืื ืืคื ื ืฉ.
ืขืฆืืจ
ืืื ืื ืจืื ื ืกืืื ืขื ืืืขืืืืช. ืืืจืช ืืืืจ ืื ืืื ืืืืืื ืืช ืขืืืืชื ืฉื PVS-Studio ืืื ืขื Travis CI, ืืื ืื ืชื ืืช ืืคืจืืืงื ืืฆืืจื ืืกืืืืช ืืื ืืืคืฉืจ. ืื ืืชื ืจืืฆื ืืขืืืืช ืืืืืืช ืืืคืืช ืืืชืจ, ืืชื ืชืืื ืืืื ืืืชืคืขื ืืื
ืืกืงื ื
ืฉืืืืฉ ืืฉืืจืืชื ืืื ืืจื ื ืืื ืืืช ืคืจืืืงืืื ืืื ืขื ืชืจืืื ืฉื ื ืืชืื ืืฆืืืจ ืืืคืฉืจ ืื ืืืฆืื ืืขืืืช ืจืืืช ืืื ืืืืจ ืืืืื ืงืื. ืขื ืืืช, ืืืชืื ืฉืืื ื ืืื ืื ืืกืคืืง, ืื ืฉืืืืจืช ืืืืงืืช ืืื ืขื ื ืืชืื ืกืืื ืืฉืคืจ ืืฉืืขืืชืืช ืืช ืืืืืช ืืงืื.
ืงืืฉืืจืื ืฉืืืืฉืืื
ืื ืืชื ืจืืฆื ืืฉืชืฃ ืืช ืืืืืจ ืืื ืขื ืงืื ืืืืจ ืื ืืืืช, ืื ื ืืฉืชืืฉ ืืงืืฉืืจ ืืชืจืืื: ืืงืกืื Zvyagintsev.
ืืงืืจ: www.habr.com