Travis CI سافٹ ویئر بنانے اور جانچنے کے لیے ایک تقسیم شدہ ویب سروس ہے جو GitHub کو بطور سورس کوڈ ہوسٹنگ استعمال کرتی ہے۔ مندرجہ بالا آپریٹنگ منظرناموں کے علاوہ، آپ وسیع کنفیگریشن آپشنز کے لیے اپنا شکریہ بھی شامل کر سکتے ہیں۔ اس مضمون میں ہم PPSSPP کوڈ کی مثال کا استعمال کرتے ہوئے PVS-Studio کے ساتھ کام کرنے کے لیے Travis CI کو ترتیب دیں گے۔
تعارف
ٹریوس سی آئی کو ترتیب دینا
ہمیں GitHub پر ایک ذخیرہ کی ضرورت ہوگی، جہاں ہمیں جس پروجیکٹ کی ضرورت ہے وہ واقع ہے، نیز PVS-Studio کے لیے ایک کلید (آپ حاصل کر سکتے ہیں)
آئیے سائٹ پر جائیں۔
ٹیسٹ کے لیے، میں نے PPSSPP کو فورک کیا۔
ہم اس ذخیرہ کو چالو کرتے ہیں جسے ہم جمع کرنا چاہتے ہیں:
اس وقت، Travis CI ہمارا پروجیکٹ نہیں بنا سکتا کیونکہ عمارت کے لیے کوئی ہدایات نہیں ہیں۔ تو یہ ترتیب کے لئے وقت ہے.
تجزیہ کے دوران، کچھ متغیرات ہمارے لیے کارآمد ہوں گے، مثال کے طور پر، PVS-Studio کی کلید، جس کی کنفیگریشن فائل میں وضاحت کرنا ناپسندیدہ ہوگا۔ تو آئیے ٹریوس سی آئی میں تعمیراتی ترتیبات کا استعمال کرتے ہوئے ماحولیاتی متغیرات شامل کریں:
ہمیں ضرورت ہو گی:
- 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'
تمام پیکیجز جو درج ہیں صرف پی پی ایس ایس پی پی کے لیے درکار ہیں۔
اب ہم اسمبلی میٹرکس کی نشاندہی کرتے ہیں:
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
ٹریوس سی آئی آپ کو ورچوئل مشین کی زندگی کے مختلف مراحل کے لیے آپ کے اپنے کمانڈز شامل کرنے کی اجازت دیتا ہے۔ سیکشن پہلے_انسٹال کریں۔ پیکجوں کو انسٹال کرنے سے پہلے عمل میں لایا گیا۔ پھر انسٹال، جو فہرست سے پیکجوں کی تنصیب کی پیروی کرتا ہے۔ 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
پیکجوں کو انسٹال کرنے سے پہلے، ہم ذیلی ماڈلز کو اپ ڈیٹ کریں گے۔ پی پی ایس ایس پی پی بنانے کے لیے اس کی ضرورت ہے۔ آئیے پہلے فنکشن کو شامل کرتے ہیں۔ .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 ہم ماحولیاتی متغیرات کا استعمال کرتے ہوئے کمپائلرز کو انسٹال کرتے ہیں۔ پھر اگر متغیر $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
کوڈ کے اس حصے میں ہم نے ترتیب دی ہے۔ 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 ماحولیاتی متغیرات کو ترتیب دیتے وقت بالکل شروع میں بیان کیا تھا۔
دوسری سطر براہ راست تجزیہ شروع کرتی ہے۔ جھنڈا۔ -j تجزیہ کے لیے دھاگوں کی تعداد مقرر کرتا ہے، پرچم -l لائسنس، پرچم کی طرف اشارہ کرتا ہے -o آؤٹ پٹ لاگز اور پرچم کے لیے فائل کی وضاحت کرتا ہے۔ لائسنس کی میعاد ختم ہونے کی جانچ کو غیر فعال کریں۔ آزمائشی ورژن کے لیے درکار ہے، چونکہ بطور ڈیفالٹ pvs-studio-analyzer صارف کو متنبہ کرے گا کہ لائسنس کی میعاد ختم ہونے والی ہے۔ ایسا ہونے سے روکنے کے لیے، آپ اس جھنڈے کی وضاحت کر سکتے ہیں۔
لاگ فائل میں خام آؤٹ پٹ ہے جسے تبادلوں کے بغیر پڑھا نہیں جا سکتا، لہذا آپ کو پہلے فائل کو پڑھنے کے قابل بنانا چاہیے۔ آئیے نوشتہ جات سے گزرتے ہیں۔ پلگ کنورٹر، اور آؤٹ پٹ ایک 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-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 :}
جیسا کہ لسٹنگ سے دیکھا جا سکتا ہے، کمپائلر نے کال کو نظر انداز کر دیا۔ میمسیٹ. یہ اس حقیقت کی وجہ سے ہے کہ فنکشن میں Sh1 کال کے بعد میمسیٹ ساخت کا مزید حوالہ نہیں ہے۔ 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 وارننگ:
پہلے کے لیے دوسری شاخ پر توجہ دیں۔ 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. کیا آپ کو یہ عجیب نہیں لگتا کہ ہم یہ چیک کرتے ہیں کہ آیا پتہ درست ہے؟ پی ایس ایم ایف ڈیٹا، دو گنا زیادہ؟ تو یہ میرے لیے عجیب لگتا ہے... درحقیقت، یہ ایک ٹائپنگ کی غلطی ہے، اور خیال یہ تھا کہ دونوں ان پٹ پیرامیٹرز کو چیک کیا جائے۔
درست آپشن:
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، جو یقیناً دیتا ہے۔ جھوٹی حالات کی جانچ کرتے وقت، کیونکہ، جیسا کہ ہمیں یاد ہے، سائز صفر کے برابر اس کے بعد کی جانچ پڑتال بھی کوئی معنی نہیں رکھتی۔
بظاہر، کوڈ کے ٹکڑے کا مصنف متغیر کو اوور رائٹ کرنا بھول گیا۔ سائز اس سے پہلے.
بند کرو
یہ وہ جگہ ہے جہاں ہم شاید غلطیوں کے ساتھ ختم ہوں گے۔ اس مضمون کا مقصد Travis CI کے ساتھ مل کر PVS-Studio کے کام کا مظاہرہ کرنا ہے، اور اس منصوبے کا ہر ممکن حد تک مکمل تجزیہ نہیں کرنا ہے۔ اگر آپ بڑی اور خوبصورت غلطیاں چاہتے ہیں تو آپ ہمیشہ ان کی تعریف کر سکتے ہیں۔
حاصل يہ ہوا
پراجیکٹس بنانے کے لیے ویب سروسز کا استعمال انکریمنٹل اینالیسس کی مشق کے ساتھ آپ کو کوڈ کو ضم کرنے کے فوراً بعد بہت سی پریشانیوں کو تلاش کرنے کی اجازت دیتا ہے۔ تاہم، ایک تعمیر کافی نہیں ہوسکتی ہے، لہذا جامد تجزیہ کے ساتھ ٹیسٹنگ ترتیب دینے سے کوڈ کے معیار میں نمایاں بہتری آئے گی۔
کارآمد ویب سائٹس
اگر آپ انگریزی بولنے والے سامعین کے ساتھ اس مضمون کا اشتراک کرنا چاہتے ہیں، تو براہ کرم ترجمہ کا لنک استعمال کریں: Maxim Zvyagintsev۔
ماخذ: www.habr.com