په Travis CI کې د PVS-Studio تنظیم کولو څرنګوالی د PSP لوبې کنسول ایمولیټر مثال په کارولو سره

په Travis CI کې د PVS-Studio تنظیم کولو څرنګوالی د PSP لوبې کنسول ایمولیټر مثال په کارولو سره
Travis CI د سافټویر جوړولو او ازموینې لپاره توزیع شوی ویب خدمت دی چې GitHub د سرچینې کوډ کوربه توب په توګه کاروي. د پورته عملیاتي سناریوګانو سربیره، تاسو کولی شئ د پراخ ترتیب کولو اختیارونو څخه خپل مننه اضافه کړئ. پدې مقاله کې به موږ د PPSSPP کوډ مثال په کارولو سره د PVS-Studio سره کار کولو لپاره Travis CI تنظیم کړو.

پېژندنه

Travis CI د سافټویر جوړولو او ازموینې لپاره ویب خدمت دی. دا معمولا د دوامداره ادغام عملونو سره په ګډه کارول کیږي.

PPSSPP - د PSP لوبې کنسول ایمولیټر. برنامه د دې وړتیا لري چې د سوني PSP لپاره د ډیسک عکسونو څخه د هرې لوبې پیل کول تقلید کړي. دا پروګرام د نومبر په 1، 2012 خپور شو. PPSSPP د GPL v2 لاندې جواز لري. هر څوک کولی شي چې پرمختګ وکړي د پروژې سرچینې کوډ.

PVS- سټوډیو - د برنامه کوډ کې د غلطیو او احتمالي زیانونو لټون لپاره د جامد کوډ تحلیل کونکی. په دې مقاله کې، د بدلون لپاره، موږ به PVS-Studio په سیمه ایز ډول د پراختیا کونکي ماشین کې نه، مګر په بادل کې پیل کړو، او په PPSSPP کې د غلطیو په لټه کې شو.

د Travis CI تنظیم کول

موږ به په GitHub کې ذخیره ته اړتیا ولرو، چیرې چې هغه پروژه چې موږ ورته اړتیا لرو موقعیت لري، او همدارنګه د PVS-Studio لپاره کلیدي (تاسو ترلاسه کولی شئ) د محاکمې کیلي او یا د خلاصې سرچینې پروژې لپاره وړیا).

راځئ چې سایټ ته لاړ شو Travis CI. ستاسو د GitHub حساب کارولو اجازه ورکولو وروسته، موږ به د ذخیره کولو لیست وګورو:

په Travis CI کې د PVS-Studio تنظیم کولو څرنګوالی د PSP لوبې کنسول ایمولیټر مثال په کارولو سره
د ازموینې لپاره، ما د PPSSPP فورک وکړ.

موږ هغه ذخیره فعاله کوو چې موږ یې راټولول غواړو:

په Travis CI کې د PVS-Studio تنظیم کولو څرنګوالی د PSP لوبې کنسول ایمولیټر مثال په کارولو سره
په اوس وخت کې، Travis CI نشي کولی زموږ پروژه جوړه کړي ځکه چې د جوړولو لپاره هیڅ لارښوونې شتون نلري. نو دا د تنظیم کولو وخت دی.

د تحلیل په جریان کې، ځینې تغیرات به زموږ لپاره ګټور وي، د بیلګې په توګه، د PVS-Studio کلیدي، کوم چې د ترتیب کولو فایل کې مشخص کولو لپاره ناغوښتل وي. نو راځئ چې په Travis CI کې د جوړونې ترتیباتو په کارولو سره د چاپیریال تغیرات اضافه کړو:

په Travis CI کې د PVS-Studio تنظیم کولو څرنګوالی د PSP لوبې کنسول ایمولیټر مثال په کارولو سره
موږ ته اړتیا لرو:

  • PVS_USERNAME - کارن نوم
  • PVS_KEY - کلیدي
  • MAIL_USER - بریښنالیک چې د راپور لیږلو لپاره کارول کیږي
  • MAIL_PASSWORD - د بریښنالیک پټنوم

