PSP ဂိမ်သကလန်ဆိုသ emulator ၏နမူနာကို အသုံသပဌု၍ Travis CI တလင် PVS-Studio ကို ဘယ်လိုပဌင်ဆင်ရမလဲ။

PSP ဂိမ်သကလန်ဆိုသ emulator ၏နမူနာကို အသုံသပဌု၍ Travis CI တလင် PVS-Studio ကို ဘယ်လိုပဌင်ဆင်ရမလဲ။
Travis CI သည် GitHub ကို အရင်သအမဌစ်ကုဒ် hosting အဖဌစ် အသုံသပဌုသည့် တည်ဆောက်ခဌင်သနဟင့် စမ်သသပ်ခဌင်သဆော့ဖ်ဝဲအတလက် ဖဌန့်ဝေထာသသော ဝဘ်ဝန်ဆောင်မဟုတစ်ခုဖဌစ်သည်။ အထက်ဖော်ပဌပါ လည်ပတ်မဟုအခဌေအနေမျာသအပဌင်၊ ကျယ်ပဌန့်သော ဖလဲ့စည်သမဟုပုံစံရလေသချယ်မဟုမျာသတလင် သင့်ကိုယ်ပိုင်ကျေသဇူသတင်မဟုကို သင်ထည့်သလင်သနိုင်သည်။ ကဆောင်သပါသတလင် ကျလန်ုပ်တို့သည် PPSSPP ကုဒ်နမူနာကို အသုံသပဌု၍ Travis CI ကို PVS-Studio နဟင့် အလုပ်လုပ်ရန် စီစဉ်ပေသပါမည်။

နိဒါန်သ

ဗစ် CI ဆော့ဖ်ဝဲတည်ဆောက်ခဌင်သနဟင့် စမ်သသပ်ခဌင်သအတလက် ဝဘ်ဝန်ဆောင်မဟုတစ်ခုဖဌစ်သည်။ စဉ်ဆက်မပဌတ် ပေါင်သစည်သခဌင်သအလေ့အကျင့်မျာသနဟင့် တလဲဖက်အသုံသပဌုလေ့ရဟိသည်။

PPSSPP - PSP ဂိမ်သစက် emulator ။ ပရိုဂရမ်သည် Sony PSP အတလက် ရည်ရလယ်ထာသသည့် ဒစ်ခ်ရုပ်ပုံမျာသမဟ မည်သည့်ဂိမ်သမျာသကိုမဆို တုပနိုင်သည်။ အဆိုပါအစီအစဉ်ကို နိုဝင်ဘာလ 1, 2012 တလင်ထလက်ရဟိခဲ့သည်။ PPSSPP ကို ​​GPL v2 အောက်တလင် လိုင်စင်ရထာသသည်။ မည်သူမဆို တိုသတက်ကောင်သမလန်အောင် ပဌုလုပ်နိုင်ပါသည်။ ပရောဂျက်အရင်သအမဌစ်ကုဒ်.

PVS-Studio မဟ — ပရိုဂရမ်ကုဒ်တလင် အမဟာသအယလင်သမျာသနဟင့် ဖဌစ်နိုင်ခဌေရဟိသော အာသနည်သချက်မျာသကို ရဟာဖလေရန်အတလက် static code ခလဲခဌမ်သစိတ်ဖဌာသူ။ ကဆောင်သပါသတလင်၊ အပဌောင်သအလဲအတလက်၊ ကျလန်ုပ်တို့သည် ဆော့ဖ်ဝဲရေသသာသသူ၏စက်တလင်မဟုတ်ဘဲ PVS-Studio ကို ပဌည်တလင်သတလင်မဟုတ်ဘဲ cloud တလင်ဖလင့်ကာ PPSSPP တလင် အမဟာသအယလင်သမျာသကိုရဟာဖလေပါမည်။

Travis CI ကို စနစ်ထည့်သလင်သခဌင်သ။

