ٽريس سي آءِ هڪ ورهايل ويب سروس آهي جيڪا سافٽ ويئر جي تعمير ۽ جانچ لاءِ آهي جيڪا استعمال ڪري ٿي GitHub کي ماخذ ڪوڊ هوسٽنگ جي طور تي. مٿين آپريٽنگ منظرنامي جي اضافي ۾، توھان شامل ڪري سگھو ٿا پنھنجو پنھنجو مھرباني وسيع تشڪيل جي اختيارن لاءِ. هن آرٽيڪل ۾ اسان پي ايس ايس ايس پي ڪوڊ مثال استعمال ڪندي PVS-Studio سان ڪم ڪرڻ لاءِ Travis CI ترتيب ڏينداسين.
تعارف
Travis CI قائم ڪرڻ
اسان کي GitHub تي هڪ مخزن جي ضرورت پوندي، جتي اسان کي گهربل پروجيڪٽ واقع آهي، انهي سان گڏ PVS-Studio لاءِ هڪ ڪيچي (توهان حاصل ڪري سگهو ٿا)
اچو ته سائيٽ تي وڃو
ٽيسٽ لاءِ، مون پي پي ايس ايس پي کي فورڪ ڪيو.
اسان ان مخزن کي چالو ڪيو جيڪو اسان گڏ ڪرڻ چاهيون ٿا:
هن وقت، Travis CI اسان جي منصوبي کي تعمير نٿو ڪري سگهي ڇاڪاڻ ته عمارت لاء ڪا به هدايتون نه آهن. تنهنڪري اهو ترتيب ڏيڻ جو وقت آهي.
تجزيي جي دوران، ڪجهه متغير اسان لاء ڪارائتو هوندا، مثال طور، PVS-اسٽوڊيو لاء ڪنجي، جيڪو ترتيب ڏيڻ واري فائل ۾ بيان ڪرڻ لاء ناپسنديده هوندو. تنهن ڪري اچو ته ٽريس سي آءِ ۾ تعميراتي سيٽنگون استعمال ڪندي ماحولياتي متغير شامل ڪيون:
اسان کي گهرجي:
- 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'
سڀ پيڪيجز جيڪي درج ٿيل آهن خاص طور تي پي پي ايس ايس پي پي لاءِ گهربل آهن.
ھاڻي اسان ظاھر ڪريون ٿا اسيمبلي ميٽرڪس:
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
}
ھاڻي اسان سڌو اچون ٿا پاڻمرادو لانچ قائم ڪرڻ لاءِ PVS-Studio جو Travis CI ۾. پهرين اسان کي سسٽم تي 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 اسان ماحوليات جي متغيرن کي استعمال ڪندي ڪمپلرز کي انسٽال ڪريون ٿا. پوء جيڪڏھن variable $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
ڪوڊ جي هن حصي ۾ اسان لاء مقرر ڪيو ويو آهي ڪيڪي تاليف جي حڪمن کي برآمد ڪرڻ لاء پرچم. اهو هڪ جامد ڪوڊ تجزيه ڪندڙ لاء ضروري آهي. توھان ھن بابت وڌيڪ پڙھي سگھوٿا مضمون ۾ "
جيڪڏهن اسيمبلي ڪامياب ٿي وئي ته پوء اسان حاصل ڪيو ڪاميابي کان پوءِ، جتي اسان جامد تجزيو انجام ڏيون ٿا:
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
پهرين لڪير صارف نام ۽ چيڪ مان هڪ لائسنس فائل ٺاهي ٿي جيڪا اسان شروعات ۾ بيان ڪئي آهي جڏهن ٽريس سي آءِ ماحوليات جي متغير کي ترتيب ڏيو.
ٻيو لڪير سڌو سنئون تجزيو شروع ڪري ٿو. جھنڊو -جي تجزيو لاءِ سلسلا جو تعداد مقرر ڪري ٿو، پرچم -ل اشارو لائسنس، پرچم -او ٻاھر ڪڍڻ واري لاگ لاءِ فائل کي بيان ڪري ٿو، ۽ پرچم - لائسنس جي ختم ٿيڻ جي چڪاس کي غير فعال ڪريو آزمائشي ورزن لاءِ گھربل، ڊفالٽ کان وٺي 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-اسٽوڊيو ڊيڄاريندڙ:
ڪوڊ جو هي ٽڪرو محفوظ هيشنگ ماڊل ۾ واقع آهي، جڏهن ته، ان ۾ هڪ سنگين سيڪيورٽي نقص آهي (
; Line 355
mov r8d, 20
xor edx, edx
lea rcx, QWORD PTR sum$[rsp]
call memset
; Line 356
هر شي ترتيب ۽ فنڪشن ۾ آهي يادگيري عمل ڪيو ويو آهي، اهڙي طرح رام ۾ اهم ڊيٽا کي ختم ڪري ٿو، جڏهن ته، اڃا تائين خوش نه ٿيو. اچو ته ڏسو رليز ورزن جي اسيمبلي لسٽنگ کي اصلاح سان:
; 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. ڪوڊ صرف عمل ڪيو ويندو جيڪڏهن سڀني شرطن تي leftvol > 0xFFFF || rightvol > 0xFFFF || بائیں وول <0 || حق وول <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. ڇا توهان نه ٿا سمجهو ته اهو عجيب آهي ته اسان چيڪ ڪريون ٿا ته پتو صحيح آهي؟ 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-اسٽوڊيو جي ڪم کي ٽريوس سي آءِ سان گڏ ڏيکاريو، ۽ نه ته پروجيڪٽ جو مڪمل طور تي ممڪن طور تجزيو ڪيو وڃي. جيڪڏهن توهان چاهيو ٿا ته وڏيون ۽ وڌيڪ خوبصورت غلطيون، توهان هميشه انهن جي تعريف ڪري سگهو ٿا
ٿڪل
پروجيڪٽ ٺاهڻ لاءِ ويب سروسز استعمال ڪرڻ سان گڏ واڌو تجزيي جي مشق توهان کي ڪوڊ ملائڻ کان پوءِ فوري طور تي ڪيترائي مسئلا ڳولڻ جي اجازت ڏئي ٿي. جڏهن ته، هڪ تعمير ڪافي نه ٿي سگهي ٿي، تنهنڪري جامد تجزيي سان گڏ ٽيسٽ کي ترتيب ڏيڻ سان ڪوڊ جي معيار کي بهتر بڻائي سگهندي.
ڪارآمد لنڪ
جيڪڏهن توهان هن مضمون کي انگريزي ڳالهائيندڙ سامعين سان حصيداري ڪرڻ چاهيو ٿا، مهرباني ڪري ترجمو لنڪ استعمال ڪريو: Maxim Zvyagintsev.
جو ذريعو: www.habr.com