පීඑස්පී ක්‍රීඩා කොන්සෝල ඉමුලේටරයක උදාහරණය භාවිතයෙන් ට්‍රැවිස් සීඅයි හි පීවීඑස්-ස්ටුඩියෝ වින්‍යාස කරන්නේ කෙසේද

පීඑස්පී ක්‍රීඩා කොන්සෝල ඉමුලේටරයක උදාහරණය භාවිතයෙන් ට්‍රැවිස් සීඅයි හි පීවීඑස්-ස්ටුඩියෝ වින්‍යාස කරන්නේ කෙසේද
Travis CI යනු GitHub ප්‍රභව කේත සත්කාරකත්වය ලෙස භාවිතා කරන මෘදුකාංග තැනීම සහ පරීක්ෂා කිරීම සඳහා බෙදා හරින ලද වෙබ් සේවාවකි. ඉහත මෙහෙයුම් අවස්ථා වලට අමතරව, ඔබට විස්තීර්ණ වින්‍යාස විකල්ප සඳහා ඔබේම ස්තුතිය එක් කළ හැකිය. මෙම ලිපියෙන් අපි PPSSPP කේත උදාහරණය භාවිතා කරමින් PVS-Studio සමඟ වැඩ කිරීමට Travis CI වින්‍යාස කරමු.

හැඳින්වීම

ට්‍රැවිස් සීඅයි මෘදුකාංග ගොඩනැගීම සහ පරීක්ෂා කිරීම සඳහා වන වෙබ් සේවාවකි. එය සාමාන්‍යයෙන් අඛණ්ඩ ඒකාබද්ධතා භාවිතයන් සමඟ ඒකාබද්ධව භාවිතා වේ.

පීපීඑස්එස්පීපී - PSP ක්‍රීඩා කොන්සෝල ඉමුලේටරය. Sony PSP සඳහා අදහස් කරන ලද තැටි රූප වලින් ඕනෑම ක්රීඩාවක් දියත් කිරීම අනුකරණය කිරීමට මෙම වැඩසටහනට හැකි වේ. මෙම වැඩසටහන 1 නොවැම්බර් 2012 වන දින නිකුත් කරන ලදී. PPSSPP GPL v2 යටතේ බලපත්‍ර ලබා ඇත. ඕනෑම කෙනෙකුට වැඩිදියුණු කිරීම් කළ හැකිය ව්යාපෘති මූලාශ්ර කේතය.

පීවීඑස්-ස්ටුඩියෝ - වැඩසටහන් කේතයේ දෝෂ සහ විභව අවදානම් සෙවීම සඳහා ස්ථිතික කේත විශ්ලේෂකය. මෙම ලිපියෙහි, වෙනසක් සඳහා, අපි PVS-Studio දේශීයව සංවර්ධකයාගේ යන්ත්‍රයේ නොව වලාකුළෙහි දියත් කර PPSSPP හි දෝෂ සොයන්නෙමු.

Travis CI පිහිටුවීම

අපට අවශ්‍ය ව්‍යාපෘතිය පිහිටා ඇති GitHub හි ගබඩාවක් මෙන්ම PVS-Studio සඳහා යතුරක් අපට අවශ්‍ය වනු ඇත (ඔබට ලබාගත හැක. අත්හදා බැලීමේ යතුර හෝ විවෘත මූලාශ්‍ර ව්‍යාපෘති සඳහා නොමිලේ).

අපි සයිට් එකට යමු ට්‍රැවිස් සීඅයි. ඔබගේ GitHub ගිණුම භාවිතා කිරීමට අවසර දීමෙන් පසුව, අපි ගබඩා ලැයිස්තුවක් දකිමු:

පීඑස්පී ක්‍රීඩා කොන්සෝල ඉමුලේටරයක උදාහරණය භාවිතයෙන් ට්‍රැවිස් සීඅයි හි පීවීඑස්-ස්ටුඩියෝ වින්‍යාස කරන්නේ කෙසේද
පරීක්ෂණය සඳහා, මම PPSSPP ෆෝක් කළා.

අපට එකතු කිරීමට අවශ්‍ය ගබඩාව අපි සක්‍රිය කරමු:

පීඑස්පී ක්‍රීඩා කොන්සෝල ඉමුලේටරයක උදාහරණය භාවිතයෙන් ට්‍රැවිස් සීඅයි හි පීවීඑස්-ස්ටුඩියෝ වින්‍යාස කරන්නේ කෙසේද
මේ මොහොතේ, ට්‍රැවිස් සීඅයිට අපගේ ව්‍යාපෘතිය ගොඩනඟා ගත නොහැක, මන්ද ගොඩනැගීම සඳහා උපදෙස් නොමැත. එබැවින් එය වින්‍යාස කිරීමට කාලයයි.