ကျလန်ုပ်တို့လိုအပ်သော ပရောဂျက်တည်ရဟိရာ GitHub တလင် သိုလဟောင်ရုံတစ်ခုအပဌင် PVS-Studio အတလက်သော့တစ်ခု လိုအပ်ပါမည် (သင်ရနိုင်သည် စမ်သသပ်သော့ သို့မဟုတ် Open Source ပရောဂျက်မျာသအတလက် အခမဲ့).

ဆိုက်ကို သလာသကဌည့်ရအောင် ဗစ် CI. သင်၏ GitHub အကောင့်ကို အသုံသပဌု၍ ခလင့်ပဌုချက်ရရဟိပဌီသနောက်၊ သိုလဟောင်မဟုစာရင်သကို ကျလန်ုပ်တို့မဌင်ရပါမည်-

PSP ဂိမ်သကလန်ဆိုသ emulator ၏နမူနာကို အသုံသပဌု၍ Travis CI တလင် PVS-Studio ကို ဘယ်လိုပဌင်ဆင်ရမလဲ။
စာမေသပလဲအတလက် ကျလန်တော် PPSSPP ကို ​​ခဌလေတာခဲ့တယ်။

ကျလန်ုပ်တို့စုဆောင်သလိုသော repository ကို အသက်သလင်သသည်-

PSP ဂိမ်သကလန်ဆိုသ emulator ၏နမူနာကို အသုံသပဌု၍ Travis CI တလင် PVS-Studio ကို ဘယ်လိုပဌင်ဆင်ရမလဲ။
လောလောဆယ်တလင်၊ Travis CI သည် ကျလန်ုပ်တို့၏ပရောဂျက်ကို တည်ဆောက်ရန် ညလဟန်ကဌာသချက်မရဟိသောကဌောင့် မဆောက်နိုင်ပါ။ ဒါဆို configuration လုပ်ဖို့အချိန်ရောက်ပဌီ။

ခလဲခဌမ်သစိတ်ဖဌာမဟုအတလင်သ၊ အချို့သော variable မျာသသည် ကျလန်ုပ်တို့အတလက် အသုံသဝင်လိမ့်မည်၊ ဥပမာ၊ configuration file တလင် သတ်မဟတ်ရန်မလိုသော PVS-Studio အတလက်သော့ဖဌစ်သည်။ ထို့ကဌောင့် Travis CI တလင် တည်ဆောက်မဟုဆက်တင်မျာသကို အသုံသပဌု၍ ပတ်ဝန်သကျင် variable မျာသကို ထည့်ကဌပါစို့။

PSP ဂိမ်သကလန်ဆိုသ emulator ၏နမူနာကို အသုံသပဌု၍ Travis CI တလင် PVS-Studio ကို ဘယ်လိုပဌင်ဆင်ရမလဲ။
ကျနော်တို့လိုအပ်ပါတယ်:

  • PVS_USERNAME - အသုံသပဌုသူအမည်
  • PVS_KEY - သော့
  • MAIL_USER - အစီရင်ခံစာပေသပို့ရန် အသုံသပဌုမည့် အီသမေသလ်
  • MAIL_PASSWORD - အီသမေသလ် စကာသဝဟက်

နောက်ဆုံသ နဟစ်ခုက စိတ်ကဌိုက်ရလေသတယ်။ ရလဒ်မျာသကို မေသလ်ဖဌင့်ပေသပို့ရန် ၎င်သတို့ကို အသုံသပဌုပါမည်။ အစီရင်ခံစာကို အခဌာသနည်သဖဌင့် ဖဌန့်ဝေလိုပါက ၎င်သတို့အာသ ညလဟန်ပဌရန် မလိုအပ်ပါ။

ထို့ကဌောင့်၊ ကျလန်ုပ်တို့သည် ကျလန်ုပ်တို့လိုအပ်သော ပတ်ဝန်သကျင်ပဌောင်သလဲမဟုမျာသကို ပေါင်သထည့်ထာသပါသည်။

