የ PSP ጌም ኮንሶል ኢምዩተርን ምሳሌ በመጠቀም በ Travis CI ውስጥ PVS-Studioን እንዴት ማዋቀር እንደሚቻል

የ PSP ጌም ኮንሶል ኢምዩተርን ምሳሌ በመጠቀም በ Travis CI ውስጥ PVS-Studioን እንዴት ማዋቀር እንደሚቻል
Travis CI GitHubን እንደ ምንጭ ኮድ ማስተናገጃ የሚጠቀም ሶፍትዌር ለመገንባት እና ለመሞከር የሚሰራጭ የድር አገልግሎት ነው። ከላይ ከተዘረዘሩት የአሠራር ሁኔታዎች በተጨማሪ ለሰፊው የማዋቀር አማራጮች የራስዎን ምስጋና ማከል ይችላሉ። በዚህ ጽሑፍ ውስጥ የ PPSSPP ኮድ ምሳሌን በመጠቀም ከ PVS-ስቱዲዮ ጋር ለመስራት Travis CI ን እናዋቅራለን።

መግቢያ

Travis CI የሶፍትዌር ግንባታ እና የሙከራ ድር አገልግሎት ነው። ብዙውን ጊዜ ከተከታታይ ውህደት ልምዶች ጋር አብሮ ጥቅም ላይ ይውላል.

PPSSPP - PSP ጨዋታ መሥሪያ emulator. ፕሮግራሙ ለ Sony PSP የታቀዱ የዲስክ ምስሎችን ማንኛውንም ጨዋታዎች ማስጀመርን መኮረጅ ይችላል። ፕሮግራሙ ህዳር 1 ቀን 2012 ተለቀቀ። PPSSPP በGPL v2 ፍቃድ ተሰጥቶታል። ማንኛውም ሰው ማሻሻያ ማድረግ ይችላል። የፕሮጀክት ምንጭ ኮድ.

PVS- ስቱዲዮ - በፕሮግራም ኮድ ውስጥ ስህተቶችን እና ሊሆኑ የሚችሉ ተጋላጭነቶችን ለመፈለግ የማይንቀሳቀስ ኮድ ተንታኝ። በዚህ ጽሑፍ ውስጥ, ለለውጥ, PVS-Studioን በአገር ውስጥ በገንቢው ማሽን ላይ ሳይሆን በደመና ውስጥ እናስነሳለን እና በ PPSSPP ውስጥ ስህተቶችን እንፈልጋለን.

Travis CI በማዘጋጀት ላይ

የምንፈልገው ፕሮጀክት የሚገኝበት በ GitHub ላይ ማከማቻ እና እንዲሁም ለ PVS-ስቱዲዮ ቁልፍ (እርስዎ ማግኘት ይችላሉ) እንፈልጋለን። የሙከራ ቁልፍ ወይም ለክፍት ምንጭ ፕሮጀክቶች ነፃ).

ወደ ጣቢያው እንሂድ Travis CI. የ GitHub መለያዎን ተጠቅመን ፍቃድ ከሰጠ በኋላ፣የማከማቻዎች ዝርዝር እናያለን፡-

የ PSP ጌም ኮንሶል ኢምዩተርን ምሳሌ በመጠቀም በ Travis CI ውስጥ PVS-Studioን እንዴት ማዋቀር እንደሚቻል
ለፈተናው፣ PPSSPPን ሹካ አደረግሁ።

ለመሰብሰብ የምንፈልገውን ማከማቻ እናነቃለን፡-

የ PSP ጌም ኮንሶል ኢምዩተርን ምሳሌ በመጠቀም በ Travis CI ውስጥ PVS-Studioን እንዴት ማዋቀር እንደሚቻል
በአሁኑ ጊዜ, Travis CI የእኛን ፕሮጀክት መገንባት አይችልም, ምክንያቱም ለመገንባት ምንም መመሪያ የለም. ስለዚህ ለማዋቀር ጊዜው አሁን ነው።

በመተንተን ወቅት, አንዳንድ ተለዋዋጮች ለእኛ ጠቃሚ ይሆናሉ, ለምሳሌ, የ PVS-Studio ቁልፍ, በማዋቀሪያው ፋይል ውስጥ ለመጥቀስ የማይፈለግ ነው. ስለዚህ በ Travis CI ውስጥ ያለውን የግንባታ መቼቶች በመጠቀም የአካባቢ ተለዋዋጮችን እንጨምር፡-

