PSP கேம் கன்சோல் எமுலேட்டரின் உதாரணத்தைப் பயன்படுத்தி டிராவிஸ் CI இல் PVS-ஸ்டுடியோவை எவ்வாறு கட்டமைப்பது

PSP கேம் கன்சோல் எமுலேட்டரின் உதாரணத்தைப் பயன்படுத்தி டிராவிஸ் CI இல் PVS-ஸ்டுடியோவை எவ்வாறு கட்டமைப்பது
டிராவிஸ் CI என்பது GitHub ஐ மூல குறியீடு ஹோஸ்டிங்காகப் பயன்படுத்தும் மென்பொருளை உருவாக்குவதற்கும் சோதனை செய்வதற்கும் விநியோகிக்கப்பட்ட வலைச் சேவையாகும். மேலே உள்ள செயல்பாட்டுக் காட்சிகளுக்கு கூடுதலாக, விரிவான உள்ளமைவு விருப்பங்களுக்கு உங்கள் சொந்த நன்றியைச் சேர்க்கலாம். இந்த கட்டுரையில், PPSSPP குறியீடு உதாரணத்தைப் பயன்படுத்தி PVS-Studio உடன் பணிபுரிய டிராவிஸ் CI ஐ உள்ளமைப்போம்.

அறிமுகம்

டிராவிஸ் சி.ஐ. மென்பொருளை உருவாக்குவதற்கும் சோதனை செய்வதற்கும் ஒரு இணைய சேவையாகும். இது வழக்கமாக தொடர்ச்சியான ஒருங்கிணைப்பு நடைமுறைகளுடன் இணைந்து பயன்படுத்தப்படுகிறது.

PPSSPP — PSP கேம் கன்சோல் முன்மாதிரி. சோனி பிஎஸ்பிக்காக வடிவமைக்கப்பட்ட வட்டு படங்களிலிருந்து எந்த கேம்களின் துவக்கத்தையும் நிரல் பின்பற்ற முடியும். இந்த திட்டம் நவம்பர் 1, 2012 அன்று வெளியிடப்பட்டது. PPSSPP GPL v2 இன் கீழ் உரிமம் பெற்றது. யார் வேண்டுமானாலும் மேம்படுத்தலாம் திட்ட மூல குறியீடு.

பி.வி.எஸ்-ஸ்டுடியோ - நிரல் குறியீட்டில் பிழைகள் மற்றும் சாத்தியமான பாதிப்புகளைத் தேடுவதற்கான நிலையான குறியீடு பகுப்பாய்வி. இந்த கட்டுரையில், ஒரு மாற்றத்திற்காக, நாங்கள் PVS-ஸ்டுடியோவை டெவலப்பரின் கணினியில் உள்நாட்டில் தொடங்கவில்லை, ஆனால் மேகக்கணியில் தொடங்குவோம், மேலும் PPSSPP இல் பிழைகளைத் தேடுவோம்.

டிராவிஸ் CI ஐ அமைத்தல்

நமக்குத் தேவையான திட்டப்பணி அமைந்துள்ள GitHub இல் ஒரு களஞ்சியமும், PVS-Studioக்கான விசையும் தேவைப்படும் (நீங்கள் பெறலாம். சோதனை விசை அல்லது திறந்த மூல திட்டங்களுக்கு இலவசம்).

தளத்திற்கு செல்வோம் டிராவிஸ் சி.ஐ.. உங்கள் GitHub கணக்கைப் பயன்படுத்தி அங்கீகாரம் பெற்ற பிறகு, களஞ்சியங்களின் பட்டியலைக் காண்போம்:

PSP கேம் கன்சோல் எமுலேட்டரின் உதாரணத்தைப் பயன்படுத்தி டிராவிஸ் CI இல் PVS-ஸ்டுடியோவை எவ்வாறு கட்டமைப்பது
சோதனைக்காக, நான் PPSSPP ஐ பிரித்தேன்.

நாங்கள் சேகரிக்க விரும்பும் களஞ்சியத்தை செயல்படுத்துகிறோம்:

PSP கேம் கன்சோல் எமுலேட்டரின் உதாரணத்தைப் பயன்படுத்தி டிராவிஸ் CI இல் PVS-ஸ்டுடியோவை எவ்வாறு கட்டமைப்பது
தற்போது, ​​டிராவிஸ் CI ஆல் எங்கள் திட்டத்தை உருவாக்க முடியாது, ஏனெனில் கட்டிடத்திற்கான வழிமுறைகள் எதுவும் இல்லை. எனவே உள்ளமைவுக்கான நேரம் இது.

