پي ايس پي گيم ڪنسول ايموليٽر جو مثال استعمال ڪندي Travis CI ۾ PVS-Studio کي ڪيئن ترتيب ڏيو

پي ايس پي گيم ڪنسول ايموليٽر جو مثال استعمال ڪندي Travis CI ۾ PVS-Studio کي ڪيئن ترتيب ڏيو
ٽريس سي آءِ هڪ ورهايل ويب سروس آهي جيڪا سافٽ ويئر جي تعمير ۽ جانچ لاءِ آهي جيڪا استعمال ڪري ٿي GitHub کي ماخذ ڪوڊ هوسٽنگ جي طور تي. مٿين آپريٽنگ منظرنامي جي اضافي ۾، توھان شامل ڪري سگھو ٿا پنھنجو پنھنجو مھرباني وسيع تشڪيل جي اختيارن لاءِ. هن آرٽيڪل ۾ اسان پي ايس ايس ايس پي ڪوڊ مثال استعمال ڪندي PVS-Studio سان ڪم ڪرڻ لاءِ Travis CI ترتيب ڏينداسين.

تعارف

ٽريس سي آء سافٽ ويئر جي تعمير ۽ جانچ لاءِ هڪ ويب سروس آهي. اهو عام طور تي استعمال ڪيو ويندو آهي مسلسل انضمام جي عملن سان گڏ.

پي پي ايس ايس پي پي - PSP گیم ڪنسول ايموليٽر. پروگرام سوني پي ايس پي لاءِ ارادو ڪيل ڊسڪ تصويرن مان ڪنهن به راندين جي لانچ کي نقل ڪرڻ جي قابل آهي. پروگرام 1 نومبر 2012 تي جاري ڪيو ويو. PPSSPP GPL v2 تحت لائسنس يافته آهي. ڪو به ماڻهو بهتر ڪري سگهي ٿو پروجيڪٽ جو ذريعو ڪوڊ.

پي وي وي اسٽوڊيو - پروگرام ڪوڊ ۾ غلطين ۽ امڪاني نقصانن جي ڳولا لاءِ هڪ جامد ڪوڊ تجزيه ڪندڙ. هن آرٽيڪل ۾، تبديلي لاءِ، اسان لانچ ڪنداسين PVS-Studio مقامي طور تي ڊولپر جي مشين تي نه، پر ڪلائوڊ ۾، ۽ PPSSPP ۾ غلطيون ڳوليندا.

Travis CI قائم ڪرڻ

اسان کي GitHub تي هڪ مخزن جي ضرورت پوندي، جتي اسان کي گهربل پروجيڪٽ واقع آهي، انهي سان گڏ PVS-Studio لاءِ هڪ ڪيچي (توهان حاصل ڪري سگهو ٿا) آزمائشي چاٻي يا اوپن سورس منصوبن لاءِ مفت).

اچو ته سائيٽ تي وڃو ٽريس سي آء. توهان جي GitHub اڪائونٽ کي استعمال ڪندي اختيار ڪرڻ کان پوء، اسان هڪ فهرست ڏسندا سين مخزن جي:

پي ايس پي گيم ڪنسول ايموليٽر جو مثال استعمال ڪندي Travis CI ۾ PVS-Studio کي ڪيئن ترتيب ڏيو
ٽيسٽ لاءِ، مون پي پي ايس ايس پي کي فورڪ ڪيو.

اسان ان مخزن کي چالو ڪيو جيڪو اسان گڏ ڪرڻ چاهيون ٿا:

پي ايس پي گيم ڪنسول ايموليٽر جو مثال استعمال ڪندي Travis CI ۾ PVS-Studio کي ڪيئن ترتيب ڏيو
هن وقت، Travis CI اسان جي منصوبي کي تعمير نٿو ڪري سگهي ڇاڪاڻ ته عمارت لاء ڪا به هدايتون نه آهن. تنهنڪري اهو ترتيب ڏيڻ جو وقت آهي.

تجزيي جي دوران، ڪجهه متغير اسان لاء ڪارائتو هوندا، مثال طور، PVS-اسٽوڊيو لاء ڪنجي، جيڪو ترتيب ڏيڻ واري فائل ۾ بيان ڪرڻ لاء ناپسنديده هوندو. تنهن ڪري اچو ته ٽريس سي آءِ ۾ تعميراتي سيٽنگون استعمال ڪندي ماحولياتي متغير شامل ڪيون:

