Travis CI ááẠGitHub ááᯠá¡áááºážá¡ááŒá
áºáá¯áẠhosting á¡ááŒá
Ạá¡áá¯á¶ážááŒá¯ááá·áº áááºáá±á¬ááºááŒááºážááŸáá·áº á
ááºážáááºááŒááºážáá±á¬á·ááºáá²á¡ááœáẠááŒáá·áºáá±áá¬ážáá±á¬ áááºáááºáá±á¬ááºááŸá¯áá
áºáá¯ááŒá
áºáááºá á¡áááºáá±á¬áºááŒáá« áááºáááºááŸá¯á¡ááŒá±á¡áá±áá»á¬ážá¡ááŒááºá áá»ááºááŒáá·áºáá±á¬ ááœá²á·á
ááºážááŸá¯áá¯á¶á
á¶ááœá±ážáá»ááºááŸá¯áá»á¬ážááœáẠááá·áºááá¯ááºááá¯ááºáá»á±ážáá°ážáááºááŸá¯ááᯠáááºááá·áºááœááºážááá¯ááºáááºá á€áá±á¬ááºážáá«ážááœáẠáá»áœááºá¯ááºááá¯á·ááẠPPSSPP áá¯ááºááá°áá¬ááᯠá¡áá¯á¶ážááŒá¯á Travis CI ááᯠPVS-Studio ááŸáá·áº á¡áá¯ááºáá¯ááºááẠá
á®á
ááºáá±ážáá«áááºá
áááá«ááºáž
Travis CI ááᯠá áá áºááá·áºááœááºážááŒááºážá
áá»áœááºá¯ááºááá¯á·ááá¯á¡ááºáá±á¬ ááá±á¬áá»ááºáááºááŸááᬠGitHub ááœáẠááá¯ááŸá±á¬ááºáá¯á¶áá
áºáá¯á¡ááŒáẠPVS-Studio á¡ááœááºáá±á¬á·áá
áºáᯠááá¯á¡ááºáá«ááẠ(áááºáááá¯ááºáááº
ááá¯ááºááᯠááœá¬ážááŒáá·áºáá¡á±á¬ááº
á
á¬áá±ážááœá²á¡ááœáẠáá»áœááºáá±á¬áº PPSSPP ááᯠââááŒáœá±áá¬áá²á·áááºá
áá»áœááºá¯ááºááá¯á·á á¯áá±á¬ááºážááá¯áá±á¬ repository ááᯠá¡áááºááœááºážáááº-
áá±á¬áá±á¬áááºááœááºá Travis CI ááẠáá»áœááºá¯ááºááá¯á·áááá±á¬áá»ááºááᯠáááºáá±á¬ááºááẠááœáŸááºááŒá¬ážáá»ááºáááŸááá±á¬ááŒá±á¬áá·áº ááá±á¬ááºááá¯ááºáá«á áá«ááᯠconfiguration áá¯ááºááá¯á·á¡áá»áááºáá±á¬ááºááŒá®á
ááœá²ááŒááºážá áááºááŒá¬ááŸá¯á¡ááœááºážá á¡áá»áá¯á·áá±á¬ variable áá»á¬ážááẠáá»áœááºá¯ááºááá¯á·á¡ááœáẠá¡áá¯á¶ážáááºáááá·áºáááºá á¥ááá¬á configuration file ááœáẠáááºááŸááºáááºáááá¯áá±á¬ PVS-Studio á¡ááœááºáá±á¬á·ááŒá áºáááºá ááá¯á·ááŒá±á¬áá·áº Travis CI ááœáẠáááºáá±á¬ááºááŸá¯áááºáááºáá»á¬ážááᯠá¡áá¯á¶ážááŒá¯á áááºáááºážáá»áẠvariable áá»á¬ážááᯠááá·áºááŒáá«á áá¯á·á
áá»áá±á¬áºááá¯á·ááá¯á¡ááºáá«áááº:
- PVS_USERNAME - á¡áá¯á¶ážááŒá¯áá°á¡áááº
- PVS_KEY - áá±á¬á·
- MAIL_USER - á¡á á®áááºáá¶á á¬áá±ážááá¯á·ááẠá¡áá¯á¶ážááŒá¯ááá·áº á¡á®ážáá±ážááº
- MAIL_PASSWORD - á¡á®ážáá±ážáẠá áá¬ážááŸááº
áá±á¬ááºáá¯á¶áž ááŸá áºáá¯á á áááºááŒáá¯ááºááœá±ážáááºá ááááºáá»á¬ážááᯠáá±ážááºááŒáá·áºáá±ážááá¯á·ááẠáááºážááá¯á·ááᯠá¡áá¯á¶ážááŒá¯áá«áááºá á¡á á®áááºáá¶á á¬ááᯠá¡ááŒá¬ážáááºážááŒáá·áº ááŒáá·áºáá±ááá¯áá«á áááºážááá¯á·á¡á¬áž ááœáŸááºááŒááẠáááá¯á¡ááºáá«á
ááá¯á·ááŒá±á¬áá·áºá áá»áœááºá¯ááºááá¯á·ááẠáá»áœááºá¯ááºááá¯á·ááá¯á¡ááºáá±á¬ áááºáááºážáá»ááºááŒá±á¬ááºážáá²ááŸá¯áá»á¬ážááᯠáá±á«ááºážááá·áºáá¬ážáá«áááºá
áá² ááá¯ááºáá
áºáá¯áááºáá®ážááŒáá·áºáá¡á±á¬áẠ.travis.yml áááºážááᯠááá±á¬áá»ááºá á¡ááŒá
áºááœáẠáá¬ážááŸááá«á PPSSPP ááœáẠTravis CI á¡ááœáẠconfiguration ááá¯ááºáá
áºáá¯ááŸááá¬ážááŒá®ážááŒá
áºáá±á¬áºáááºážá áááºážááẠá¥ááá¬á¡ááœáẠá¡ááœááºááŒá®ážáá¬ážááŒá®áž áá¯á¶ážááááá·áºáá»á±á¬áºáá±á¬ááŒá±á¬áá·áº áá»áœááºá¯ááºááá¯á·ááẠáááºážááᯠá¡ááœááºááá¯ážááŸááºážá¡á±á¬ááºááŒá¯áá¯ááºááŒá®áž á¡ááŒá±áá¶á¡á
áááºá¡ááá¯ááºážáá»á¬ážááá¯áᬠáá»ááºáá¬ážááááºááŒá
áºáááºá
áŠážá áœá¬á áá»áœááºá¯ááºááá¯á·á¡áá¯á¶ážááŒá¯ááá¯áá±á¬ áá¬áá¬á áá¬ážá 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 á¡ááœáẠáá®ážááá·áº ááá¯á¡ááºáá«áááºá
ááᯠáá»áœááºá¯ááºááá¯á·ááẠassembly matrix ááᯠááœáŸááºááŒáááº-
matrix:
include:
- os: linux
compiler: "gcc"
env: PPSSPP_BUILD_TYPE=Linux PVS_ANALYZE=Yes
- os: linux
compiler: "clang"
env: PPSSPP_BUILD_TYPE=Linux
á¡ááá¯ááºážáá²á· áááºáááºááŒá®áž áááºážáááºážááá¯áááºá matrix. Travis CI ááœááºá áááºáá±á¬ááºááŸá¯ááœá±ážáá»ááºá
áá¬áá»á¬ážááᯠáááºáá®ážááẠáááºážáááºážááŸá
áºáá¯ááŸááááº- áááááŸá¬ ááœááºáá®áá¬áá»á¬ážá
á¬áááºážáá
áºáá¯á áááºáááºááŸá¯á
áá
áºá¡áá»áá¯ážá¡á
á¬ážáá»á¬ážá áááºáááºážáá»ááºááŒá±á¬ááºážááœá²áá»á¬ážá
áááºááŒáá·áº áááºááŸááºáááºááŒá
áºááŒá®ážá ááá¯á·áá±á¬áẠááŒá
áºááá¯ááºááá·áºáá±á«ááºážá
ááºááŸá¯áá»á¬ážá¡á¬ážáá¯á¶ážááᯠmatrix áá
áºáá¯áá¯ááºáá±ážáááºá áá¯áááááẠmatrix á ááŒááºáá¬ážáá±á¬ ááœáŸááºááŒáá»ááºááŒá
áºáááºá áá¯ááºáá«áááºá áááºááẠá€áá»ááºážáááºáááºážááŸá
áºáá¯ááᯠáá±á«ááºážá
ááºááŒá®áž áá°ážááŒá¬ážáá±á¬ááá
á¹á
áááºáá
áºáá¯ááᯠáá±á«ááºážááá·áºááá¯ááºáááºá ááá¯á·ááá¯áẠááá·áºáá»ááºáááºá¡áá±ááŸáá·áº áááºážááᯠááá¹áááá¯á¡áá¯á¶ážááŒá¯á áááºáá¯ááºááá¯ááºáááºá áá¯ááºáááº. áá®á¡ááŒá±á¬ááºážááᯠá¡ááŒáá·áºá¡á
á¯á¶áááºááá¯ááºáá«áááºá
áá»ááºáá¬á¡á¬ážáá¯á¶ážá ááá±á¬áá»ááºá¡ááá¯áẠáááºáááºááŒááºážááá¯ááºáᬠááœáŸááºááŒá¬ážáá»ááºáá»á¬ážááᯠáá±ážáá±á¬ááºáááºááŒá áºáááº-
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 ááẠááá·áºá¡á¬áž virtual machine áá
áºáá¯á áááºáááºážá¡ááá·áºá¡áá»áá¯ážáá»áá¯ážá¡ááœáẠááá·áºááá¯ááºááá¯áẠcommand áá»á¬ážááᯠááá·áºááœááºážááá¯ááºá
á±áá«áááºá á¡ááá¯ááºáž before_install áááºáá±á·áá»áºáá»á¬áž áááá·áºááœááºážáá® áá¯ááºáá±á¬ááºáá²á·áááºá ááŒá®ážáá±á¬á· installá
á¬áááºážáá²á០áááºáá±á·áá»áºáá»á¬áž áááºáááºááŒááºážááᯠááá¯ááºáá¬áá±á¬á addons.aptá¡áááºááœááºáá±á¬áºááŒáá¬ážáá±á¬á ááááááºááá¯ááºááá¯ááºá áá±áá¬áá°áááºá áá¬ááºááœáŸááºáž. á¡á¬ážáá¯á¶ážá¡áááºááŒá±áááºá áá«ááá¯á·ááá¯ááºááá¯ááºááœá±á·ááŸá¬áá«á after_success (á€á¡ááá¯ááºážááœáẠáá»áœááºá¯ááºááá¯á·ááẠáááºááŒáááºááŸá¯ááœá²ááŒááºážá
áááºááŒá¬ááŸá¯ááᯠáá¯ááºáá±á¬ááºáá«áááº)á áá«ááœá±á ááŒá¯ááŒááºááá¯á·ááá²á· á¡ááá·áºááœá± ááá¯ááºáá°ážá áá±á¬ááºááẠááá¯á¡ááºááẠáááºááŒáá·áºááá·áºáááºá
áááºááŸá¯áááœááºáá°á á±áááºá¡ááœááºá command áá»á¬ážááᯠáá®ážááŒá¬áž script áá áºáá¯ááœáẠááá·áºááœááºážáá¬ážáááºá .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 áááºáá±á¬ááºááá¯á· ááá¯á¡ááºáááºá ááááá¯á¶áž function ááá¯ááá·áºááŒáá·áºáá¡á±á¬áẠ.travis.sh (ááá¯ážáá»á²á·ááŸá¯ááᯠáááááŒá¯áá«á)
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 áá¯ááºáá«á áááºáááºážáá»áẠááááºážááŸááºáá»á¬ážááᯠá¡áá¯á¶ážááŒá¯á ááá¯á¡ááºáá±á¬ compilers áá»á¬ážááᯠáááºáááºáá«áááºá ááŒá®ážááẠvariable ááŸáááẠ$PVS_ANALYZE áááºááá¯ážááá¯ááááºážáááºážáá«á Yes (áá»áœááºáá±á¬áºááá¯á· ááá¹áááŸá¬ áá±á¬áºááŒáá¬ážáááºá ááá¯á·áá«á build matrix configuration á¡ááœááºáž)á áá»áœááºá¯ááºááá¯á·ááẠpackage ááᯠinstall áá¯ááºáá«á pvs-á áá°áá®ááá¯. ááá¯á·á¡ááŒáẠpackages áá»á¬ážááá¯áááºážáá±á¬áºááŒáá¬ážáááºá libio-socket-ssl-perl О libnet-ssleay-perlááá¯á·áá¬ááœááºá áááºážááá¯á·ááẠá á¬ááá¯á·ááŒááºážááááºáá»á¬ážá¡ááœáẠááá¯á¡ááºáááºá ááá¯á·ááŒá±á¬áá·áº ááá·áºá¡á á®áááºáá¶á á¬áá±ážááá¯á·áááºá¡ááœáẠá¡ááŒá¬ážáááºážáááºážááᯠáááºááœá±ážáá»ááºáá«á áááºážááá¯á·ááẠáááá¯á¡ááºáá«á
áá¯ááºáá±á¬ááºáá»áẠdownload_extract áááºááŸááºáá¬ážáá±á¬ ááŸááºáááºážááᯠáá±á«ááºážáá¯ááºáá¯ááºááŒá®áž ááŒááºááœáá·áºáá«-
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
áá¯ááºáá€á¡ááá¯ááºážááœááºáá»áœááºá¯ááºááá¯á·áááºááŸááºáá¬ážáááºá ááŒááºá¥ á
á¯á
ááºážááŸá¯á¡áááá·áºáá»á¬ážááᯠáááºááá¯á·áááºá¡ááœáẠá¡áá¶á áááºážááẠstatic code ááœá²ááŒááºážá
áááºááŒá¬áá°á¡ááœáẠááá¯á¡ááºáá«áááºá áá®á¡ááŒá±á¬ááºážááᯠáá±á¬ááºážáá«ážááŸá¬ áááºáááºáááºááŸá¯ááá¯ááºáá«áááº"
á ááºážáá±ážááœá²á¡á±á¬ááºááŒááºááẠáá»áœááºáá±á¬áºááá¯á· ááœá¬ážáááºá after_successáá»áœááºá¯ááºááá¯á·ááẠáááºááŒáááºáá±á¬ááœá²ááŒááºážá áááºááŒá¬ááŸá¯ááᯠáá¯ááºáá±á¬ááºááá·áºáá±áá¬á
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 áááºáááºážáá»áẠááááºážááŸááºáá»á¬ážááᯠá áá áºááá·áºááœááºážááá·áºá¡áá« áááá á¬ááŒá±á¬ááºážááẠáá¯á¶ážá áœá²áá°á¡áááºááŸáá·áº áá±á¬á·á០ááá¯ááºá ááºááá¯ááºááᯠáá¯ááºáá±ážáá«áááºá
áá¯áááá á¬ááŒá±á¬ááºážááẠááœá²ááŒááºážá áááºááŒá¬ááŸá¯ááᯠááá¯ááºááá¯ááºá áááºáááºá á¡áᶠ-á ááœá²ááŒááºážá áááºááŒá¬ááŸá¯á¡ááœáẠthreads á¡áá±á¡ááœááºááá¯áááºááŸááºáááºá -l ááá¯ááºá ááºá á¡áá¶ááœáŸááºááŒáááºá -o ááŸááºáááºážáá»á¬áž áá¯ááºáááºá¡ááœáẠááá¯ááºááŸáá·áº á¡áá¶ááᯠáááºááŸááºáááºá -disableLicense ExpirationCheck áá¯á¶ááŸááºá¡á¬ážááŒáá·áº á ááºážáááºáá¬ážááŸááºážáá»á¬ážá¡ááœáẠááá¯á¡ááºáá«áááºá pvs-studio-analyzer ááá¯ááºá ááºáááºáááºážáá¯ááºáá±á¬á·áááºááŒá áºááŒá±á¬ááºáž áá¯á¶ážá áœá²áá°á¡á¬áž ááááá±ážáá«áááºá áá®ááá¯áááŒá áºá¡á±á¬ááºá áá®á¡áá¶ááᯠáááºááŸááºááá¯ááºáá«áááºá
ááŸááºáááºážááá¯ááºááœáẠááŒá±á¬ááºážáá²ááŒááºážáááŸááá² áááºááááá¯ááºááá·áº áá¯ááºááŒááºážá¡ááœááºáá»á¬ážáá«ááŸááááºá ááá¯á·ááŒá±á¬áá·áº áááºááẠááá¯ááºááá¯áááºááá¯ááºá á±ááẠáŠážá áœá¬ááŒá¯áá¯ááºááá«áááºá ááŸááºáááºážááœá±ááᯠááŒááºáááºážááŒáá¡á±á¬áẠplog- converterááŸáá·áº output ááẠhtml ááá¯ááºáá áºáá¯ááŒá áºáááºá
á€á¥ááá¬ááœááºá áá»áœááºá¯ááºááẠcommand ááá¯á¡áá¯á¶ážááŒá¯á á¡á á®áááºáá¶á á¬áá»á¬ážááá¯áá±ážááºááŒáá·áºáá±ážááá¯á·áááºáá¯á¶ážááŒááºáá²á·áááºá á¡á®ážáá±ážááºááá¯á áá«.
ááá¯á·ááŒá±á¬áá·áºá áá»áœááºá¯ááºááá¯á·ááẠá¡á±á¬ááºáá«ááá¯ááºááᯠáááŸááá²á·áá«áááºá .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;
ááá¯á¡áá« Travis CI ááẠáááºáá±á¬ááºááŸá¯ááᯠá¡ááá¯á¡áá»á±á¬áẠáá¯ááºáá±á¬ááºáá±ážááá·áº git repository ááá¯á· ááŒá±á¬ááºážáá²ááŸá¯áá»á¬ážááᯠááœááºážá¡á¬ážáá±ážááẠá¡áá»áááºáá»áá±á¬ááºááŒá®ááŒá áºáááºá áááºáá±á¬ááºááŸá¯á¡á á®áááºáá¶á á¬áá»á¬ážááá¯á·ááœá¬ážááẠ"ppsspp" ááá¯ááŸáááºáá«á
áááºááŸááááºáá±á¬ááºááŸá¯á ááŒá¯á¶áá¯á¶áá¯á¶ážáááºáá»ááºááᯠáá»áœááºá¯ááºááá¯á·ááŒááºááá«áááº-
áááºáá±á¬ááºááŸá¯ á¡á±á¬ááºááŒááºá
áœá¬ ááŒá®ážáá¯á¶ážáá«áá áá»áœááºá¯ááºááá¯á·ááẠstatic ááœá²ááŒááºážá
áááºááŒá¬ááŸá¯ááááºáá»á¬ážááŸáá·áºá¡áá° á¡á®ážáá±ážááºáá
áºá
á±á¬áẠáááºáá¶áááŸááá«áááºá áá¯ááºáá«áááºá á
á¬ááá¯á·áá¬á á¡á
á®áááºáá¶á
á¬ááᯠáááºáá¶áááŸáááá¯á· áá
áºáá¯áááºážáá±á¬áááºážáááºáž ááá¯ááºáá«áá°ážá áááºááá·áºá¡áá±á¬ááºá¡áááºáá±á¬áºááŸá¯áááºážáááºážááá¯áááᯠáááºááœá±ážáá»ááºááá¯ááºáá«áááºá áá«áá±ááá·áº áááºáá±á¬ááºááŸá¯ááŒá®ážááœá¬ážáá²á·á¡áá«á virtual machine ááá¯ááºááœá±ááᯠáááºáá±á¬ááºááŒáá·áºááŸá¯ááá¯á· áááŒá
áºááá¯ááºáá°ážááá¯áᬠááááááá¯á· á¡áá±ážááŒá®ážáááºá
á¡ááŸá¬ážá¡ááœááºáž
áá»áœááºá¯ááºááá¯á·ááẠá¡áááºáá²áá¯á¶ážá¡ááá¯ááºážááᯠá¡á±á¬ááºááŒááºá áœá¬ ááŒá®ážááŒá±á¬ááºáá²á·áááºá ááá¯áá»áœááºá¯ááºááá¯á·áááŒáá¯ážá á¬ážá¡á¬ážáá¯ááºááŸá¯á¡á¬ážáá¯á¶ážááẠáááºážááá¯ááá¯ááºáááºááŒá±á¬ááºáž áá±áá»á¬áá«á á±á áá±ážááºááŒáá·áº áá±á¬ááºáá¬áá±á¬ áááºááŒáááºáá±á¬ ááœá²ááŒááºážá áááºááŒá¬ááŸá¯ á¡á á®áááºáá¶á á¬á០á áááºáááºá á¬ážááœááºá¡áá»ááºá¡áá»áá¯á·ááᯠááŒáá·áºááŒáá«á áá¯á· (áá»áœááºáá±á¬áº ááœáŸááºááŒáá²á·áá±á¬ áá¬ááŸááá¯ááºáá«)á
á¡áá¹ááá¬ááºááá·áºááŒááºá¡á±á¬ááº
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 ááááá±ážáá»ááº-
á€áá¯ááºá¡ááá¯ááºážá¡á
ááẠáá¯á¶ááŒá¯á¶áá±á¬ hashing module ááœáẠáááºááŸááá±áá±á¬áºáááºážá áááºážááœáẠááŒááºážáááºáá±á¬ áá¯á¶ááŒá¯á¶áá±ážáá»áá¯á·ááœááºážáá»ááºáá«ááŸáááẠ(
; 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 :}
á
á¬áááºážááŸááœá±á·ááá¯ááºáááºá¡ááá¯ááºážá á
á¯á
ááºážáá°áááºáá±á«áºááá¯ááŸá¯ááá¯áá»á
áºáá»á°ááŸá¯áá²á·áááºá ááŸááºáá. áá«á function áá²ááŸá¬ááá¯áá²á·á¡áá»ááºááŒá±á¬áá·áºáá«á sha1 áá±á«áºááá¯ááŒá®ážáá±á¬áẠááŸááºáá ááœá²á·á
ááºážáá¯á¶ááᯠáááá¯ážáá¬ážáá±á¬á·áá°ážá ctx. ááá¯á·ááŒá±á¬áá·áºá compiler ááẠá¡áá¬áááºááœáẠá¡áá¯á¶ážáááŒá¯áá±á¬ áááá¯áááºáá¬á¡á¬áž overwrite áá¯ááºááá·áºá¡áá»áááºááᯠááŒá¯ááºážáá®ážááŒááºážá¡ááœáẠá¡ááŸááºááááºáá«á áá¯ááºáá±á¬ááºáá»ááºááᯠá¡áá¯á¶ážááŒá¯á áááºážááᯠáááºááŒááºááá¯ááºáááºá 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 ááááá±ážáá»ááº-
ááááŠážá áœá¬ á¡ááŒá¬ážáá¬áááœá²ááᯠá¡á¬áá¯á¶á áá¯ááºáá«á if. á¡ááŒá±á¡áá±á¡á¬ážáá¯á¶ážááŸáááŸáᬠáá¯ááºááᯠáá¯ááºáá±á¬ááºáá«áááºá leftvol > 0xFFFF || rightvol > 0xFFFF || leftvol < 0 || rightvol < 0 á¡áá¯á¡áá±á¬áẠááŒá áºááœá¬ážáááá·áºáááºá ááá¯á·ááŒá±á¬áá·áºá áá»áœááºá¯ááºááá¯á·ááẠá¡ááŒá¬ážáá¬áááœá²á¡ááœáẠá¡ááŸááºááŒá áºááá·áº á¡á±á¬ááºáá«áá¯ááºááŒááºáá»ááºáá»á¬ážááᯠáá»áœááºá¯ááºááá¯á·áááŸááá«áááº- 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ááŸá áºáá áá®áá±á¬á· áá«á áá»áœááºáá±á¬á·áºá¡ááœáẠáá°ážáááºážáá¯á¶ááááº... ááááºáá±á¬á· áá«á typo áá áºáá¯ááŒá áºááŒá®áž input parameters ááŸá áºáá¯áá¯á¶ážááᯠá á áºáá±ážááá¯á· á áááºáá°ážááŒá áºáá«áááºá
ááŸááºáááºáá±á¬ ááœá±ážáá»ááºááŸá¯-
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 ááŸáá·áº áá±á«ááºážá ááºážááŒááºážá¡ááŒá±á¬ááºážááŒá áºááŒá®áž ááœá²ááŒááºážá áááºááŒá¬áá°áááœá²á·á ááºážáá¯á¶ááŸá¬ áá¯ááºáá±á¬ááºáá²á·ááŒááºážáááŸááá«á
Variable á¡ááœáẠááááºážáá±áá áºáá¯ááŒáá·áº á¡á ááŒá¯áá¬ážáá±á¬áºáááºážá áááºážááᯠáá¯ááºááœáẠáá¯á¶ážáá¡áá¯á¶ážáááŒá¯áá²á á¡á±á¬áºááá±áá¬á¡á±á¬ááºááá¯á· áá»ááºáá»ááºážááœá¬ážáá«á ifáá±ážáá±á¬á áááŸááºáá±á¬ á¡ááŒá±á¡áá±ááœá±ááᯠá á áºáá±ážáá±áá¯ááºážááá¯áá±á¬á·á á¡ááœáẠáá¯áááŸáá·áº áá®áá»áŸáááºá áá±á¬ááºáááºááœá²á á áºáá±ážááŸá¯áá»á¬ážááẠá¡áááá¹áá«ááºáááŸááá±á
áá¯ááºá¡ááá¯ááºážá¡á ááá¯áá±ážáá¬ážáá°ááẠvariable ááᯠoverwrite áá¯ááºáááºáá±á·ááœá¬ážáá¯á¶ááááºá á¡ááœáẠá¡á²áá®áááá¯ááºáááºá
áááº
á€áá±áá¬ááœáẠáá»áœááºá¯ááºááá¯á·ááẠá¡ááŸá¬ážáá»á¬ážááŸáá·áº áááá¯á¶ážáá»á¯ááºááá±áááºá á€áá±á¬ááºážáá«ážááááºááœááºáá»ááºááŸá¬ Travis CI ááŸáá·áº PVS-Studio ááá¯ááºáááºážáá±á¬ááºáá¬áá»á¬ážááᯠáááºááá¯ááºááá»áŸ á
á±á·á
á±á·á
ááºá
ááºááœá²ááŒááºážá
áááºááŒá¬áááºááá¯ááºáá² ááá±á¬áá»ááºááᯠááœá²ááŒááºážá
áááºááŒá¬áááºááŒá
áºáááºá ááá¯ááŒá®ážááŒá®áž ááŸááá²á· á¡ááŸá¬ážááœá±ááᯠááá¯áá»ááºááẠáá°ááá¯á·ááᯠá¡ááŒá²áááºáž áá»á®ážáá»á°ážáá±ááá¯ááºáá«áááºá
áá±á¬ááºáá»ááº
ááá±á¬áá»ááºáá»á¬ážááᯠáááºáá±á¬ááºáááºá¡ááœáẠáááºáááºáá±á¬ááºááŸá¯áá»á¬ážááᯠá¡áá¯á¶ážááŒá¯ááŒááºážááŒáá·áº áá¯ááºááᯠáá±á«ááºážá ááºážááŒá®ážáá±á¬áẠáá»ááºáá»ááºážááá¯áááᯠááŒá¿áá¬áá»á¬ážá áœá¬ááᯠááŸá¬ááœá±ááá¯ááºáááºááŒá áºáááºá ááá¯á·áá±á¬áºá áááºáá±á¬ááºááŸá¯áá áºáá¯ááẠááá¯á¶áá±á¬ááºááá¯ááºáá«á ááá¯á·ááŒá±á¬áá·áº static analysis ááŸáá·áº á¡áá° á ááºážáááºááŸá¯ááᯠá áá áºááá·áºááœááºážááŒááºážááŒáá·áº áá¯ááºá á¡áááºá¡ááœá±ážááᯠáááááá¬áᬠááá¯ážáááºá á±áááºááŒá áºáááºá
á¡áá¯á¶ážáááºáá±á¬ááá·áºáá»á¬áž
Linux ááŸáá·áº macOS ááœáẠPVS-Studio ááá¯ááœáá·áºáá±áá«áááºá Docker ááœáẠPVS-Studio ááá¯ááœáá·áºáá±áá«áááºá Travis CI á á¬ááœááºá á¬áááºáž
á€áá±á¬ááºážáá«ážááᯠá¡ááºá¹áááááºá
áá¬ážááŒá±á¬ ááááááºááŸáá·áº áá»áŸáá±ááá¯áá«áá áá¬áá¬ááŒááºááá·áºááº- Maxim Zvyagintsev ááᯠá¡áá¯á¶ážááŒá¯áá«á
source: www.habr.com