විශ්ලේෂණය අතරතුර, සමහර විචල්යයන් අපට ප්රයෝජනවත් වනු ඇත, උදාහරණයක් ලෙස, PVS-Studio සඳහා යතුර, වින්යාස ගොනුවේ සඳහන් කිරීමට නුසුදුසු වනු ඇත. එබැවින් ට්‍රැවිස් සීඅයි හි ගොඩනැගීමේ සැකසුම් භාවිතා කර පරිසර විචල්‍ය එකතු කරමු:

පීඑස්පී ක්‍රීඩා කොන්සෝල ඉමුලේටරයක උදාහරණය භාවිතයෙන් ට්‍රැවිස් සීඅයි හි පීවීඑස්-ස්ටුඩියෝ වින්‍යාස කරන්නේ කෙසේද
අපට අවශ්‍ය වනු ඇත:

  • PVS_USERNAME - පරිශීලක නාමය
  • PVS_KEY - යතුර
  • MAIL_USER - වාර්තාව යැවීමට භාවිතා කරන විද්‍යුත් තැපෑල
  • MAIL_PASSWORD - ඊමේල් මුරපදය

අවසාන දෙක විකල්ප වේ. මේවා තැපෑලෙන් ප්‍රතිඵල යැවීමට භාවිත කරනු ඇත. ඔබට වාර්තාව වෙනත් ආකාරයකින් බෙදා හැරීමට අවශ්‍ය නම්, ඔබට ඒවා සඳහන් කිරීමට අවශ්‍ය නොවේ.

එබැවින්, අපට අවශ්‍ය පරිසර විචල්‍යයන් අපි එකතු කර ඇත්තෙමු:

පීඑස්පී ක්‍රීඩා කොන්සෝල ඉමුලේටරයක උදාහරණය භාවිතයෙන් ට්‍රැවිස් සීඅයි හි පීවීඑස්-ස්ටුඩියෝ වින්‍යාස කරන්නේ කෙසේද
දැන් අපි file එකක් හදමු .travis.yml සහ එය ව්යාපෘතියේ මූලයේ තබන්න. PPSSPP සතුව දැනටමත් ට්‍රැවිස් සීඅයි සඳහා වින්‍යාස ගොනුවක් තිබුණි, කෙසේ වෙතත්, එය ඉතා විශාල වූ අතර උදාහරණයට සම්පූර්ණයෙන්ම නොගැලපෙන බැවින් අපට එය බෙහෙවින් සරල කර මූලික අංග පමණක් ඉතිරි කිරීමට සිදු විය.

පළමුව, අපි අථත්‍ය යන්ත්‍රයේ භාවිතා කිරීමට අවශ්‍ය භාෂාව, උබුන්ටු ලිනක්ස් අනුවාදය සහ ගොඩනැගීම සඳහා අවශ්‍ය පැකේජ සඳහන් කරමු:

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

කොටස ගැන තව ටිකක් අනුකෘතියයි. ට්‍රැවිස් සීඅයි හි, ගොඩ නැගීමේ විකල්ප නිර්මාණය කිරීමට ක්‍රම දෙකක් තිබේ: පළමුවැන්න නම් සම්පාදක ලැයිස්තුවක්, මෙහෙයුම් පද්ධති වර්ග, පරිසර විචල්‍යයන් යනාදිය සඳහන් කිරීමයි, ඉන් පසුව හැකි සියලුම සංයෝජනවල න්‍යාසයක් ජනනය වේ; දෙවැන්න අනුකෘතියේ පැහැදිලි ඇඟවීමකි. ඇත්ත වශයෙන්ම, ඔබට මෙම ප්‍රවේශයන් දෙක ඒකාබද්ධ කර අද්විතීය නඩුවක් එක් කළ හැකිය, නැතහොත්, ඊට පටහැනිව, කොටස භාවිතයෙන් එය බැහැර කරන්න බැහැර කරයි. ඔබට මේ ගැන වැඩිදුර කියවිය හැකිය ට්‍රැවිස් සීඅයි ලියකියවිලි.

ඉතිරිව ඇත්තේ ව්‍යාපෘති-විශේෂිත එකලස් කිරීමේ උපදෙස් සැපයීම පමණි:

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