பகுப்பாய்வின் போது, ​​சில மாறிகள் நமக்கு பயனுள்ளதாக இருக்கும், எடுத்துக்காட்டாக, PVS-Studio க்கான விசை, இது உள்ளமைவு கோப்பில் குறிப்பிட விரும்பத்தகாததாக இருக்கும். எனவே டிராவிஸ் CI இல் உள்ள உருவாக்க அமைப்புகளைப் பயன்படுத்தி சூழல் மாறிகளைச் சேர்ப்போம்:

PSP கேம் கன்சோல் எமுலேட்டரின் உதாரணத்தைப் பயன்படுத்தி டிராவிஸ் CI இல் PVS-ஸ்டுடியோவை எவ்வாறு கட்டமைப்பது
நாம் வேண்டும்:

  • PVS_USERNAME - பயனர்பெயர்
  • PVS_KEY - விசை
  • MAIL_USER - அறிக்கையை அனுப்பப் பயன்படுத்தப்படும் மின்னஞ்சல்
  • MAIL_PASSWORD - மின்னஞ்சல் கடவுச்சொல்

கடைசி இரண்டு விருப்பமானவை. மின்னஞ்சல் மூலம் முடிவுகளை அனுப்ப இவை பயன்படுத்தப்படும். நீங்கள் அறிக்கையை வேறு வழியில் விநியோகிக்க விரும்பினால், நீங்கள் அவற்றைக் குறிப்பிடத் தேவையில்லை.

எனவே, நமக்குத் தேவையான சுற்றுச்சூழல் மாறிகளைச் சேர்த்துள்ளோம்:

PSP கேம் கன்சோல் எமுலேட்டரின் உதாரணத்தைப் பயன்படுத்தி டிராவிஸ் CI இல் PVS-ஸ்டுடியோவை எவ்வாறு கட்டமைப்பது
இப்போது ஒரு கோப்பை உருவாக்குவோம் .travis.yml மற்றும் அதை திட்டத்தின் மூலத்தில் வைக்கவும். PPSSPP ஏற்கனவே டிராவிஸ் 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

பகுதியைப் பற்றி இன்னும் கொஞ்சம் அணி. டிராவிஸ் CI இல், உருவாக்க விருப்பங்களை உருவாக்க இரண்டு வழிகள் உள்ளன: முதலாவதாக, கம்பைலர்கள், இயக்க முறைமை வகைகள், சூழல் மாறிகள் போன்றவற்றின் பட்டியலைக் குறிப்பிடுவது, அதன் பிறகு சாத்தியமான அனைத்து சேர்க்கைகளின் மேட்ரிக்ஸ் உருவாக்கப்படும்; இரண்டாவது மேட்ரிக்ஸின் வெளிப்படையான அறிகுறியாகும். நிச்சயமாக, நீங்கள் இந்த இரண்டு அணுகுமுறைகளையும் இணைத்து ஒரு தனித்துவமான வழக்கைச் சேர்க்கலாம் அல்லது மாறாக, பிரிவைப் பயன்படுத்தி அதை விலக்கலாம். தவிர்க்க. இதைப் பற்றி நீங்கள் மேலும் படிக்கலாம் டிராவிஸ் 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நாம் மேலே குறிப்பிட்டது. சட்டசபை தானே நடைபெறுகிறது ஸ்கிரிப்ட். எல்லாம் சரியாக நடந்தால், நாம் நம்மைக் கண்டுபிடிப்போம் வெற்றிக்குப் பிறகு (இந்த பிரிவில்தான் நிலையான பகுப்பாய்வை இயக்குவோம்). இவை அனைத்தும் மாற்றியமைக்கக்கூடிய படிகள் அல்ல, உங்களுக்கு மேலும் தேவைப்பட்டால், நீங்கள் பார்க்க வேண்டும் டிராவிஸ் 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
}

இப்போது டிராவிஸ் சிஐயில் பிவிஎஸ்-ஸ்டுடியோவின் தானியங்கி வெளியீட்டை அமைப்பதற்கு நேரடியாக வருகிறோம். முதலில் நாம் கணினியில் 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-ssley-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