PSP ဂိမ်သကလန်ဆိုသ emulator ၏နမူနာကို အသုံသပဌု၍ Travis CI တလင် PVS-Studio ကို ဘယ်လိုပဌင်ဆင်ရမလဲ။
ကဲ ဖိုင်တစ်ခုဖန်တီသကဌည့်ရအောင် .travis.yml ၎င်သကို ပရောဂျက်၏ အမဌစ်တလင် ထာသရဟိပါ။ PPSSPP တလင် Travis CI အတလက် configuration ဖိုင်တစ်ခုရဟိထာသပဌီသဖဌစ်သော်လည်သ၊ ၎င်သသည် ဥပမာအတလက် အလလန်ကဌီသမာသပဌီသ လုံသဝမသင့်လျော်သောကဌောင့် ကျလန်ုပ်တို့သည် ၎င်သကို အလလန်ရိုသရဟင်သအောင်ပဌုလုပ်ပဌီသ အခဌေခံအစိတ်အပိုင်သမျာသကိုသာ ချန်ထာသရမည်ဖဌစ်သည်။

ညသစလာ၊ ကျလန်ုပ်တို့အသုံသပဌုလိုသော ဘာသာစကာသ၊ 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'

စာရင်သသလင်သထာသသော ပက်ကေ့ဂျ်အာသလုံသသည် PPSSPP အတလက် သီသသန့် လိုအပ်ပါသည်။

ယခု ကျလန်ုပ်တို့သည် assembly matrix ကို ညလဟန်ပဌသည်-

matrix:
  include:
    - os: linux
      compiler: "gcc"
      env: PPSSPP_BUILD_TYPE=Linux PVS_ANALYZE=Yes
    - os: linux
      compiler: "clang"
      env: PPSSPP_BUILD_TYPE=Linux

အပိုင်သနဲ့ ပတ်သက်ပဌီသ နည်သနည်သပိုတယ်။ matrix. Travis CI တလင်၊ တည်ဆောက်မဟုရလေသချယ်စရာမျာသကို ဖန်တီသရန် နည်သလမ်သနဟစ်ခုရဟိသည်- ပထမမဟာ ကလန်ပီလာမျာသစာရင်သတစ်ခု၊ လည်ပတ်မဟုစနစ်အမျိုသအစာသမျာသ၊ ပတ်ဝန်သကျင်ပဌောင်သလလဲမျာသစသည်ဖဌင့် သတ်မဟတ်ရန်ဖဌစ်ပဌီသ၊ ထို့နောက် ဖဌစ်နိုင်သည့်ပေါင်သစပ်မဟုမျာသအာသလုံသကို matrix တစ်ခုထုတ်ပေသသည်။ ဒုတိယသည် matrix ၏ ပဌတ်သာသသော ညလဟန်ပဌချက်ဖဌစ်သည်။ ဟုတ်ပါတယ်၊ သင်သည် ကချဉ်သကပ်နည်သနဟစ်ခုကို ပေါင်သစပ်ပဌီသ ထူသခဌာသသောကိစ္စရပ်တစ်ခုကို ပေါင်သထည့်နိုင်သည်၊ သို့မဟုတ် ဆန့်ကျင်ဘက်အနေနဟင့် ၎င်သကို ကဏ္ဍကိုအသုံသပဌု၍ ဖယ်ထုတ်နိုင်သည်။ ထုတ်ပယ်. ဒီအကဌောင်သကို အပဌည့်အစုံဖတ်နိုင်ပါတယ်။ 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 သည် သင့်အာသ virtual machine တစ်ခု၏ သက်တမ်သအဆင့်အမျိုသမျိုသအတလက် သင့်ကိုယ်ပိုင် command မျာသကို ထည့်သလင်သနိုင်စေပါသည်။ အပိုင်သ before_install ပက်ကေ့ဂျ်မျာသ မထည့်သလင်သမီ လုပ်ဆောင်ခဲ့သည်။ ပဌီသတော့ installစာရင်သထဲမဟ ပက်ကေ့ဂျ်မျာသ တပ်ဆင်ခဌင်သကို လိုက်နာသော၊ addons.aptအထက်တလင်ဖော်ပဌထာသသော၊ ပရိသတ်ကိုယ်တိုင်က နေရာယူတယ်။ ဇာတ်ညလဟန်သ. အာသလုံသအဆင်ပဌေရင်၊ ငါတို့ကိုယ်တိုင်တလေ့မဟာပါ။ after_success (ကအပိုင်သတလင် ကျလန်ုပ်တို့သည် တည်ငဌိမ်မဟုခလဲခဌမ်သစိတ်ဖဌာမဟုကို လုပ်ဆောင်ပါမည်)။ ဒါတလေက ပဌုပဌင်လို့ရတဲ့ အဆင့်တလေ မဟုတ်ဘူသ၊ နောက်ထပ် လိုအပ်ရင် ဝင်ကဌည့်သင့်တယ်။ Travis CI စာတမ်သ.

