مثال کے طور پر PSP ایمولیٹر کا استعمال کرتے ہوئے Travis CI میں PVS-Studio کیسے ترتیب دیا جائے۔

مثال کے طور پر PSP ایمولیٹر کا استعمال کرتے ہوئے Travis CI میں PVS-Studio کیسے ترتیب دیا جائے۔
Travis CI سافٹ ویئر بنانے اور جانچنے کے لیے ایک تقسیم شدہ ویب سروس ہے جو GitHub کو بطور سورس کوڈ ہوسٹنگ استعمال کرتی ہے۔ مندرجہ بالا آپریٹنگ منظرناموں کے علاوہ، آپ وسیع کنفیگریشن آپشنز کے لیے اپنا شکریہ بھی شامل کر سکتے ہیں۔ اس مضمون میں ہم PPSSPP کوڈ کی مثال کا استعمال کرتے ہوئے PVS-Studio کے ساتھ کام کرنے کے لیے Travis CI کو ترتیب دیں گے۔

تعارف

ٹریوس سی آئی سافٹ ویئر بنانے اور جانچنے کے لیے ایک ویب سروس ہے۔ یہ عام طور پر مسلسل انضمام کے طریقوں کے ساتھ مل کر استعمال کیا جاتا ہے.

PPSSPP - پی ایس پی گیم کنسول ایمولیٹر۔ یہ پروگرام سونی پی ایس پی کے لیے بنائے گئے ڈسک امیجز سے کسی بھی گیم کے آغاز کی تقلید کرنے کے قابل ہے۔ یہ پروگرام یکم نومبر 1 کو جاری کیا گیا تھا۔ PPSSPP GPL v2012 کے تحت لائسنس یافتہ ہے۔ کوئی بھی بہتری لا سکتا ہے۔ پروجیکٹ سورس کوڈ.

PVS- اسٹوڈیو - پروگرام کوڈ میں غلطیوں اور ممکنہ کمزوریوں کی تلاش کے لیے ایک جامد کوڈ تجزیہ کار۔ اس مضمون میں، تبدیلی کے لیے، ہم PVS-Studio کو مقامی طور پر ڈویلپر کی مشین پر نہیں، بلکہ کلاؤڈ میں لانچ کریں گے، اور PPSSPP میں خرابیوں کو تلاش کریں گے۔

ٹریوس سی آئی کو ترتیب دینا

ہمیں GitHub پر ایک ذخیرہ کی ضرورت ہوگی، جہاں ہمیں جس پروجیکٹ کی ضرورت ہے وہ واقع ہے، نیز PVS-Studio کے لیے ایک کلید (آپ حاصل کر سکتے ہیں) آزمائشی کلید یا اوپن سورس پروجیکٹس کے لیے مفت).

آئیے سائٹ پر جائیں۔ ٹریوس سی آئی. آپ کے GitHub اکاؤنٹ کو استعمال کرنے کی اجازت کے بعد، ہم ذخیروں کی فہرست دیکھیں گے:

مثال کے طور پر PSP ایمولیٹر کا استعمال کرتے ہوئے Travis CI میں PVS-Studio کیسے ترتیب دیا جائے۔
ٹیسٹ کے لیے، میں نے PPSSPP کو فورک کیا۔

ہم اس ذخیرہ کو چالو کرتے ہیں جسے ہم جمع کرنا چاہتے ہیں:

مثال کے طور پر PSP ایمولیٹر کا استعمال کرتے ہوئے Travis CI میں PVS-Studio کیسے ترتیب دیا جائے۔
اس وقت، Travis CI ہمارا پروجیکٹ نہیں بنا سکتا کیونکہ عمارت کے لیے کوئی ہدایات نہیں ہیں۔ تو یہ ترتیب کے لئے وقت ہے.