පැකේජ ස්ථාපනය කිරීමට පෙර, අපි උප මොඩියුල යාවත්කාලීන කරන්නෙමු. 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 අගය ගබඩා කරයි ඔව් (අපි එය කොටසේ දක්වා ඇත දළ වශයෙන් ගොඩනැගීමේ matrix වින්‍යාසය අතරතුර), අපි පැකේජය ස්ථාපනය කරමු pvs-studio. මීට අමතරව, පැකේජ ද දක්වනු ලැබේ libio-socket-ssl-perl и libnet-ssley-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 සම්පාදන විධාන අපනයනය සඳහා ධජය. ස්ථිතික කේත විශ්ලේෂකය සඳහා මෙය අවශ්ය වේ. ඔබට මේ ගැන වැඩි විස්තර ලිපියෙන් කියවිය හැකිය "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

පළමු පේළිය ට්‍රැවිස් සීඅයි පරිසර විචල්‍යයන් පිහිටුවීමේදී අප ආරම්භයේදීම සඳහන් කළ පරිශීලක නාමය සහ යතුරෙන් බලපත්‍ර ගොනුවක් ජනනය කරයි.

දෙවන පේළිය විශ්ලේෂණය කෙලින්ම ආරම්භ කරයි. ධජ -ජේ විශ්ලේෂණය සඳහා නූල් ගණන සකසයි, ධජය -එල් බලපත්රය, ධජය පෙන්නුම් කරයි -o ලඝු-සටහන් ප්‍රතිදානය සඳහා ගොනුව සහ ධජය නිර්වචනය කරයි - disableLicense Expiration Check පෙරනිමියෙන් සිට අත්හදා බැලීම් අනුවාද සඳහා අවශ්‍ය වේ pvs-studio-analyzer බලපත්‍රය කල් ඉකුත් වීමට ආසන්න බව පරිශීලකයාට අනතුරු අඟවයි. මෙය සිදුවීම වලක්වා ගැනීම සඳහා, ඔබට මෙම ධජය නියම කළ හැක.

ලොග් ගොනුවේ පරිවර්තනයකින් තොරව කියවිය නොහැකි raw output අඩංගු වේ, එබැවින් ඔබ ප්‍රථමයෙන් ගොනුව කියවිය හැකි බවට පත් කළ යුතුය. අපි ලඝු-සටහන් හරහා යමු ප්ලොග්-පරිවර්තකය, සහ ප්‍රතිදානය 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 ගබඩාවට තල්ලු කිරීමට කාලයයි, ඉන්පසු ට්‍රැවිස් සීඅයි ස්වයංක්‍රීයව ගොඩනැගීම ක්‍රියාත්මක කරයි. ගොඩනැගීමේ වාර්තා වෙත යාමට "ppsspp" මත ක්ලික් කරන්න:

පීඑස්පී ක්‍රීඩා කොන්සෝල ඉමුලේටරයක උදාහරණය භාවිතයෙන් ට්‍රැවිස් සීඅයි හි පීවීඑස්-ස්ටුඩියෝ වින්‍යාස කරන්නේ කෙසේද
වත්මන් ගොඩනැගීම පිළිබඳ දළ විශ්ලේෂණයක් අපි දකිමු:

පීඑස්පී ක්‍රීඩා කොන්සෝල ඉමුලේටරයක උදාහරණය භාවිතයෙන් ට්‍රැවිස් සීඅයි හි පීවීඑස්-ස්ටුඩියෝ වින්‍යාස කරන්නේ කෙසේද
ගොඩනැගීම සාර්ථකව නිම කළහොත්, ස්ථිතික විශ්ලේෂණයේ ප්‍රතිඵල සහිත විද්‍යුත් තැපෑලක් අපට ලැබෙනු ඇත. ඇත්ත වශයෙන්ම, වාර්තාවක් ලැබීමට ඇති එකම මාර්ගය තැපැල් කිරීම නොවේ. ඔබට ඕනෑම ක්රියාත්මක කිරීමේ ක්රමයක් තෝරා ගත හැකිය. නමුත් මතක තබා ගැනීම වැදගත් වන්නේ ගොඩනැගීම අවසන් වූ පසු, අථත්‍ය යන්ත්‍ර ගොනු වෙත ප්‍රවේශ වීමට නොහැකි වනු ඇති බවයි.

දෝෂ සාරාංශය

අපි අමාරුම කොටස සාර්ථකව නිම කළා. දැන් අපි අපේ සියලු උත්සාහයන් වටින බව සහතික කරමු. තැපෑලෙන් මා වෙත පැමිණි ස්ථිතික විශ්ලේෂණ වාර්තාවෙන් රසවත් කරුණු කිහිපයක් බලමු (මා එය ඇඟවුම් කළේ නිකම්ම නොවේ).