پي ايس پي گيم ڪنسول ايموليٽر جو مثال استعمال ڪندي Travis CI ۾ PVS-Studio کي ڪيئن ترتيب ڏيو
اسان کي گهرجي:

  • PVS_USERNAME - يوزر نالو
  • PVS_KEY - چاٻي
  • MAIL_USER - اي ميل جيڪا رپورٽ موڪلڻ لاءِ استعمال ڪئي ويندي
  • MAIL_PASSWORD - اي ميل پاسورڊ

آخري ٻه اختياري آهن. اهي ميل ذريعي نتيجا موڪلڻ لاءِ استعمال ڪيا ويندا. جيڪڏهن توهان ڪنهن ٻئي طريقي سان رپورٽ کي ورهائڻ چاهيو ٿا، توهان کي انهن کي ظاهر ڪرڻ جي ضرورت ناهي.

تنهن ڪري، اسان شامل ڪيو آهي ماحولياتي متغير جيڪي اسان کي گهربل آهن:

پي ايس پي گيم ڪنسول ايموليٽر جو مثال استعمال ڪندي Travis CI ۾ PVS-Studio کي ڪيئن ترتيب ڏيو
هاڻي اچو ته هڪ فائل ٺاهي .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 ۾، ٺاھڻ جا ٻه طريقا آھن بلڊ آپشنز: پھريون اھو آھي ته مرتب ڪرڻ وارن جي ھڪڙي فهرست بيان ڪرڻ، آپريٽنگ سسٽم جا قسم، ماحوليات جي متغير، وغيره، جنھن کان پوءِ سڀني ممڪن ميلاپن جو ھڪڙو ميٽرڪس ٺاھيو ويندو آھي؛ ٻيو ميٽرڪس جو هڪ واضح اشارو آهي. يقينا، توهان انهن ٻن طريقن کي گڏ ڪري سگهو ٿا ۽ هڪ منفرد ڪيس شامل ڪري سگهو ٿا، يا، ان جي ابتڙ، سيڪشن کي استعمال ڪندي ان کي خارج ڪريو شامل ڪريو. توھان ان بابت وڌيڪ پڙھي سگھو ٿا 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 CI دستاويز.

پڙهڻ جي آسانيءَ لاءِ، حڪم هڪ الڳ رسم الخط ۾ رکيا ويا .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

ڪوڊ جي هن حصي ۾ اسان لاء مقرر ڪيو ويو آهي ڪيڪي تاليف جي حڪمن کي برآمد ڪرڻ لاء پرچم. اهو هڪ جامد ڪوڊ تجزيه ڪندڙ لاء ضروري آهي. توھان ھن بابت وڌيڪ پڙھي سگھوٿا مضمون ۾ "Linux ۽ macOS تي PVS-Studio کي ڪيئن هلائڻ".

جيڪڏهن اسيمبلي ڪامياب ٿي وئي ته پوء اسان حاصل ڪيو ڪاميابي کان پوءِ، جتي اسان جامد تجزيو انجام ڏيون ٿا:

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" تي ڪلڪ ڪريو رپورٽون تعمير ڪرڻ لاء:

پي ايس پي گيم ڪنسول ايموليٽر جو مثال استعمال ڪندي Travis CI ۾ PVS-Studio کي ڪيئن ترتيب ڏيو
اسان ڏسنداسين موجوده تعمير جو هڪ جائزو:

پي ايس پي گيم ڪنسول ايموليٽر جو مثال استعمال ڪندي 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-اسٽوڊيو ڊيڄاريندڙ: V597 گڏ ڪرڻ وارو 'memset' فنڪشن ڪال کي ختم ڪري سگهي ٿو، جيڪو 'sum' بفر کي فلش ڪرڻ لاء استعمال ڪيو ويندو آهي. RtlSecureZeroMemory() فنڪشن کي نجي ڊيٽا کي ختم ڪرڻ لاء استعمال ڪيو وڃي. sha1.cpp 325