تجزیہ کے دوران، کچھ متغیرات ہمارے لیے کارآمد ہوں گے، مثال کے طور پر، PVS-Studio کی کلید، جس کی کنفیگریشن فائل میں وضاحت کرنا ناپسندیدہ ہوگا۔ تو آئیے ٹریوس سی آئی میں تعمیراتی ترتیبات کا استعمال کرتے ہوئے ماحولیاتی متغیرات شامل کریں:

مثال کے طور پر PSP ایمولیٹر کا استعمال کرتے ہوئے Travis CI میں PVS-Studio کیسے ترتیب دیا جائے۔
ہمیں ضرورت ہو گی:

  • PVS_USERNAME - صارف نام
  • PVS_KEY - کلید
  • MAIL_USER - ای میل جو رپورٹ بھیجنے کے لیے استعمال کیا جائے گا۔
  • MAIL_PASSWORD - ای میل پاس ورڈ

آخری دو اختیاری ہیں۔ یہ میل کے ذریعے نتائج بھیجنے کے لیے استعمال کیے جائیں گے۔ اگر آپ رپورٹ کو کسی اور طریقے سے تقسیم کرنا چاہتے ہیں، تو آپ کو ان کی نشاندہی کرنے کی ضرورت نہیں ہے۔

لہذا، ہم نے ماحولیاتی متغیرات کو شامل کیا ہے جس کی ہمیں ضرورت ہے:

مثال کے طور پر PSP ایمولیٹر کا استعمال کرتے ہوئے Travis CI میں PVS-Studio کیسے ترتیب دیا جائے۔
اب ایک فائل بناتے ہیں۔ 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" پر کلک کریں:

مثال کے طور پر PSP ایمولیٹر کا استعمال کرتے ہوئے Travis CI میں PVS-Studio کیسے ترتیب دیا جائے۔
ہم موجودہ تعمیر کا ایک جائزہ دیکھیں گے:

مثال کے طور پر PSP ایمولیٹر کا استعمال کرتے ہوئے Travis CI میں PVS-Studio کیسے ترتیب دیا جائے۔
اگر تعمیر کامیابی سے مکمل ہو جاتی ہے، تو ہمیں جامد تجزیہ کے نتائج کے ساتھ ایک ای میل موصول ہوگا۔ بلاشبہ، رپورٹ موصول کرنے کا واحد طریقہ میلنگ نہیں ہے۔ آپ کسی بھی نفاذ کا طریقہ منتخب کر سکتے ہیں۔ لیکن یہ یاد رکھنا ضروری ہے کہ تعمیر مکمل ہونے کے بعد، ورچوئل مشین فائلوں تک رسائی ممکن نہیں ہوگی۔

غلطی کا خلاصہ

ہم نے سب سے مشکل حصہ کامیابی سے مکمل کر لیا ہے۔ اب آئیے اس بات کو یقینی بنائیں کہ ہماری تمام کوششیں اس کے قابل ہیں۔ آئیے جامد تجزیہ کی رپورٹ کے کچھ دلچسپ نکات پر نظر ڈالتے ہیں جو مجھے بذریعہ ڈاک آئی (یہ کچھ بھی نہیں تھا جس کا میں نے اشارہ کیا تھا)۔

خطرناک اصلاح

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 وارننگ: V597 کمپائلر 'میم سیٹ' فنکشن کال کو ڈیلیٹ کر سکتا ہے، جو 'سم' بفر کو فلش کرنے کے لیے استعمال ہوتا ہے۔ RtlSecureZeroMemory() فنکشن کو نجی ڈیٹا کو مٹانے کے لیے استعمال کیا جانا چاہیے۔ sha1.cpp 325

کوڈ کا یہ ٹکڑا محفوظ ہیشنگ ماڈیول میں واقع ہے، تاہم، اس میں ایک سنگین حفاظتی خامی ہے (CWE-14)۔ آئیے اسمبلی کی فہرست کو دیکھتے ہیں جو ڈیبگ ورژن کو مرتب کرتے وقت تیار ہوتی ہے۔