وروستي دوه اختیاري دي. دا به د بریښنالیک له لارې د پایلو لیږلو لپاره وکارول شي. که تاسو غواړئ راپور په بل ډول توزیع کړئ، تاسو اړتیا نلرئ دوی ته اشاره وکړئ.

نو، موږ د چاپیریال متغیرونه اضافه کړي چې موږ ورته اړتیا لرو:

په Travis CI کې د PVS-Studio تنظیم کولو څرنګوالی د PSP لوبې کنسول ایمولیټر مثال په کارولو سره
اوس راځئ چې یو فایل جوړ کړو .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'

ټول بسته بندي چې لیست شوي دي په ځانګړې توګه د 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 کې، د جوړونې اختیارونو رامینځته کولو لپاره دوه لارې شتون لري: لومړی د کمپیلرونو لیست مشخص کول، د عملیاتي سیسټم ډولونه، د چاپیریال متغیرات، او نور، وروسته له دې چې د ټولو ممکنه ترکیبونو میټریکس تولید شي؛ دوهم د میټرکس څرګند اشاره ده. البته، تاسو کولی شئ دا دوه طریقې سره یوځای کړئ او یو ځانګړی قضیه اضافه کړئ، یا برعکس، د برخې په کارولو سره یې خارج کړئ. لرې کړئ. تاسو کولی شئ په دې اړه نور ولولئ د 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 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

د کڅوړو نصبولو دمخه، موږ به فرعي ماډلونه تازه کړو. دا د PPSSPP جوړولو لپاره اړین دی. راځئ چې لومړی فنکشن اضافه کړو .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 د پلورنځي ارزښت هو (موږ دا په برخه کې اشاره وکړه لیږل د میټریکس ترتیب کولو پرمهال) ، موږ کڅوړه نصب کوو 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 د تالیف امرونو صادرولو لپاره پرچم. دا د جامد کوډ تحلیل کونکي لپاره اړین دی. تاسو کولی شئ پدې اړه نور په مقاله کې ولولئ "په لینکس او 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

لومړۍ کرښه د کارن نوم او کیلي څخه د جواز فایل رامینځته کوي کوم چې موږ په پیل کې مشخص کړی کله چې د ټریوس CI چاپیریال تغیرات تنظیم کول.

دوهمه کرښه په مستقیم ډول تحلیل پیل کوي. بیرغ د تحلیل لپاره د تارونو شمیر ټاکي، پرچم -l جواز، پرچم ته اشاره کوي -او د لاګونو او بیرغ لپاره فایل تعریفوي - د لایسنس ختمیدو چیک غیر فعال کړئ د محاکمې نسخو لپاره اړین دی، ځکه چې د ډیفالټ لخوا 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;

اوس د دې وخت دی چې بدلونونه د git ذخیره کې فشار ورکړئ ، له هغې وروسته به Travis CI به په اوتومات ډول جوړونه پرمخ بوځي. د جوړو راپورونو ته د تګ لپاره په "ppsspp" کلیک وکړئ:

په Travis CI کې د PVS-Studio تنظیم کولو څرنګوالی د PSP لوبې کنسول ایمولیټر مثال په کارولو سره
موږ به د اوسني جوړښت یوه عمومي کتنه وګورو:

په Travis CI کې د PVS-Studio تنظیم کولو څرنګوالی د PSP لوبې کنسول ایمولیټر مثال په کارولو سره
که جوړونه په بریالیتوب سره بشپړه شي، موږ به د جامد تحلیل پایلو سره یو بریښنالیک ترلاسه کړو. البته، بریښنالیک د راپور ترلاسه کولو یوازینۍ لار نه ده. تاسو کولی شئ د پلي کولو هر ډول میتود غوره کړئ. مګر دا مهمه ده چې په یاد ولرئ چې د جوړولو بشپړیدو وروسته به د مجازی ماشین فایلونو ته لاسرسی ممکن نه وي.

