Travis CI सफ्टवेयर निर्माण र परीक्षणको लागि एक वितरित वेब सेवा हो जसले GitHub लाई स्रोत कोड होस्टिंगको रूपमा प्रयोग गर्दछ। माथिको अपरेटिङ परिदृश्यहरूको अतिरिक्त, तपाइँ विस्तृत कन्फिगरेसन विकल्पहरूमा तपाइँको आफ्नै धन्यवाद थप्न सक्नुहुन्छ। यस लेखमा हामी PPSSPP कोड उदाहरण प्रयोग गरेर PVS-Studio सँग काम गर्न Travis CI कन्फिगर गर्नेछौं।
परिचय
Travis CI सेटअप गर्दै
हामीलाई GitHub मा एउटा भण्डार चाहिन्छ, जहाँ हामीलाई चाहिएको परियोजना अवस्थित छ, साथै PVS-स्टुडियोको लागि एउटा कुञ्जी (तपाईंले प्राप्त गर्न सक्नुहुन्छ)
साइटमा जाऔं
परीक्षणको लागि, मैले PPSSPP फोर्क गरें।
हामीले सङ्कलन गर्न चाहेको भण्डार सक्रिय गर्छौं:
यस समयमा, Travis CI ले हाम्रो परियोजना निर्माण गर्न सक्दैन किनभने निर्माणको लागि कुनै निर्देशनहरू छैनन्। त्यसैले यो कन्फिगरेसन को लागी समय हो।
विश्लेषणको क्रममा, केही चरहरू हाम्रो लागि उपयोगी हुनेछ, उदाहरणका लागि, PVS-स्टुडियोको लागि कुञ्जी, जुन कन्फिगरेसन फाइलमा निर्दिष्ट गर्न अवांछनीय हुनेछ। त्यसोभए ट्राभिस CI मा निर्माण सेटिङहरू प्रयोग गरेर वातावरण चरहरू थपौं:
हामी आवश्यक पर्नेछौं:
- PVS_USERNAME - प्रयोगकर्ता नाम
- PVS_KEY - कुञ्जी
- MAIL_USER - रिपोर्ट पठाउन प्रयोग गरिने इमेल
- MAIL_PASSWORD - इमेल पासवर्ड
अन्तिम दुई वैकल्पिक छन्। यी मेल द्वारा परिणाम पठाउन प्रयोग गरिनेछ। यदि तपाइँ अर्को तरिकामा रिपोर्ट वितरण गर्न चाहनुहुन्छ भने, तपाइँ तिनीहरूलाई संकेत गर्न आवश्यक छैन।
त्यसोभए, हामीले आवश्यक पर्ने वातावरणीय चरहरू थपेका छौं:
अब एउटा फाइल सिर्जना गरौं 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 मा, निर्माण विकल्पहरू सिर्जना गर्ने दुई तरिकाहरू छन्: पहिलो भनेको कम्पाइलरहरू, अपरेटिङ सिस्टम प्रकारहरू, वातावरणीय चरहरू, इत्यादिको सूची निर्दिष्ट गर्नु हो, त्यसपछि सबै सम्भावित संयोजनहरूको म्याट्रिक्स उत्पन्न हुन्छ; दोस्रो म्याट्रिक्सको स्पष्ट संकेत हो। अवश्य पनि, तपाइँ यी दुई दृष्टिकोणहरू संयोजन गर्न सक्नुहुन्छ र एक अद्वितीय केस थप्न सक्नुहुन्छ, वा, यसको विपरित, खण्ड प्रयोग गरेर यसलाई बहिष्कार गर्नुहोस्। बहिष्कार गर्नुहोस्। तपाईं यस बारे थप पढ्न सक्नुहुन्छ
बाँकी सबै परियोजना-विशिष्ट विधानसभा निर्देशनहरू प्रदान गर्न हो:
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 स्टोर मूल्य आवश्यक छ (हामीले यसलाई खण्डमा संकेत गरेका छौं पठाउनुहोस् निर्माण म्याट्रिक्स कन्फिगरेसनको समयमा), हामी प्याकेज स्थापना गर्छौं pvs-studio। यसका अतिरिक्त, प्याकेजहरू पनि संकेत गरिएको छ 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
कोडको यस खण्डमा हामीले सेट गरेका छौं 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-studio-विश्लेषक प्रयोगकर्तालाई चेतावनी दिनेछ कि इजाजतपत्र समाप्त हुन लागेको छ। यो हुनबाट रोक्नको लागि, तपाईंले यो झण्डा निर्दिष्ट गर्न सक्नुहुन्छ।
लग फाइलले कच्चा आउटपुट समावेश गर्दछ जुन रूपान्तरण बिना पढ्न सकिँदैन, त्यसैले तपाईंले पहिले फाइल पढ्न योग्य बनाउनु पर्छ। लगहरू पास गरौं plog-converter, र आउटपुट 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 ले स्वचालित रूपमा निर्माण चलाउनेछ। बिल्ड रिपोर्टहरूमा जान "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 :}
सूचीबाट देख्न सकिन्छ, कम्पाइलरले कललाई बेवास्ता गर्यो मेमसेट। यो समारोहमा भएको तथ्यको कारण हो shXXUMX कल पछि मेमसेट संरचनाको थप सन्दर्भ छैन 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-स्टुडियो चेतावनी:
पहिलोको लागि अर्को शाखामा ध्यान दिनुहोस् if। कोड सबै सर्तहरू भएमा मात्र कार्यान्वयन हुनेछ leftvol > 0xFFFF || rightvol > 0xFFFF || लेफ्टभोल <0 || दायाँभोल <0 झूटा साबित हुनेछ। त्यसकारण, हामीले निम्न कथनहरू पाउँछौं, जुन अर्को शाखाको लागि सही हुनेछ: लेफ्टवोल <= 0xFFFF, rightvol <= 0xFFFF, लेफ्टभोल >= ० и rightvol >= ०। पछिल्लो दुई कथनहरूलाई ध्यान दिनुहोस्। के यो कोडको यो टुक्राको कार्यान्वयनको लागि आवश्यक शर्त के हो भनेर जाँच गर्न अर्थ लाग्छ?
त्यसैले हामी सुरक्षित रूपमा यी सशर्त कथनहरू हटाउन सक्छौं:
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-स्टुडियो चेतावनी:
यो त्रुटि फोल्डर मा स्थित छ ext, त्यसैले यो परियोजनासँग सान्दर्भिक छैन, तर मैले यो याद गर्नु अघि बग फेला परेको थियो, त्यसैले मैले यसलाई छोड्ने निर्णय गरें। आखिर, यो लेख त्रुटिहरू समीक्षा गर्ने बारे होइन, तर Travis CI सँग एकीकरणको बारेमा हो, र विश्लेषकको कुनै कन्फिगरेसन गरिएको थिएन।
परिवर्तनशील आकार एक स्थिर द्वारा प्रारम्भ गरिएको छ, यद्यपि, यो कोडमा प्रयोग गरिएको छैन, ठीक तल अपरेटरमा if, जो, अवश्य पनि, दिन्छ झूटा सर्तहरू जाँच गर्दा, किनकि, हामी सम्झन्छौं, आकार शून्य बराबर। त्यसपछिको जाँचहरूले पनि कुनै अर्थ राख्दैन।
स्पष्ट रूपमा, कोड टुक्राको लेखकले चर अधिलेखन गर्न बिर्सनुभयो आकार त्यो भन्दा पहिले।
रोक्नुहोस्
यहाँ हामी सम्भवतः गल्तीहरूको साथ समाप्त हुनेछौं। यस लेखको उद्देश्य Travis CI सँग PVS-Studio को काम प्रदर्शन गर्नु हो, र परियोजनालाई सकेसम्म राम्रोसँग विश्लेषण गर्नु होइन। यदि तपाइँ ठूला र थप सुन्दर गल्तीहरू चाहनुहुन्छ भने, तपाइँ सधैं तिनीहरूलाई प्रशंसा गर्न सक्नुहुन्छ
निष्कर्षमा
बढ्दो विश्लेषणको अभ्यासको साथ परियोजनाहरू निर्माण गर्न वेब सेवाहरू प्रयोग गरेर कोड मर्ज गरेपछि तुरुन्तै धेरै समस्याहरू फेला पार्न अनुमति दिन्छ। यद्यपि, एक निर्माण पर्याप्त नहुन सक्छ, त्यसैले स्थिर विश्लेषणको साथ परीक्षण सेटअप गर्दा कोडको गुणस्तरमा उल्लेखनीय सुधार हुनेछ।
उपयोगी लिङ्कहरू
यदि तपाइँ यो लेख अंग्रेजी बोल्ने दर्शकहरूसँग साझा गर्न चाहनुहुन्छ भने, कृपया अनुवाद लिङ्क प्रयोग गर्नुहोस्: Maxim Zvyagintsev।
स्रोत: www.habr.com