; 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 وارننگ: V547 اظہار 'leftvol >= 0' ہمیشہ سچ ہوتا ہے۔ sceAudio.cpp 120

پہلے کے لیے دوسری شاخ پر توجہ دیں۔ 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");
  }
  ....
}

V501 ایک جیسے ذیلی تاثرات '!Memory::IsValidAddress(psmfData)' کے بائیں اور دائیں '||' ہیں۔ آپریٹر scePsmf.cpp 703

اندر چیک پر توجہ دیں۔ 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 وارننگ: V547 اظہار 'سائز == 8' ہمیشہ غلط ہوتا ہے۔ syn-att.c 195

یہ غلطی فولڈر میں موجود ہے۔ ایکسٹینشن، تو واقعی اس پروجیکٹ سے متعلق نہیں ہے، لیکن میں نے اسے محسوس کرنے سے پہلے ہی بگ پایا، اس لیے میں نے اسے چھوڑنے کا فیصلہ کیا۔ سب کے بعد، یہ مضمون غلطیوں کا جائزہ لینے کے بارے میں نہیں ہے، لیکن Travis CI کے ساتھ انضمام کے بارے میں ہے، اور تجزیہ کار کی کوئی ترتیب نہیں کی گئی تھی.

متغیر سائز ایک مستقل کے ذریعہ شروع کیا جاتا ہے، تاہم، یہ کوڈ میں بالکل بھی استعمال نہیں ہوتا، بالکل نیچے آپریٹر تک if، جو یقیناً دیتا ہے۔ جھوٹی حالات کی جانچ کرتے وقت، کیونکہ، جیسا کہ ہمیں یاد ہے، سائز صفر کے برابر اس کے بعد کی جانچ پڑتال بھی کوئی معنی نہیں رکھتی۔

بظاہر، کوڈ کے ٹکڑے کا مصنف متغیر کو اوور رائٹ کرنا بھول گیا۔ سائز اس سے پہلے.

بند کرو

یہ وہ جگہ ہے جہاں ہم شاید غلطیوں کے ساتھ ختم ہوں گے۔ اس مضمون کا مقصد Travis CI کے ساتھ مل کر PVS-Studio کے کام کا مظاہرہ کرنا ہے، اور اس منصوبے کا ہر ممکن حد تک مکمل تجزیہ نہیں کرنا ہے۔ اگر آپ بڑی اور خوبصورت غلطیاں چاہتے ہیں تو آپ ہمیشہ ان کی تعریف کر سکتے ہیں۔ یہاں :).

حاصل يہ ہوا

پراجیکٹس بنانے کے لیے ویب سروسز کا استعمال انکریمنٹل اینالیسس کی مشق کے ساتھ آپ کو کوڈ کو ضم کرنے کے فوراً بعد بہت سی پریشانیوں کو تلاش کرنے کی اجازت دیتا ہے۔ تاہم، ایک تعمیر کافی نہیں ہوسکتی ہے، لہذا جامد تجزیہ کے ساتھ ٹیسٹنگ ترتیب دینے سے کوڈ کے معیار میں نمایاں بہتری آئے گی۔

کارآمد ویب سائٹس

مثال کے طور پر PSP ایمولیٹر کا استعمال کرتے ہوئے Travis CI میں PVS-Studio کیسے ترتیب دیا جائے۔

اگر آپ انگریزی بولنے والے سامعین کے ساتھ اس مضمون کا اشتراک کرنا چاہتے ہیں، تو براہ کرم ترجمہ کا لنک استعمال کریں: Maxim Zvyagintsev۔ پی ایس پی گیم کنسول ایمولیٹر کی مثال کا استعمال کرتے ہوئے ٹریوس سی آئی میں پی وی ایس اسٹوڈیو کو کیسے ترتیب دیا جائے.

ماخذ: www.habr.com

نیا تبصرہ شامل کریں