குறியீட்டின் இந்த பிரிவில் நாங்கள் அமைத்துள்ளோம் 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 சூழல் மாறிகளை அமைக்கும் போது ஆரம்பத்தில் நாங்கள் குறிப்பிட்ட பயனர்பெயர் மற்றும் விசையிலிருந்து உரிமக் கோப்பை உருவாக்குகிறது.

இரண்டாவது வரி நேரடியாக பகுப்பாய்வு தொடங்குகிறது. கொடி -ஜே பகுப்பாய்வுக்கான நூல்களின் எண்ணிக்கையை அமைக்கிறது, கொடி -எல் உரிமம், கொடி குறிக்கிறது -ஓ பதிவுகளை வெளியிடுவதற்கான கோப்பை மற்றும் கொடியை வரையறுக்கிறது உரிமக் காலாவதி சோதனையை முடக்கு முன்னிருப்பாக, சோதனை பதிப்புகளுக்குத் தேவை pvs-studio-analyzer உரிமம் காலாவதியாகப் போகிறது என்று பயனரை எச்சரிக்கும். இது நிகழாமல் தடுக்க, நீங்கள் இந்தக் கொடியைக் குறிப்பிடலாம்.

பதிவு கோப்பில் மூல வெளியீடு உள்ளது, அதை மாற்றாமல் படிக்க முடியாது, எனவே நீங்கள் முதலில் கோப்பை படிக்கக்கூடியதாக மாற்ற வேண்டும். பதிவுகளை அனுப்புவோம் plog-converter, மற்றும் வெளியீடு ஒரு 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 கேம் கன்சோல் எமுலேட்டரின் உதாரணத்தைப் பயன்படுத்தி டிராவிஸ் CI இல் PVS-ஸ்டுடியோவை எவ்வாறு கட்டமைப்பது
தற்போதைய கட்டமைப்பின் கண்ணோட்டத்தைக் காண்போம்:

PSP கேம் கன்சோல் எமுலேட்டரின் உதாரணத்தைப் பயன்படுத்தி டிராவிஸ் CI இல் PVS-ஸ்டுடியோவை எவ்வாறு கட்டமைப்பது
உருவாக்கம் வெற்றிகரமாக முடிந்தால், நிலையான பகுப்பாய்வின் முடிவுகளுடன் மின்னஞ்சலைப் பெறுவோம். நிச்சயமாக, ஒரு அறிக்கையைப் பெறுவதற்கான ஒரே வழி அஞ்சல் அல்ல. நீங்கள் எந்த செயலாக்க முறையையும் தேர்வு செய்யலாம். ஆனால் உருவாக்கம் முடிந்ததும், மெய்நிகர் இயந்திர கோப்புகளை அணுக முடியாது என்பதை நினைவில் கொள்வது அவசியம்.

பிழை சுருக்கம்

மிகவும் கடினமான பகுதியை வெற்றிகரமாக முடித்துள்ளோம். இப்போது நம் முயற்சிகள் அனைத்தும் மதிப்புக்குரியவை என்பதை உறுதி செய்வோம். அஞ்சல் மூலம் எனக்கு வந்த நிலையான பகுப்பாய்வு அறிக்கையிலிருந்து சில சுவாரஸ்யமான விஷயங்களைப் பார்ப்போம் (நான் அதை சுட்டிக்காட்டியது சும்மா இல்லை).

ஆபத்தான தேர்வுமுறை

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 கம்பைலர் 'மெம்செட்' செயல்பாட்டு அழைப்பை நீக்கலாம், இது 'சம்' பஃபரைப் பறிக்கப் பயன்படுகிறது. தனிப்பட்ட தரவை அழிக்க 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  :}

பட்டியலிலிருந்து பார்க்க முடிந்தால், தொகுப்பாளர் அழைப்பைப் புறக்கணித்தார் மீம்செட். இது செயல்பாட்டில் உள்ள உண்மையின் காரணமாகும் sha1 அழைப்புக்குப் பிறகு மீம்செட் கட்டமைப்பைப் பற்றிய குறிப்பு இல்லை 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-ஸ்டுடியோ எச்சரிக்கை: V547 வெளிப்பாடு 'leftvol >= 0' எப்போதும் உண்மை. sceAudio.cpp 120