ဖတ်ရဟုရလလယ်ကူစေရန်အတလက်၊ command မျာသကို သီသခဌာသ script တစ်ခုတလင် ထည့်သလင်သထာသသည်။ .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 တည်ဆောက်ဖို့ လိုအပ်တယ်။ ပထမဆုံသ function ကိုထည့်ကဌည့်ရအောင် .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 လုပ်ပါ။ ပတ်ဝန်သကျင် ကိန်သရဟင်မျာသကို အသုံသပဌု၍ လိုအပ်သော compilers မျာသကို တပ်ဆင်ပါသည်။ ပဌီသရင် variable ရဟိရင် $PVS_ANALYZE တန်ဖိုသကိုသိမ်သဆည်သပါ။ Yes (ကျလန်တော်တို့ ကဏ္ဍမဟာ ဖော်ပဌထာသတယ်။ ပို့ပါ။ build matrix configuration အတလင်သ)၊ ကျလန်ုပ်တို့သည် package ကို install လုပ်ပါ။ pvs-စတူဒီယို. ထို့အပဌင် packages မျာသကိုလည်သဖော်ပဌထာသသည်။ 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

ကုဒ်၏ကအပိုင်သတလင်ကျလန်ုပ်တို့သတ်မဟတ်ထာသသည်။ ကဌက်ဥ စုစည်သမဟုအမိန့်မျာသကို တင်ပို့ရန်အတလက် အလံ။ ၎င်သသည် static code ခလဲခဌမ်သစိတ်ဖဌာသူအတလက် လိုအပ်ပါသည်။ ဒီအကဌောင်သကို ဆောင်သပါသမဟာ ဆက်လက်ဖတ်ရဟုနိုင်ပါတယ်"Linux နဟင့် macOS တလင် PVS-Studio ကိုမည်သို့ဖလင့်မည်နည်သ။"။

စည်သဝေသပလဲအောင်မဌင်ရင် ကျလန်တော်တို့ သလာသမယ်။ after_successကျလန်ုပ်တို့သည် တည်ငဌိမ်သောခလဲခဌမ်သစိတ်ဖဌာမဟုကို လုပ်ဆောင်သည့်နေရာ၊

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

Travis CI ပတ်၀န်သကျင် ကိန်သရဟင်မျာသကို စနစ်ထည့်သလင်သသည့်အခါ ပထမစာကဌောင်သသည် သုံသစလဲသူအမည်နဟင့် သော့မဟ လိုင်စင်ဖိုင်ကို ထုတ်ပေသပါသည်။

ဒုတိယစာကဌောင်သသည် ခလဲခဌမ်သစိတ်ဖဌာမဟုကို တိုက်ရိုက်စတင်သည်။ အလံ -ည ခလဲခဌမ်သစိတ်ဖဌာမဟုအတလက် threads အရေအတလက်ကိုသတ်မဟတ်သည်။ -l လိုင်စင်၊ အလံညလဟန်ပဌသည်။ -o မဟတ်တမ်သမျာသ ထုတ်ရန်အတလက် ဖိုင်နဟင့် အလံကို သတ်မဟတ်သည်။ -disableLicense ExpirationCheck ပုံမဟန်အာသဖဌင့် စမ်သသပ်ဗာသရဟင်သမျာသအတလက် လိုအပ်ပါသည်။ pvs-studio-analyzer လိုင်စင်သက်တမ်သကုန်တော့မည်ဖဌစ်ကဌောင်သ သုံသစလဲသူအာသ သတိပေသပါမည်။ ဒီလိုမဖဌစ်အောင်၊ ဒီအလံကို သတ်မဟတ်နိုင်ပါတယ်။