د تېروتنې لنډیز

موږ په بریالیتوب سره ترټولو ستونزمنه برخه بشپړه کړه. اوس راځئ ډاډ ترلاسه کړو چې زموږ ټولې هڅې د ارزښت وړ دي. راځئ چې د جامد تحلیلي راپور څخه ځینې په زړه پوري ټکي وګورو چې ما ته د بریښنالیک له لارې راغلی (دا د هیڅ شی لپاره نه و چې ما ورته اشاره کړې وه).

خطرناک اصلاح کول

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  :}

لکه څنګه چې د لیست کولو څخه لیدل کیدی شي، تالیف کونکي تلیفون له پامه غورځولی یادول. دا د دې حقیقت له امله دی چې په فعالیت کې شاکنومکس له زنګ وروسته یادول نور جوړښت ته اشاره نشته 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. کوډ به یوازې د ټولو شرایطو په صورت کې اجرا شي leftvol > 0xFFFF || rightvol > 0xFFFF || لیفٹول <0 || rightvol <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. ایا تاسو فکر نه کوئ چې دا عجيبه ده چې موږ وګورو چې پته سمه ده؟ 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-Studio خبرداری: V547 بیان 'سایز == 8' تل غلط وي. syn-att.c 195

دا تېروتنه په فولډر کې موقعیت لري اضافه، نو د پروژې سره واقعیا اړونده نده ، مګر مخکې لدې چې ما ورته پام وکړ بګ وموندل شو ، نو ما پریکړه وکړه چې پریږدم. په هرصورت، دا مقاله د تیروتنو بیاکتنې په اړه نه ده، مګر د Travis CI سره د ادغام په اړه، او د تحلیل کونکي هیڅ ترتیب ندی ترسره شوی.

متغیر اندازه د ثابت په واسطه پیل شوی، په هرصورت، دا په کوډ کې نه کارول کیږي، په سمه توګه د آپریټر ته if، کوم چې، البته، ورکوي غلط د شرایطو چک کولو پرمهال، ځکه، لکه څنګه چې موږ یادونه کوو، اندازه د صفر سره مساوي. ورپسې چکونه هم هیڅ معنی نه لري.

په ښکاره ډول ، د کوډ ټوټې لیکوال د متغیر له سره لیکل هیر کړي اندازه مخکې له دې.

درېدل

دا هغه ځای دی چې موږ به شاید د غلطیو سره پای ته ورسیږو. د دې مقالې هدف د Travis CI سره یوځای د PVS-Studio کار ښودل دي، او د امکان تر حده د پروژې تحلیل نه کول دي. که تاسو لوی او ډیرې ښکلې غلطی غواړئ، تاسو تل د دوی ستاینه کولی شئ دلته :).

پایلې

د پرمختیایي تحلیلونو تمرین سره یوځای د پروژو جوړولو لپاره د ویب خدماتو کارول تاسو ته اجازه درکوي د کوډ یوځای کولو وروسته سمدلاسه ډیری ستونزې ومومئ. په هرصورت، یو جوړونه ممکن کافي نه وي، نو د جامد تحلیل سره یوځای د ازموینې ترتیب کول به د کوډ کیفیت د پام وړ ښه کړي.

ګټور لینکونه

په Travis CI کې د PVS-Studio تنظیم کولو څرنګوالی د PSP لوبې کنسول ایمولیټر مثال په کارولو سره

که تاسو غواړئ دا مقاله د انګلیسي ژبو لیدونکو سره شریکه کړئ ، نو مهرباني وکړئ د ژباړې لینک وکاروئ: ماکسیم زویاګینتسیف. په Travis CI کې د PVS-Studio تنظیم کولو څرنګوالی د PSP لوبې کنسول ایمولیټر مثال په کارولو سره.

سرچینه: www.habr.com

Add a comment