ڪوڊ جو هي ٽڪرو محفوظ هيشنگ ماڊل ۾ واقع آهي، جڏهن ته، ان ۾ هڪ سنگين سيڪيورٽي نقص آهي (CWE-14). اچو ته ڏسو اسيمبلي جي لسٽنگ جيڪا ٺاهي وئي آهي جڏهن ڊيبگ ورزن کي گڏ ڪندي:

; 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-اسٽوڊيو ڊيڄاريندڙ: V547 اظهار 'leftvol > = 0' هميشه صحيح آهي. sceAudio.cpp 120

پهرين لاء ٻي شاخ تي ڌيان ڏيو 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");
  }
  ....
}

V501 هڪجهڙا ذيلي اظهار آهن '!Memory::IsValidAddress(psmfData)' کاٻي ۽ ساڄي پاسي '||' آپريٽر scePsmf.cpp 703

اندر چيڪ تي ڌيان ڏيو 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-اسٽوڊيو ڊيڄاريندڙ: V547 ايڪسپريس 'سائز == 8' هميشه غلط آهي. syn-att.c 195

ھي نقص فولڊر ۾ موجود آھي اضافي، تنهنڪري واقعي پروجيڪٽ سان لاڳاپيل ناهي، پر مون ان کي محسوس ڪرڻ کان اڳ ئي بگ مليو، تنهنڪري مون ان کي ڇڏڻ جو فيصلو ڪيو. آخرڪار، هي مضمون غلطين جي نظرثاني بابت نه آهي، پر ٽريس سي آء سان گڏ انضمام بابت، ۽ تجزيي جي ڪا به ترتيب نه ڏني وئي هئي.

متغير ڪرائون سائيز واري هڪ مستقل طور تي شروع ڪيو ويو آهي، جڏهن ته، اهو ڪوڊ ۾ استعمال نه ڪيو ويو آهي، سڌو آپريٽر ڏانهن if، جيڪو، يقينا، ڏئي ٿو ڪوڙي حالتن کي جانچڻ دوران، ڇاڪاڻ ته، جيئن اسان کي ياد آهي، ڪرائون سائيز واري صفر جي برابر. بعد ۾ چيڪ ڪرڻ جو ڪو به مطلب ناهي.

بظاهر، ڪوڊ جي ٽڪڙي جو ليکڪ متغير کي اوور رائٽ ڪرڻ وساري ويو ڪرائون سائيز واري ان کان اڳ.

رکو

اهو آهي جتي اسان شايد غلطي سان ختم ڪنداسين. هن آرٽيڪل جو مقصد اهو آهي ته PVS-اسٽوڊيو جي ڪم کي ٽريوس سي آءِ سان گڏ ڏيکاريو، ۽ نه ته پروجيڪٽ جو مڪمل طور تي ممڪن طور تجزيو ڪيو وڃي. جيڪڏهن توهان چاهيو ٿا ته وڏيون ۽ وڌيڪ خوبصورت غلطيون، توهان هميشه انهن جي تعريف ڪري سگهو ٿا هتي :.

ٿڪل

پروجيڪٽ ٺاهڻ لاءِ ويب سروسز استعمال ڪرڻ سان گڏ واڌو تجزيي جي مشق توهان کي ڪوڊ ملائڻ کان پوءِ فوري طور تي ڪيترائي مسئلا ڳولڻ جي اجازت ڏئي ٿي. جڏهن ته، هڪ تعمير ڪافي نه ٿي سگهي ٿي، تنهنڪري جامد تجزيي سان گڏ ٽيسٽ کي ترتيب ڏيڻ سان ڪوڊ جي معيار کي بهتر بڻائي سگهندي.

ڪارآمد لنڪ

پي ايس پي گيم ڪنسول ايموليٽر جو مثال استعمال ڪندي Travis CI ۾ PVS-Studio کي ڪيئن ترتيب ڏيو

جيڪڏهن توهان هن مضمون کي انگريزي ڳالهائيندڙ سامعين سان حصيداري ڪرڻ چاهيو ٿا، مهرباني ڪري ترجمو لنڪ استعمال ڪريو: Maxim Zvyagintsev. پي ايس پي گيم ڪنسول ايموليٽر جو مثال استعمال ڪندي ٽريس سي آءِ ۾ PVS-اسٽوڊيو ڪيئن قائم ڪجي.

جو ذريعو: www.habr.com

تبصرو شامل ڪريو