የ PSP ጌም ኮንሶል ኢምዩተርን ምሳሌ በመጠቀም በ Travis CI ውስጥ PVS-Studioን እንዴት ማዋቀር እንደሚቻል
ያስፈልገናል:

  • PVS_USERNAME - የተጠቃሚ ስም
  • PVS_KEY - ቁልፍ
  • MAIL_USER - ሪፖርቱን ለመላክ የሚያገለግል ኢሜይል
  • MAIL_PASSWORD - የኢሜይል ይለፍ ቃል

የመጨረሻዎቹ ሁለቱ አማራጭ ናቸው። እነዚህ ውጤቶች በፖስታ ለመላክ ጥቅም ላይ ይውላሉ። ሪፖርቱን በሌላ መንገድ ማሰራጨት ከፈለጉ እነሱን ማመላከት አያስፈልግም።

ስለዚህ፣ የምንፈልጋቸውን የአካባቢ ተለዋዋጮች ጨምረናል፡-

የ PSP ጌም ኮንሶል ኢምዩተርን ምሳሌ በመጠቀም በ Travis CI ውስጥ PVS-Studioን እንዴት ማዋቀር እንደሚቻል
አሁን ፋይል እንፍጠር .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-ስቱዲዮ ፓኬጅ በስርዓቱ ላይ መጫን አለብን:

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 ዋጋን ያከማቻል አዎ (በክፍል ውስጥ አመልክተናል appro በግንባታ ማትሪክስ ውቅር ወቅት), ጥቅሉን እንጭነዋለን pvs-ስቱዲዮ. ከዚህ በተጨማሪ ፓኬጆችም ይጠቁማሉ ሊቢዮ-ሶኬት-ኤስኤስኤል-ፐርል и 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

በዚህ የኮድ ክፍል ውስጥ አዘጋጅተናል ማድረግ የማጠናቀር ትዕዛዞችን ወደ ውጭ ለመላክ ባንዲራ። ይህ ለስታቲክ ኮድ ተንታኝ አስፈላጊ ነው። ስለዚህ ጉዳይ በጽሁፉ ውስጥ የበለጠ ማንበብ ይችላሉ ።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

የመጀመሪያው መስመር የ Travis CI አካባቢ ተለዋዋጮችን በማዘጋጀት መጀመሪያ ላይ ከገለጽነው የተጠቃሚ ስም እና ቁልፍ የፍቃድ ፋይል ያመነጫል።

ሁለተኛው መስመር ትንታኔውን በቀጥታ ይጀምራል. ባንዲራ -ጄ ለመተንተን የክሮች ብዛት ያዘጋጃል, ባንዲራ -ኤል ፈቃድ, ባንዲራ ያመለክታል -ኦ መዝገቦችን ለማውጣት ፋይሉን እና ባንዲራውን ይገልጻል -የLicenseExpirationCheckን አሰናክል በነባሪነት ለሙከራ ስሪቶች ያስፈልጋል pvs-ስቱዲዮ-ተንታኝ ፈቃዱ ሊያልቅ መሆኑን ለተጠቃሚው ያስጠነቅቃል። ይህ እንዳይከሰት ለመከላከል ይህንን ባንዲራ መግለጽ ይችላሉ።

የምዝግብ ማስታወሻው ሳይለወጥ የማይነበብ ጥሬ ውፅዓት ስላለው መጀመሪያ ፋይሉን የሚነበብ ማድረግ አለቦት። መዝገቦችን እናሳልፍ ፕላግ-መቀየሪያ፣ እና ውጤቱ የኤችቲኤምኤል ፋይል ነው።

በዚህ ምሳሌ, ትዕዛዙን ተጠቅሜ ሪፖርቶችን በፖስታ ለመላክ ወሰንኩ መላክ.

በውጤቱም, የሚከተለውን ፋይል አግኝተናል .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» ላይ ጠቅ ያድርጉ፡-

የ PSP ጌም ኮንሶል ኢምዩተርን ምሳሌ በመጠቀም በ Travis CI ውስጥ PVS-Studioን እንዴት ማዋቀር እንደሚቻል
የአሁኑን ግንባታ አጠቃላይ እይታ እንመለከታለን፡-