முதல் மற்ற கிளைக்கு கவனம் செலுத்துங்கள் if. அனைத்து நிபந்தனைகளும் இருந்தால் மட்டுமே குறியீடு செயல்படுத்தப்படும் leftvol > 0xFFFF || rightvol > 0xFFFF || leftvol < 0 || rightvol <0 பொய்யாக மாறிவிடும். எனவே, பின்வரும் அறிக்கைகளைப் பெறுகிறோம், இது மற்ற கிளைக்கு உண்மையாக இருக்கும்: leftvol <= 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. முகவரி செல்லுபடியாகுமா என்று நாங்கள் பார்ப்பது விசித்திரமாகத் தெரியவில்லையா? 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-ஸ்டுடியோ எச்சரிக்கை: V547 வெளிப்பாடு 'அளவு == 8' எப்போதும் தவறானது. syn-att.c 195

இந்த பிழை கோப்புறையில் உள்ளது நீடிப்பு, எனவே திட்டத்திற்கு உண்மையில் பொருந்தவில்லை, ஆனால் நான் அதை கவனிப்பதற்கு முன்பே பிழை கண்டுபிடிக்கப்பட்டது, எனவே அதை விட்டுவிட முடிவு செய்தேன். எல்லாவற்றிற்கும் மேலாக, இந்த கட்டுரை பிழைகளை மதிப்பாய்வு செய்வது பற்றியது அல்ல, ஆனால் டிராவிஸ் CI உடனான ஒருங்கிணைப்பு பற்றியது, மேலும் பகுப்பாய்வியின் எந்த கட்டமைப்பும் மேற்கொள்ளப்படவில்லை.

மாறி அளவு ஒரு மாறிலி மூலம் துவக்கப்பட்டது, இருப்பினும், இது குறியீட்டில், ஆபரேட்டர் வரை பயன்படுத்தப்படவே இல்லை if, இது, நிச்சயமாக, கொடுக்கிறது தவறான நிபந்தனைகளை சரிபார்க்கும் போது, ​​ஏனெனில், நாம் நினைவில் வைத்திருப்பது போல், அளவு பூஜ்ஜியத்திற்கு சமம். அடுத்தடுத்த சோதனைகளும் அர்த்தமற்றவை.

வெளிப்படையாக, குறியீடு துண்டின் ஆசிரியர் மாறியை மேலெழுத மறந்துவிட்டார் அளவு அதற்கு முன்.

நிறுத்து

இங்குதான் நாம் தவறுகளுடன் முடிப்போம். இந்தக் கட்டுரையின் நோக்கம், டிராவிஸ் CI உடன் இணைந்து PVS-ஸ்டுடியோவின் பணியை நிரூபிப்பதே தவிர, திட்டத்தை முடிந்தவரை முழுமையாக பகுப்பாய்வு செய்வதல்ல. நீங்கள் பெரிய மற்றும் அழகான தவறுகளை விரும்பினால், நீங்கள் எப்போதும் அவற்றைப் பாராட்டலாம் இங்கே :)

முடிவுக்கு

இணைய சேவைகளைப் பயன்படுத்தி திட்டப்பணிகளை உருவாக்குவதன் மூலம், குறியீட்டை இணைத்த உடனேயே பல சிக்கல்களைக் கண்டறியலாம். இருப்பினும், ஒரு உருவாக்கம் போதுமானதாக இருக்காது, எனவே நிலையான பகுப்பாய்வுடன் சோதனையை அமைப்பது குறியீட்டின் தரத்தை கணிசமாக மேம்படுத்தும்.

பயனுள்ள இணைப்புகள்

PSP கேம் கன்சோல் எமுலேட்டரின் உதாரணத்தைப் பயன்படுத்தி டிராவிஸ் CI இல் PVS-ஸ்டுடியோவை எவ்வாறு கட்டமைப்பது

இந்தக் கட்டுரையை ஆங்கிலம் பேசும் பார்வையாளர்களுடன் பகிர்ந்து கொள்ள விரும்பினால், மொழிபெயர்ப்பு இணைப்பைப் பயன்படுத்தவும்: Maxim Zvyagintsev. PSP கேம் கன்சோல் எமுலேட்டரின் உதாரணத்தைப் பயன்படுத்தி டிராவிஸ் CI இல் PVS-ஸ்டுடியோவை எவ்வாறு அமைப்பது.

ஆதாரம்: www.habr.com

கருத்தைச் சேர்