Travis CI GitHubá áĽáá° ááá áŽáľ ááľá°ááá á¨áá áá áśááľáá áááááŁáľ áĽá áááá¨á á¨áá°áŤá á¨áľá á áááááľ ááᢠá¨áá á¨á°áá¨ááŠáľ á¨á á áŤá áááłáá˝ á á°á¨á᪠áá°áá á¨áááá á ááŤáŽá˝ á¨áŤáľáá ááľáá áá¨á áá˝ááᢠá áá
á˝áá ááľáĽ ᨠPPSSPP áŽáľ ááłáá á áá áá ᨠPVS-áľáąá˛áŽ áá áááľáŤáľ Travis CI á áĽááá
áŤááá˘
ááá˘áŤ
Travis CI á áááááľ áá
á¨áááááá ááŽáááľ á¨áááá áľ á GitHub áá áá¨ááť áĽá áĽáá˛áá á PVS-áľáąá˛áŽ ááá (áĽááľá ááááľ áá˝áá) áĽááááááá˘
áá° áŁá˘áŤá áĽáááľ
ááá°ááᣠ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
}
á áá á Travis CI ááľáĽ ᨠPVS-Studio á ááśáá˛á á ááá ááááááľ á ááĽáł áĽáááŁááᢠá ááááŞáŤ ᨠPVS-áľáąá˛áŽ ááŹá á áľáááą áá ááŤá á ááĽá:
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 ááá áŤá¨ááťá á á (á ááá ááľáĽ á áááá°áá appro á áááŁáł ááľáŞááľ áá á áá áľ), áĽá áá áĽáááááá pvs-áľáąá˛áŽ. á¨áá á á°á¨á᪠ááŹáá˝á áá ááá áá˘áŽ-áśáŹáľ-á¤áľá¤áľá¤á-ááá и 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
á áá
á¨áŽáľ ááá ááľáĽ á ááá
á°áá ááľá¨á á¨áá ááá áľáááá˝á áá° áá áááá áŁáá˛áŤá˘ áá
ááľáłá˛á áŽáľ á°ááłá á áľááá ááᢠáľááá
ááłá á á˝áá ááľáĽ á¨á áá ááá ἠáá˝áá á˘
áľáĽá°áŁá á¨á°áłáŤ á¨áá áá°á፠áĽáááłáá á¨áľáŹáľ_á ááá¨áááááłááľ áľááłá á ááá°áŤá áľ áŚáłáĄ-
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 á áŤáŁá˘ á°ááááŽá˝á á áááááľ ááááŞáŤ áá á¨ááá˝áá á¨á°á áá áľá áĽá ááá á¨áááľ ááá áŤáááŤáá˘
ááá°áá ááľáá áľááłááá á ááĽáł ááááŤá. áŁáá˛áŤ -á ááá°áá°á á¨ááŽá˝ áĽááľ áŤáááá, áŁáá˛áŤ -á¤á áááľ, áŁáá˛áŤ áŤááááłá -ጠááááŚá˝á ááááŁáľ áááá áĽá áŁáá˛áŤáá ááááťá -á¨LicenseExpirationChecká á á°ááá á ááŁáŞááľ ááá¨áŤ áľáŞáśá˝ áŤáľáááá pvs-áľáąá˛áŽ-á°ááłá áááą ááŤáá áááá áá°á ááá áŤáľá áá ááᢠáá áĽááłáá¨á°áľ ááá¨áá¨á áá áá áŁáá˛áŤ áááá˝ áá˝ááá˘
á¨áááἠááľáłááťá áłáááἠá¨áááá ἠáĽáŹ áá ááľ áľááá ááááŞáŤ áááá á¨ááá ἠááľá¨á á ááŚáľá˘ ááááŚá˝á áĽááłáá ááá-ááá¨áŞáŤáŁ áĽá áá¤áą á¨á¤á˝á˛á¤áá¤á ááá ááá˘
á áá ááłá, áľáááá á°á á á áŞáááśá˝á á ááľáł áááá áá°áአááá.
á áá¤áąá, á¨áá¨á°ááá ááá á ááá°áá .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 áááŁáłáá á áŤáľ-á°á áŤáŤááłá. áá° á¨áááŁáł áŞáááśá˝ ááááľ ÂŤ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-áľáąá˛áŽ ááľá ááááŤáĄ-
áá
á¨áŽáľ ááŤá á°á
áááą á á°á á áá áá˝ ááá ááľáĽ ááááᣠááá ááᣠá¨áá°á á¨á°á
áááľ ááľááľ ááá (
; 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 á¨áĽáŞá á áá ááľáłááť áľá ááá
á ááá á°á¨á᪠ááŁááť á¨áá á˛á˛ááľ. áľááá
, á áááŁáŞá ááá°ááą áĽá
á áá áŤááá áá
á°á¨ áľááľáłá á áá°áŤáľ á¨áá°áąá áá ááŁá¨á ááá áááł á ááá¨áá. á°ááŁáŠá á áá áá áá
áá ááľá°áŤá¨á áá˝ááᢠ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-áľáąá˛áŽ ááľá ááááŤáĄ-
áááááŞáŤá áááá á áááŤá áľáŠá¨áľ ááľáĄ if. áŽáą á¨ááá¸áá ááá áááłáá˝ á˛áአáĽáť ááᢠááŤáŽá > 0xFFFF || rightvol> 0xFFFF || ááŤáŽá <0 || áááŽá <0 áá°áľ ááááᢠáľááá ᣠá¨áá¨á°ááá ááá፠áĽáááááᣠáá á áááá á áááŤá áĽáááľ ááááᥠááŤáŽá <= 0xFFFF, rightvol <= 0xFFFF, ááŤáŽá >= 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-áľáąá˛áŽ ááľá ááááŤáĄ-
áá áľá á°áľ á á ááá ááľáĽ ááááᢠáľ, áľááá á¨ááŽáááą áá á áľááá á áá°ááá°á, ááá áá áľá á°áą á¨ááłá¨á´ á ááľ á°áááˇá, áľááá áĽáąá ááá°á áá°ááŠ. á¨ááá á áá, áá á˝áá áľá á°áśá˝á áááááá á áá°áá, ááá áá ᨠTravis CI áá áľáááááľ áá, áĽá á¨áá°áá°á áá á á áá°á°áŤá.
á°áááá áá á áá á°áááŻá, ááá áá á áŽáą ááľáĽ áĽáľá¨ áŚááŹá°áŠ áľá¨áľ áá á áá áĽá á áá á áááá if, áĽáąá, á áĽáááĽ, áá°áŁá á¨áá°áľ áááłáá˝á á áááľášá áľ áá, ááááŤáąá áĽáá°áááľáłáá°á, áá á¨áᎠáá áĽáŠá ááᢠááŁá áźáŽá˝á ááá áľááá á¨áá¸áá.
á ááá˝ ááá¨áľ áĽáá°ááťáá, á¨áŽáľ áááĽáŤá á°áŤá˛á á°áááááá áĽáá°áá ááá á¨áľáˇá áá á¨á፠á ááľ.
á°á
á áľá
á°áśáš á¨ááá¨áá°á áĽáá
áá ááᢠá¨áá
á˝áá ááá ᨠPVS-áľáąá˛áŽá áĽáŤ ᨠTravis CI áá áááłá¨áľ áá, áĽá ááŽáááąá á á°áťá áá á á áĽáááľ ááá°áá°á á áá°áá. áľááá
áĽá á¨ááŤáአáľá
á°áśá˝á á¨ááá áá áá ááľáá
áá˝ááá˘
áá°áá°ááŤ
á¨áľá¨-áá˝ á áááááśá˝á á áá áá ááŽáááśá˝á áááááŁáľ á¨á°á¨á᪠áľáá°á ááááľ áá áŽáľ á¨á°áááą á áá áá˛áŤáá áĽá á˝ááŽá˝á áĽáá˛áŤáá áŤáľá˝áááłáᢠááá á ááľ áááŁáł á á áááá áá˝ááᣠáľááá áá¨áŤá á¨áľáłá˛á áľááłá áá áááá á¨áŽáąá áĽáŤáľ á áĽá á áŤáťá˝ááá˘
á áá á áááá˝
á ááááľ áĽá áááŚá¤áľ áá PVS-Studioá á ááľááá áá á áśá¨á ááľáĽ PVS-áľáąá˛áŽá á ááľááá áá Travis CI á°ááľ
áá
á á˝áá ááĽááááá á°áá᪠áłáłááá˝ áááŤáľ á¨ááá áĽáŁááá á¨áľááá ááááá áá ááᥠMaxim Zvyagintsevá˘
ááá: hab.com