เชเซเชฐเซเชตเชฟเชธ CI เช เชธเซเชซเซเชเชตเซเชฐเชจเชพ เชจเชฟเชฐเซเชฎเชพเชฃ เช
เชจเซ เชชเชฐเซเชเซเชทเชฃ เชฎเชพเชเซ เชตเชฟเชคเชฐเชฟเชค เชตเซเชฌ เชธเซเชตเชพ เชเซ เชเซ เชธเซเชฐเซเชธ เชเซเชก เชนเซเชธเซเชเชฟเชเช เชคเชฐเซเชเซ GitHub เชจเซ เชเชชเชฏเซเช เชเชฐเซ เชเซ. เชเชชเชฐเซเชเซเชค เชเชชเชฐเซเชเชฟเชเช เชฆเซเชถเซเชฏเซ เชเชชเชฐเชพเชเชค, เชคเชฎเซ เชตเชฟเชธเซเชคเซเชค เชฐเซเชชเชฐเซเชเชพเชเชเชจ เชตเชฟเชเชฒเซเชชเซ เชฎเชพเชเซ เชคเชฎเชพเชฐเซ เชชเซเชคเชพเชจเซ เชเชญเชพเชฐ เชเชฎเซเชฐเซ เชถเชเซ เชเซ. เช เชฒเซเชเชฎเชพเช เชเชชเชฃเซ PPSSPP เชเซเชก เชเชฆเชพเชนเชฐเชฃเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ PVS-Studio เชธเชพเชฅเซ เชเชพเชฎ เชเชฐเชตเชพ Travis CI เชจเซ เชเซเช เชตเซเชถเซเช.
เชชเชฐเชฟเชเชฏ
เชเซเชฐเซเชตเชฟเชธ CI เชธเซเชฏเซเชเชฟเชค เชเชฐเซ เชฐเชนเซเชฏเชพ เชเซเช
เช
เชฎเชจเซ GitHub เชชเชฐ เชเช เชฐเชฟเชชเซเชเซเชเชฐเซเชจเซ เชเชฐเซเชฐ เชชเชกเชถเซ, เชเซเชฏเชพเช เช
เชฎเชจเซ เชเซเชเชคเซ เชชเซเชฐเซเชเซเชเซเช เชธเซเชฅเชฟเชค เชเซ, เชคเซเชฎเช PVS-Studio เชฎเชพเชเซ เชเซ (เชคเชฎเซ เชฎเซเชณเชตเซ เชถเชเซ เชเซ)
เชเชพเชฒเซ เชธเชพเชเช เชชเชฐ เชเชเช
เชชเชฐเซเชเซเชทเชฃ เชฎเชพเชเซ, เชฎเซเช PPSSPP เชซเซเชฐเซเช เชเชฐเซเชฏเซเช.
เช เชฎเซ เชฐเซเชชเซเชเซเชเชฐเซเชจเซ เชธเชเซเชฐเชฟเชฏ เชเชฐเซเช เชเซเช เชเซ เช เชฎเซ เชเชเชคเซเชฐเชฟเชค เชเชฐเชตเชพ เชฎเชพเชเชเซเช เชเซเช:
เช เชเซเชทเชฃเซ, Travis CI เช
เชฎเชพเชฐเชพ เชชเซเชฐเซเชเซเชเซเชเชจเซเช เชจเชฟเชฐเซเชฎเชพเชฃ เชเชฐเซ เชถเชเชคเซเช เชจเชฅเซ เชเชพเชฐเชฃ เชเซ เชฌเชฟเชฒเซเชกเชฟเชเช เชฎเชพเชเซ เชเซเช เชธเซเชเชจเชพเช เชจเชฅเซ. เชคเซเชฅเซ เชคเซ เชฐเซเชชเชฐเซเชเชพเชเชเชจ เชฎเชพเชเซ เชธเชฎเชฏ เชเซ.
เชตเชฟเชถเซเชฒเซเชทเชฃ เชฆเชฐเชฎเชฟเชฏเชพเชจ, เชเซเชเชฒเชพเช เชเชฒเซ เช เชฎเชพเชฐเชพ เชฎเชพเชเซ เชเชชเชฏเซเชเซ เชฅเชถเซ, เชเชฆเชพเชนเชฐเชฃ เชคเชฐเซเชเซ, PVS-Studio เชฎเชพเชเซเชจเซ เชเซ, เชเซ เชฐเซเชชเชฐเซเชเชพเชเชเชจ เชซเชพเชเชฒเชฎเชพเช เชธเซเชชเชทเซเช เชเชฐเชตเชพ เชฎเชพเชเซ เช เชจเชฟเชเซเชเชจเซเชฏ เชนเชถเซ. เชคเซ เชเชพเชฒเซ เชเซเชฐเซเชตเชฟเชธ CI เชฎเชพเช เชฌเชฟเชฒเซเชก เชธเซเชเชฟเชเชเซเชธเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชชเชฐเซเชฏเชพเชตเชฐเชฃ เชเชฒ เชเชฎเซเชฐเซเช:
เช
เชฎเชจเซ เชเชฐเซเชฐ เชชเชกเชถเซ:
- PVS_USERNAME - เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพ เชจเชพเชฎ
- PVS_KEY - เชเซ
- MAIL_USER - เชเชฎเซเชเชฒ เชเซเชจเซ เชเชชเชฏเซเช เชฐเชฟเชชเซเชฐเซเช เชฎเซเชเชฒเชตเชพ เชฎเชพเชเซ เชเชฐเชตเชพเชฎเชพเช เชเชตเชถเซ
- MAIL_PASSWORD - เชเชฎเซเชเชฒ เชชเชพเชธเชตเชฐเซเชก
เชเซเชฒเซเชฒเชพ เชฌเซ เชตเซเชเชฒเซเชชเชฟเช เชเซ. เชเชจเซ เชเชชเชฏเซเช เชฎเซเชเชฒ เชฆเซเชตเชพเชฐเชพ เชชเชฐเชฟเชฃเชพเชฎเซ เชฎเซเชเชฒเชตเชพ เชฎเชพเชเซ เชเชฐเชตเชพเชฎเชพเช เชเชตเชถเซ. เชเซ เชคเชฎเซ เชฐเชฟเชชเซเชฐเซเชเชจเซ เชฌเซเชเซ เชฐเซเชคเซ เชตเชฟเชคเชฐเชฟเชค เชเชฐเชตเชพ เชฎเชพเชเชเชคเชพ เชนเซ, เชคเซ เชคเชฎเชพเชฐเซ เชคเซเชฎเชจเซ เชธเซเชเชตเชตเชพเชจเซ เชเชฐเซเชฐ เชจเชฅเซ.
เชคเซเชฅเซ, เช เชฎเซ เชเชฐเซเชฐเซ เชชเชฐเซเชฏเชพเชตเชฐเชฃ เชเชฒเซ เชเชฎเซเชฐเซเชฏเชพ เชเซ:
เชนเชตเซ เชเช เชซเชพเชเชฒ เชฌเชจเชพเชตเซเช .travis.yml เช
เชจเซ เชคเซเชจเซ เชชเซเชฐเซเชเซเชเซเชเชจเชพ เชฎเซเชณเชฎเชพเช เชฎเซเชเซ. PPSSPP เชชเชพเชธเซ เชชเชนเซเชฒเชพเชฅเซ เช เชเซเชฐเซเชตเชฟเชธ 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
เชตเชฟเชญเชพเช เชตเชฟเชถเซ เชฅเซเชกเซเช เชตเชงเชพเชฐเซ เชฎเซเชเซเชฐเชฟเชเซเชธ. เชเซเชฐเซเชตเชฟเชธ 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
เชเซเชฐเซเชตเชฟเชธ เชธเซเชเช เชคเชฎเชจเซ เชตเชฐเซเชเซเชฏเซเช
เชฒ เชฎเชถเซเชจเชจเชพ เชเซเชตเชจเชจเชพ เชตเชฟเชตเชฟเชง เชคเชฌเชเซเชเชพเช เชฎเชพเชเซ เชคเชฎเชพเชฐเชพ เชชเซเชคเชพเชจเชพ เชเชฆเซเชถเซ เชเชฎเซเชฐเชตเชพเชจเซ เชฎเชเชเซเชฐเซ เชเชชเซ เชเซ. เชตเชฟเชญเชพเช เชชเชนเซเชฒเชพเช_เชเชจเซเชธเซเชเซเชฒ เชเชฐเซ เชชเซเชเซเชเซ เชธเซเชฅเชพเชชเชฟเชค เชเชฐเชคเชพ เชชเชนเซเชฒเชพ เชเชฒเชพเชตเชตเชพเชฎเชพเช เชเชตเซ เชเซ. เชชเชเซ เชเชจเซเชธเซเชเซเชฒ เชเชฐเซ, เชเซ เชฏเชพเชฆเซเชฎเชพเชเชฅเซ เชชเซเชเซเชเซเชจเซ เชธเซเชฅเชพเชชเชจเชพเชจเซ เช
เชจเซเชธเชฐเซ เชเซ 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
}
เชนเชตเซ เช เชฎเซ เชเซเชฐเซเชตเชฟเชธ CI เชฎเชพเช PVS-เชธเซเชเซเชกเชฟเชฏเซเชจเชพ เชธเซเชตเชเชพเชฒเชฟเชค เชฒเซเชเชเชจเซ เชธเซเช เชเชฐเชตเชพ เชธเซเชงเชพ เชเชตเซเช เชเซเช. เชชเซเชฐเชฅเชฎ เชเชชเชฃเซ เชธเชฟเชธเซเชเชฎ เชชเชฐ 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 เชธเซเชเซเชฐ เชฎเซเชฒเซเชฏ เชนเชพ (เช เชฎเซ เชคเซเชจเซ เชตเชฟเชญเชพเชเชฎเชพเช เชธเซเชเชตเซเชฏเซเช เชเซ เชเชถเชฐเซ เชฌเชฟเชฒเซเชก เชฎเซเชเซเชฐเชฟเชเซเชธ เชฐเซเชชเชฐเซเชเชพเชเชเชจ เชฆเชฐเชฎเชฟเชฏเชพเชจ), เช เชฎเซ เชชเซเชเซเช เชเชจเซเชธเซเชเซเชฒ เชเชฐเซเช เชเซเช 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
เชชเซเชฐเชฅเชฎ เชฒเซเชเซ เชฏเซเชเชฐเชจเชพเชฎ เช เชจเซ เชเซเชฎเชพเชเชฅเซ เชฒเชพเชฏเชธเชจเซเชธ เชซเชพเชเชฒ เชเชจเชฐเซเช เชเชฐเซ เชเซ เชเซ เช เชฎเซ เชเซเชฐเซเชตเชฟเชธ CI เชเชจเซเชตเชพเชฏเชฐเชฎเซเชจเซเช เชตเซเชฐเซเชเชฌเชฒ เชธเซเช เชเชฐเชคเซ เชตเชเชคเซ เชถเชฐเซเชเชคเชฎเชพเช เช เชเชฒเซเชฒเซเชเชฟเชค เชเชฐเซ เชเซ.
เชฌเซเชเซ เชฒเชพเชเชจ เชธเซเชงเซเช เชตเชฟเชถเซเชฒเซเชทเชฃ เชถเชฐเซ เชเชฐเซ เชเซ. เชงเซเชตเช -เชเซ เชตเชฟเชถเซเชฒเซเชทเชฃ, เชงเซเชตเช เชฎเชพเชเซ เชฅเซเชฐเซเชกเซเชจเซ เชธเชเชเซเชฏเชพ เชธเซเชฏเซเชเชฟเชค เชเชฐเซ เชเซ -l เชฒเชพเชเชธเชจเซเชธ, เชงเซเชตเช เชธเซเชเชตเซ เชเซ -เช เชเชเชเชชเซเช เชฒเซเช เช เชจเซ เชงเซเชตเช เชฎเชพเชเซ เชซเชพเชเชฒเชจเซ เชตเซเชฏเชพเชเซเชฏเชพเชฏเชฟเชค เชเชฐเซ เชเซ -เชฒเชพเชเชธเชจเซเชธ เชธเชฎเชพเชชเซเชคเชฟ เชคเชชเชพเชธเชจเซ เช เชเซเชทเชฎ เชเชฐเซ เชเซเชฐเชพเชฏเชฒ เชตเชฐเซเชเชจ เชฎเชพเชเซ เชเชฐเซเชฐเซ เชเซ, เชเชพเชฐเชฃ เชเซ เชกเชฟเชซเซเชฒเซเช เชฐเซเชชเซ pvs-เชธเซเชเซเชกเชฟเชฏเซ-เชตเชฟเชถเซเชฒเซเชทเช เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพเชจเซ เชเซเชคเชตเชฃเซ เชเชชเชถเซ เชเซ เชฒเชพเชเชธเชจเซเชธ เชธเชฎเชพเชชเซเชค เชฅเชตเชพเชฎเชพเช เชเซ. เชเชจเซ เชฅเชคเซเช เช เชเชเชพเชตเชตเชพ เชฎเชพเชเซ, เชคเชฎเซ เช เชงเซเชตเชเชจเซ เชเชฒเซเชฒเซเช เชเชฐเซ เชถเชเซ เชเซ.
เชฒเซเช เชซเชพเชเชฒเชฎเชพเช เชเชพเชเซเช เชเชเชเชชเซเช เชเซ เชเซ เชฐเซเชชเชพเชเชคเชฐ เชตเชฟเชจเชพ เชตเชพเชเชเซ เชถเชเชพเชคเซเช เชจเชฅเซ, เชคเซเชฅเซ เชคเชฎเชพเชฐเซ เชชเชนเซเชฒเชพ เชซเชพเชเชฒเชจเซ เชตเชพเชเชเซ เชถเชเชพเชฏ เชคเซเชตเซ เชฌเชจเชพเชตเชตเซ เชชเชกเชถเซ. เชเชพเชฒเซ เชฒเซเช เชชเชธเชพเชฐ เชเชฐเซเช เชชเซเชฒเซเช-เชเชจเซเชตเชฐเซเชเชฐ, เช เชจเซ เชเชเชเชชเซเช เช 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;
เชนเชตเซ เชเชฟเช เชฐเชฟเชชเซเชเซเชเชฐเซเชฎเชพเช เชซเซเชฐเชซเชพเชฐเซเชจเซ เชฆเชฌเชพเชฃ เชเชฐเชตเชพเชจเซ เชธเชฎเชฏ เชเซ, เชเซ เชชเชเซ เชเซเชฐเซเชตเชฟเชธ เชธเซเชเช เชเชชเซเชเชช เชฌเชฟเชฒเซเชกเชจเซ เชเชฒเชพเชตเชถเซ. เชฌเชฟเชฒเซเชก เชฐเชฟเชชเซเชฐเซเชเซเชธ เชชเชฐ เชเชตเชพ เชฎเชพเชเซ "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 :}
เชธเซเชเชฟเชฎเชพเชเชฅเซ เชเซเช เชถเชเชพเชฏ เชเซ เชคเซเชฎ, เชเชฎเซเชชเชพเชเชฒเชฐเซ เชเซเชฒเชจเซ เช
เชตเชเชฃเซเชฏเซ เชฎเซเชฎเชธเซเช. เช เช เชนเชเซเชเชคเชจเซ เชเชพเชฐเชฃเซ เชเซ เชเซ เชเชพเชฐเซเชฏเชฎเชพเช เชถเซ
เชเซเชธเชฎเซ
เชเซเชธ เชเซเชฒ เชชเชเซ เชฎเซเชฎเชธเซเช เชฌเชเชงเชพเชฐเชฃ เชฎเชพเชเซ เชตเชงเซ เชธเชเชฆเชฐเซเชญ เชจเชฅเซ เชธเซเชเซเชเชเซเชธ. เชคเซเชฅเซ, เชเชฎเซเชชเชพเชเชฒเชฐ เชญเชตเชฟเชทเซเชฏเชฎเชพเช เชเชชเชฏเซเชเชฎเชพเช เชจ เชฒเซเชตเชพเชคเซ เชฎเซเชฎเชฐเซเชจเซ เชเชตเชฐเชฐเชพเชเช เชเชฐเชตเชพเชฎเชพเช เชชเซเชฐเซเชธเซเชธเชฐเชจเซ เชธเชฎเชฏ เชฌเชเชพเชกเชตเชพเชจเซ เชเซเช เช
เชฐเซเชฅ เชเซเชคเซ เชจเชฅเซ. เชคเชฎเซ เชซเชเชเซเชถเชจเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชเชจเซ เช เซเช เชเชฐเซ เชถเชเซ เชเซ 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. เชถเซเช เชคเชฎเชจเซ เชจเชฅเซ เชฒเชพเชเชคเซเช เชเซ เชธเชฐเชจเชพเชฎเซเช เชฎเชพเชจเซเชฏ เชเซ เชเซ เชเซเชฎ เชคเซ เช เชฎเซ เชคเชชเชพเชธเซเช เชคเซ เชตเชฟเชเชฟเชคเซเชฐ เชเซ? psmfเชกเซเชเชพ, เชฌเชฎเชฃเซเช เชเซเชเชฒเซเช? เชคเซ เช เชฎเชจเซ เชตเชฟเชเชฟเชคเซเชฐ เชฒเชพเชเซ เชเซ... เชนเชเซเชเชคเชฎเชพเช, เช, เช เชฒเชฌเชคเซเชค, เชเช เชเชพเชเชชเซ เชเซ, เช เชจเซ เชตเชฟเชเชพเชฐ เชฌเชเชจเซ เชเชจเชชเซเช เชชเชฐเชฟเชฎเชพเชฃเซเชจเซ เชคเชชเชพเชธเชตเชพเชจเซ เชนเชคเซ.
เชธเชพเชเซ เชตเชฟเชเชฒเซเชช:
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-เชธเซเชเซเชกเชฟเชฏเซ เชเซเชคเชตเชฃเซ:
เช เชญเซเชฒ เชซเซเชฒเซเชกเชฐเชฎเชพเช เชธเซเชฅเชฟเชค เชเซ เชเชเซเชธ, เชคเซเชฅเซ เชชเซเชฐเซเชเซเชเซเช เชธเชพเชฅเซ เชเชฐเซเชเชฐ เชธเชเชฌเชเชงเชฟเชค เชจเชฅเซ, เชชเชฐเชเชคเซ เชฌเช เชฎเชพเชฐเชพ เชงเซเชฏเชพเชจเชฎเชพเช เชเชตเซ เชคเซ เชชเชนเซเชฒเชพเช เช เชฎเชณเซ เชเชตเซเชฏเซ เชนเชคเซ, เชคเซเชฅเซ เชฎเซเช เชคเซเชจเซ เชเซเชกเชตเชพเชจเซเช เชจเชเซเชเซ เชเชฐเซเชฏเซเช. เชเซเชตเชเซ, เช เชฒเซเช เชญเซเชฒเซเชจเซ เชธเชฎเซเชเซเชทเชพ เชเชฐเชตเชพ เชตเชฟเชถเซ เชจเชฅเซ, เชชเชฐเชเชคเซ เชเซเชฐเซเชตเชฟเชธ เชธเซเชเช เชธเชพเชฅเซ เชเชเซเชเชฐเชฃ เชตเชฟเชถเซ เชเซ, เช เชจเซ เชตเชฟเชถเซเชฒเซเชทเชเชจเซเช เชเซเช เชเซเช เชตเชฃเซ เชนเชพเชฅ เชงเชฐเชตเชพเชฎเชพเช เชเชตเซ เชจเชฅเซ.
เชเชฒ เชเชฆ เชเช เชธเซเชฅเชฟเชฐเชพเชเช เชฆเซเชตเชพเชฐเชพ เชชเซเชฐเชพเชฐเชเชญ เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ, เชเซ เชเซ, เชคเซเชจเซ เชเชชเชฏเซเช เชเซเชกเชฎเชพเช เช เชฅเชคเซ เชจเชฅเซ, เชธเซเชงเชพ เชเชชเชฐเซเชเชฐ เชธเซเชงเซ if, เชเซ, เช เชฒเชฌเชคเซเชค, เชเชชเซ เชเซ เชเซเชเซเช เชถเชฐเชคเซ เชคเชชเชพเชธเชคเซ เชตเชเชคเซ, เชเชพเชฐเชฃ เชเซ, เชเซเชฎ เชเชชเชฃเซ เชฏเชพเชฆ เชฐเชพเชเซเช เชเซเช, เชเชฆ เชถเซเชจเซเชฏ เชฌเชฐเชพเชฌเชฐ. เช เชจเซเชเชพเชฎเซ เชคเชชเชพเชธเชจเซ เชชเชฃ เชเซเช เช เชฐเซเชฅ เชจเชฅเซ.
เชฆเซเชเซเชคเซ เชฐเซเชคเซ, เชเซเชก เชซเซเชฐเซเชเชฎเซเชจเซเชเชจเชพ เชฒเซเชเช เชตเซเชฐเซเชเชฌเชฒ เชชเชฐ เชซเชฐเซเชฅเซ เชฒเชเชตเชพเชจเซเช เชญเซเชฒเซ เชเชฏเชพ เชเชฆ เชคเซ เชชเชนเซเชฒเชพเช.
เชฌเชเชง
เช เชคเซ เชเซ เชเซเชฏเชพเช เชเชชเชฃเซ เชเชฆเชพเช เชญเซเชฒเซ เชธเชพเชฅเซ เชธเชฎเชพเชชเซเชค เชฅเชเชถเซเช. เช เชฒเซเชเชจเซ เชนเซเชคเซ เชเซเชฐเซเชตเชฟเชธ เชธเซเชเช เชธเชพเชฅเซ เชฎเชณเซเชจเซ PVS-เชธเซเชเซเชกเชฟเชฏเซเชจเชพ เชเชพเชฐเซเชฏเชจเซ เชฆเชฐเซเชถเชพเชตเชตเชพเชจเซ เชเซ, เช
เชจเซ เชถเชเซเชฏ เชคเซเชเชฒเซเช เชธเชเชชเซเชฐเซเชฃ เชฐเซเชคเซ เชชเซเชฐเซเชเซเชเซเชเชจเซเช เชตเชฟเชถเซเชฒเซเชทเชฃ เชเชฐเชตเชพเชจเซ เชจเชฅเซ. เชเซ เชคเชฎเชจเซ เชฎเซเชเซ เช
เชจเซ เชตเชงเซ เชธเซเชเชฆเชฐ เชญเซเชฒเซ เชเซเชเช เชเซ, เชคเซ เชคเชฎเซ เชนเชเชฎเซเชถเชพ เชคเซเชฎเชจเซ เชชเซเชฐเชถเชเชธเชพ เชเชฐเซ เชถเชเซ เชเซ
เชจเชฟเชทเซเชเชฐเซเชท
เชเชจเซเชเซเชฐเซเชฎเซเชจเซเชเชฒ เชเชจเชพเชฒเชฟเชธเชฟเชธเชจเซ เชชเซเชฐเซเชเซเชเชฟเชธ เชธเชพเชฅเซ เชชเซเชฐเซเชเซเชเซเชเซเชธ เชฌเชจเชพเชตเชตเชพ เชฎเชพเชเซ เชตเซเชฌ เชธเซเชตเชพเชเชจเซ เชเชชเชฏเซเช เชเชฐเชตเชพเชฅเซ เชเซเชก เชฎเชฐเซเช เชเชฐเซเชฏเชพ เชชเชเซ เชคเชฐเชค เช เชเชฃเซ เชธเชฎเชธเซเชฏเชพเช เชถเซเชงเซ เชถเชเชพเชฏ เชเซ. เชเซ เชเซ, เชเช เชฌเชฟเชฒเซเชก เชชเซเชฐเชคเซเช เชจ เชนเซเช เชถเชเซ, เชคเซเชฅเซ เชธเซเชเซเชเชฟเช เชเชจเชพเชฒเชฟเชธเชฟเชธ เชธเชพเชฅเซ เชเซเชธเซเชเชฟเชเช เชธเซเชเช เชช เชเชฐเชตเชพเชฅเซ เชเซเชกเชจเซ เชเซเชฃเชตเชคเซเชคเชพเชฎเชพเช เชจเซเชเชงเชชเชพเชคเซเชฐ เชธเซเชงเชพเชฐเซ เชฅเชถเซ.
เชเชชเชฏเซเชเซ เชฒเชฟเชเชเซเชธ
Linux เช เชจเซ macOS เชชเชฐ PVS-Studio เชฒเซเชจเซเช เชเชฐเซ เชฐเชนเซเชฏเชพเช เชเซเช เชกเซเชเชฐเชฎเชพเช PVS-เชธเซเชเซเชกเชฟเชฏเซ เชถเชฐเซ เชเชฐเซ เชฐเชนเซเชฏเชพเช เชเซเช เชเซเชฐเซเชตเชฟเชธ CI เชฆเชธเซเชคเชพเชตเซเชเซเชเชฐเชฃ
เชเซ เชคเชฎเซ เช เชฒเซเชเชจเซ เช
เชเชเซเชฐเซเชเซ เชฌเซเชฒเชคเชพ เชชเซเชฐเซเชเซเชทเชเซ เชธเชพเชฅเซ เชถเซเชฐ เชเชฐเชตเชพ เชฎเชพเชเชเชคเชพ เชนเซ, เชคเซ เชเซเชชเชพ เชเชฐเซเชจเซ เช
เชจเซเชตเชพเชฆ เชฒเชฟเชเชเชจเซ เชเชชเชฏเซเช เชเชฐเซ: เชฎเซเชเซเชธเชฟเชฎ เชเซเชตเซเชฏเชพเชเชฟเชเชเชธเซเชต.
เชธเซเชฐเซเชธ: www.habr.com