የ PSP ጌም ኮንሶል ኢምዩተርን ምሳሌ በመጠቀም በ 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 አቀናባሪው የ'ssum' bufferን ለማጠብ የሚያገለግለውን የ'memset' ተግባር ጥሪን ሊሰርዝ ይችላል። የ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 ከጥሪው በኋላ ማስታወሻ ስለ መዋቅር ምንም ተጨማሪ ማጣቀሻ የለም ሲቲክስ. ስለዚህ, አቀናባሪው ለወደፊቱ ጥቅም ላይ ያልዋለ ማህደረ ትውስታን በመተካት የሂደቱን ጊዜ ማባከን ምንም ፋይዳ አይኖረውም. ተግባሩን በመጠቀም ይህንን ማስተካከል ይችላሉ። 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 'ግራ ቮል >= 0' የሚለው አገላለጽ ሁሌም እውነት ነው። sceAudio.cpp 120

ለመጀመሪያው ለሌላው ቅርንጫፍ ትኩረት ይስጡ if. ኮዱ የሚፈጸመው ሁሉም ሁኔታዎች ሲኖሩ ብቻ ነው። ግራቮል > 0xFFFF || rightvol> 0xFFFF || ግራቮል <0 || ቀኝቮል <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-ስቱዲዮ ማስጠንቀቂያ፡- V547 'መጠን == 8' የሚለው አገላለጽ ሁልጊዜ ሐሰት ነው። syn-att.c 195

ይህ ስህተት በአቃፊው ውስጥ ይገኛል። ስ, ስለዚህ ከፕሮጀክቱ ጋር በትክክል አልተዛመደም, ነገር ግን ስህተቱ ከመታየቴ በፊት ተገኝቷል, ስለዚህ እሱን ለመተው ወሰንኩ. ከሁሉም በላይ, ይህ ጽሑፍ ስህተቶችን ለመገምገም አይደለም, ነገር ግን ከ Travis CI ጋር ስለመዋሃድ ነው, እና የመተንተን ውቅር አልተሰራም.

ተለዋዋጭ ልክ በቋሚ ተጀምሯል, ነገር ግን በኮዱ ውስጥ እስከ ኦፕሬተሩ ድረስ ሙሉ በሙሉ ጥቅም ላይ አይውልም if, እሱም, በእርግጥ, ይሰጣል የሐሰት ሁኔታዎችን በሚፈትሹበት ጊዜ, ምክንያቱም እንደምናስታውሰው, ልክ ከዜሮ ጋር እኩል ነው። ቀጣይ ቼኮችም ምንም ትርጉም የላቸውም.

በግልጽ ለማየት እንደሚቻለው, የኮድ ቁርጥራጭ ደራሲው ተለዋዋጭውን እንደገና መፃፍ ረስቷል ልክ ከዚያ በፊት.

ተወ

በስህተቶቹ የምንጨርሰው እዚህ ላይ ነው። የዚህ ጽሑፍ ዓላማ የ PVS-ስቱዲዮን ሥራ ከ Travis CI ጋር ለማሳየት ነው, እና ፕሮጀክቱን በተቻለ መጠን በጥልቀት ለመተንተን አይደለም. ትልልቅ እና የሚያምሩ ስህተቶችን ከፈለጉ ሁል ጊዜ ማድነቅ ይችላሉ። እዚህ :) ፡፡

መደምደሚያ

የድረ-ገጽ አገልግሎቶችን በመጠቀም ፕሮጄክቶችን ለመገንባት ከተጨማሪ ትንተና ልምምድ ጋር ኮድ ከተዋሃዱ በኋላ ወዲያውኑ ብዙ ችግሮችን እንዲያገኙ ያስችልዎታል። ሆኖም አንድ ግንባታ በቂ ላይሆን ይችላል፣ ስለዚህ ሙከራን ከስታቲክ ትንታኔ ጋር ማዋቀር የኮዱን ጥራት በእጅጉ ያሻሽላል።

ጠቃሚ አገናኞች

የ PSP ጌም ኮንሶል ኢምዩተርን ምሳሌ በመጠቀም በ Travis CI ውስጥ PVS-Studioን እንዴት ማዋቀር እንደሚቻል

ይህን ጽሑፍ ለእንግሊዝኛ ተናጋሪ ታዳሚዎች ማጋራት ከፈለጉ እባክዎን የትርጉም ማገናኛን ይጠቀሙ፡ Maxim Zvyagintsev። የ PSP ጌም ኮንሶል ኢምዩተርን ምሳሌ በመጠቀም በ Travis CI ውስጥ PVS-Studioን እንዴት ማዋቀር እንደሚቻል.

ምንጭ: hab.com

አስተያየት ያክሉ