භයානක ප්රශස්තකරණය

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

මෙම කේත කොටස ආරක්ෂිත හැෂිං මොඩියුලයේ පිහිටා ඇත, කෙසේ වෙතත්, එහි බරපතල ආරක්ෂක දෝෂයක් අඩංගු වේ (සතොස-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 || leftvol < 0 || rightvol < 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. අපි ලිපිනය වලංගු දැයි පරීක්ෂා කිරීම අමුතු දෙයක් යැයි ඔබට සිතෙන්නේ නැද්ද? 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

මෙම දෝෂය ෆෝල්ඩරයේ පිහිටා ඇත එම්, ඒ නිසා ඇත්තටම ව්‍යාපෘතියට අදාළ නැහැ, නමුත් මම එය දැකීමට පෙර දෝෂය සොයා ගත්තා, ඒ නිසා මම එය අත්හැරීමට තීරණය කළා. සියල්ලට පසු, මෙම ලිපිය දෝෂ සමාලෝචනය කිරීම ගැන නොව, ට්‍රැවිස් සීඅයි සමඟ ඒකාබද්ධ කිරීම ගැන වන අතර, විශ්ලේෂකයේ වින්‍යාස කිරීමක් සිදු කර නොමැත.

විචල්ය විශාලත්වය නියතයක් මඟින් ආරම්භ කර ඇත, කෙසේ වෙතත්, එය ක්‍රියාකරු දක්වාම කේතයේ කිසිසේත් භාවිතා නොවේ if, එය, ඇත්ත වශයෙන්ම, ලබා දෙයි බොරු කොන්දේසි පරීක්ෂා කිරීමේදී, මන්ද, අපට මතක ඇති පරිදි, විශාලත්වය ශුන්යයට සමාන වේ. පසුකාලීන චෙක්පත්වල තේරුමක් නැත.

පෙනෙන විදිහට, කේත කොටසේ කතුවරයාට විචල්‍යය නැවත ලිවීමට අමතක විය විශාලත්වය ඊට කලින්.

නවත්වන්න

අපි බොහෝ විට වැරදි වලින් අවසන් වනු ඇත්තේ මෙතැනිනි. මෙම ලිපියේ අරමුණ ට්‍රැවිස් සීඅයි සමඟ එක්ව PVS-Studio හි වැඩ නිරූපණය කිරීම මිස ව්‍යාපෘතිය හැකිතාක් තරයේ විශ්ලේෂණය කිරීම නොවේ. ඔබට විශාල හා ලස්සන වැරදි අවශ්‍ය නම්, ඔබට සැමවිටම ඒවා අගය කළ හැකිය මෙහි :).

නිගමනය

වර්ධක විශ්ලේෂණ භාවිතය සමඟ එක්ව ව්‍යාපෘති තැනීමට වෙබ් සේවා භාවිතා කිරීමෙන් කේතය ඒකාබද්ධ කිරීමෙන් පසු බොහෝ ගැටලු සොයා ගැනීමට ඔබට ඉඩ සලසයි. කෙසේ වෙතත්, එක් ගොඩනැගීමක් ප්‍රමාණවත් නොවිය හැක, එබැවින් ස්ථිතික විශ්ලේෂණය සමඟ එක්ව පරීක්ෂණ සැකසීම කේතයේ ගුණාත්මක භාවය සැලකිය යුතු ලෙස වැඩිදියුණු කරනු ඇත.

ප්රයෝජනවත් සබැඳි

පීඑස්පී ක්‍රීඩා කොන්සෝල ඉමුලේටරයක උදාහරණය භාවිතයෙන් ට්‍රැවිස් සීඅයි හි පීවීඑස්-ස්ටුඩියෝ වින්‍යාස කරන්නේ කෙසේද

ඔබට මෙම ලිපිය ඉංග්‍රීසි කතා කරන ප්‍රේක්ෂකයින් සමඟ බෙදා ගැනීමට අවශ්‍ය නම්, කරුණාකර පරිවර්තන සබැඳිය භාවිතා කරන්න: Maxim Zvyagintsev. පීඑස්පී ක්‍රීඩා කොන්සෝල ඉමුලේටරයේ උදාහරණය භාවිතා කරමින් ට්‍රැවිස් සීඅයි හි පීවීඑස්-ස්ටුඩියෝ සකසන්නේ කෙසේද.

මූලාශ්රය: www.habr.com

අදහස් එක් කරන්න