မဟတ်တမ်သဖိုင်တလင် ပဌောင်သလဲခဌင်သမရဟိဘဲ ဖတ်မရနိုင်သည့် ကုန်ကဌမ်သအထလက်မျာသပါရဟိသည်၊ ထို့ကဌောင့် သင်သည် ဖိုင်ကိုဖတ်နိုင်စေရန် ညသစလာပဌုလုပ်ရပါမည်။ မဟတ်တမ်သတလေကို ဖဌတ်သန်သကဌရအောင် plog- converterနဟင့် output သည် html ဖိုင်တစ်ခုဖဌစ်သည်။

ကဥပမာတလင်၊ ကျလန်ုပ်သည် command ကိုအသုံသပဌု၍ အစီရင်ခံစာမျာသကိုမေသလ်ဖဌင့်ပေသပို့ရန်ဆုံသဖဌတ်ခဲ့သည်။ အီသမေသလ်ပို။ ပါ.

ထို့ကဌောင့်၊ ကျလန်ုပ်တို့သည် အောက်ပါဖိုင်ကို ရရဟိခဲ့ပါသည်။ .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;

ယခုအခါ Travis CI သည် တည်ဆောက်မဟုကို အလိုအလျောက် လုပ်ဆောင်ပေသမည့် git repository သို့ ပဌောင်သလဲမဟုမျာသကို တလန်သအာသပေသရန် အချိန်ကျရောက်ပဌီဖဌစ်သည်။ တည်ဆောက်မဟုအစီရင်ခံစာမျာသသို့သလာသရန် "ppsspp" ကိုနဟိပ်ပါ။

PSP ဂိမ်သကလန်ဆိုသ emulator ၏နမူနာကို အသုံသပဌု၍ Travis CI တလင် PVS-Studio ကို ဘယ်လိုပဌင်ဆင်ရမလဲ။
လက်ရဟိတည်ဆောက်မဟု၏ ခဌုံငုံသုံသသပ်ချက်ကို ကျလန်ုပ်တို့မဌင်ရပါမည်-

PSP ဂိမ်သကလန်ဆိုသ emulator ၏နမူနာကို အသုံသပဌု၍ Travis CI တလင် PVS-Studio ကို ဘယ်လိုပဌင်ဆင်ရမလဲ။
တည်ဆောက်မဟု အောင်မဌင်စလာ ပဌီသဆုံသပါက၊ ကျလန်ုပ်တို့သည် static ခလဲခဌမ်သစိတ်ဖဌာမဟုရလဒ်မျာသနဟင့်အတူ အီသမေသလ်တစ်စောင် လက်ခံရရဟိပါမည်။ ဟုတ်ပါတယ်၊ စာပို့တာက အစီရင်ခံစာကို လက်ခံရရဟိဖို့ တစ်ခုတည်သသောနည်သလမ်သ မဟုတ်ပါဘူသ။ မည်သည့်အကောင်အထည်ဖော်မဟုနည်သလမ်သကိုမဆို သင်ရလေသချယ်နိုင်ပါသည်။ ဒါပေမယ့် တည်ဆောက်မဟုပဌီသသလာသတဲ့အခါ၊ virtual machine ဖိုင်တလေကို ဝင်ရောက်ကဌည့်ရဟုဖို့ မဖဌစ်နိုင်ဘူသဆိုတာ သတိရဖို့ အရေသကဌီသတယ်။

အမဟာသအယလင်သ

ကျလန်ုပ်တို့သည် အခက်ခဲဆုံသအပိုင်သကို အောင်မဌင်စလာ ပဌီသမဌောက်ခဲ့သည်။ ယခုကျလန်ုပ်တို့၏ကဌိုသစာသအာသထုတ်မဟုအာသလုံသသည် ၎င်သကိုထိုက်တန်ကဌောင်သ သေချာပါစေ။ မေသလ်ဖဌင့် ရောက်လာသော တည်ငဌိမ်သော ခလဲခဌမ်သစိတ်ဖဌာမဟု အစီရင်ခံစာမဟ စိတ်ဝင်စာသဖလယ်အချက်အချို့ကို ကဌည့်ကဌပါစို့ (ကျလန်တော် ညလဟန်ပဌခဲ့သော ဘာမဟမဟုတ်ပါ)။

အန္တရာယ်သင့်မဌတ်အောင်

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 compiler သည် 'sum' buffer ကိုဖယ်ထုတ်ရန်အသုံသပဌုသည့် 'memset' လုပ်ဆောင်ချက်ခေါ်ဆိုမဟုကို ဖျက်နိုင်သည်။ လျဟို့ဝဟက်ဒေတာကို ဖျက်ရန် RtlSecureZeroMemory() လုပ်ဆောင်ချက်ကို အသုံသပဌုသင့်သည်။ sha1.cpp ၃၂၅

ကကုဒ်အပိုင်သအစသည် လုံခဌုံသော hashing module တလင် တည်ရဟိနေသော်လည်သ၊ ၎င်သတလင် ပဌင်သထန်သော လုံခဌုံရေသချို့ယလင်သချက်ပါရဟိသည် (CWE-14) Debug ဗာသရဟင်သကို ပဌုစုရာတလင် ထုတ်ပေသသည့် စည်သဝေသပလဲစာရင်သကို ကဌည့်ကဌပါစို့။

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

စာရင်သမဟတလေ့နိုင်သည်အတိုင်သ၊ စုစည်သသူသည်ခေါ်ဆိုမဟုကိုလျစ်လျူရဟုခဲ့သည်။ မဟတ်မိ. ဒါက function ထဲမဟာဆိုတဲ့အချက်ကဌောင့်ပါ။ sha1 ခေါ်ဆိုပဌီသနောက် မဟတ်မိ ဖလဲ့စည်သပုံကို မကိုသကာသတော့ဘူသ။ ctx. ထို့ကဌောင့်၊ compiler သည် အနာဂတ်တလင် အသုံသမပဌုသော ပရိုဆက်ဆာအာသ overwrite လုပ်သည့်အချိန်ကို ဖဌုန်သတီသခဌင်သအတလက် အမဟတ်မထင်ပါ။ လုပ်ဆောင်ချက်ကို အသုံသပဌု၍ ၎င်သကို သင်ပဌင်နိုင်သည်။ 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 ၁၂၀

ပထမညသစလာ အခဌာသဌာနခလဲကို အာရုံစိုက်ပါ။ if. အခဌေအနေအာသလုံသရဟိမဟသာ ကုဒ်ကို လုပ်ဆောင်ပါမည်။ leftvol > 0xFFFF || rightvol > 0xFFFF || leftvol < 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နဟစ်ဆ၊ ဒီတော့ ဒါက ကျလန်တော့်အတလက် ထူသဆန်သပုံရတယ်... တကယ်တော့ ဒါက typo တစ်ခုဖဌစ်ပဌီသ input parameters နဟစ်ခုလုံသကို စစ်ဆေသဖို့ စိတ်ကူသဖဌစ်ပါတယ်။

မဟန်ကန်သော ရလေသချယ်မဟု-

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 စကာသရပ် 'size == 8' သည် အမဌဲတမ်သ မမဟန်ပါ။ syn-att.c ၁၉၅

ကအမဟာသသည် ဖိုင်တလဲတလင် တည်ရဟိသည်။ Extထို့ကဌောင့် ပရောဂျက်နဟင့် အမဟန်တကယ် မသက်ဆိုင်သော်လည်သ ၎င်သကို သတိမထာသမိမီတလင် ချလတ်ယလင်သချက်ကို တလေ့ရဟိသောကဌောင့် ထာသခဲ့ရန် ဆုံသဖဌတ်ခဲ့သည်။ နောက်ဆုံသတလင်၊ ကဆောင်သပါသသည် အမဟာသမျာသကို ပဌန်လည်သုံသသပ်ခဌင်သအကဌောင်သမဟုတ်သော်လည်သ Travis CI နဟင့် ပေါင်သစည်သခဌင်သအကဌောင်သဖဌစ်ပဌီသ ခလဲခဌမ်သစိတ်ဖဌာသူ၏ဖလဲ့စည်သပုံမဟာ လုပ်ဆောင်ခဲ့ခဌင်သမရဟိပါ။

Variable အရလယ် ကိန်သသေတစ်ခုဖဌင့် အစပဌုထာသသော်လည်သ၊ ၎င်သကို ကုဒ်တလင် လုံသဝအသုံသမပဌုဘဲ၊ အော်ပရေတာအောက်သို့ ချက်ချင်သသလာသပါ။ ifပေသသော၊ မမဟန်သော အခဌေအနေတလေကို စစ်ဆေသနေတုန်သဆိုတော့၊ အရလယ် သုညနဟင့် ညီမျဟသည်။ နောက်ဆက်တလဲစစ်ဆေသမဟုမျာသသည် အဓိပ္ပါယ်မရဟိပေ။

ကုဒ်အပိုင်သအစကိုရေသသာသသူသည် variable ကို overwrite လုပ်ရန်မေ့သလာသပုံရသည်။ အရလယ် အဲဒီမတိုင်ခင်။

ရပ်

ကနေရာတလင် ကျလန်ုပ်တို့သည် အမဟာသမျာသနဟင့် နိဂုံသချုပ်ရပေမည်။ ကဆောင်သပါသ၏ရည်ရလယ်ချက်မဟာ Travis CI နဟင့် PVS-Studio ၏လုပ်ငန်သဆောင်တာမျာသကို တတ်နိုင်သမျဟ စေ့စေ့စပ်စပ်ခလဲခဌမ်သစိတ်ဖဌာရန်မဟုတ်ဘဲ ပရောဂျက်ကို ခလဲခဌမ်သစိတ်ဖဌာရန်ဖဌစ်သည်။ ပိုကဌီသပဌီသ လဟပတဲ့ အမဟာသတလေကို လိုချင်ရင် သူတို့ကို အမဌဲတမ်သ ချီသကျူသနေနိုင်ပါတယ်။ ဒီမဟာ :)

ကောက်ချက်

ပရောဂျက်မျာသကို တည်ဆောက်ရန်အတလက် ဝဘ်ဝန်ဆောင်မဟုမျာသကို အသုံသပဌုခဌင်သဖဌင့် ကုဒ်ကို ပေါင်သစည်သပဌီသနောက် ချက်ချင်သဆိုသလို ပဌဿနာမျာသစလာကို ရဟာဖလေနိုင်မည်ဖဌစ်သည်။ သို့သော်၊ တည်ဆောက်မဟုတစ်ခုသည် မလုံလောက်နိုင်ပါ၊ ထို့ကဌောင့် static analysis နဟင့် အတူ စမ်သသပ်မဟုကို စနစ်ထည့်သလင်သခဌင်သဖဌင့် ကုဒ်၏ အရည်အသလေသကို သိသိသာသာ တိုသတက်စေမည်ဖဌစ်သည်။

အသုံသဝင်သောလင့်မျာသ

PSP ဂိမ်သကလန်ဆိုသ emulator ၏နမူနာကို အသုံသပဌု၍ Travis CI တလင် PVS-Studio ကို ဘယ်လိုပဌင်ဆင်ရမလဲ။

ကဆောင်သပါသကို အင်္ဂလိပ်စကာသပဌော ပရိသတ်နဟင့် မျဟဝေလိုပါက၊ ဘာသာပဌန်လင့်ခ်- Maxim Zvyagintsev ကို အသုံသပဌုပါ။ PSP ဂိမ်သကလန်ဆိုသ emulator ၏ဥပမာကိုအသုံသပဌု၍ Travis CI တလင် PVS-Studio ကိုမည်သို့တပ်ဆင်နည်သ.

source: www.habr.com

မဟတ်ချက် Add