PSP గేమ్ కన్సోల్ ఎమ్యులేటర్ యొక్క ఉదాహరణను ఉపయోగించి ట్రావిస్ CIలో PVS-స్టూడియోను ఎలా కాన్ఫిగర్ చేయాలి

PSP గేమ్ కన్సోల్ ఎమ్యులేటర్ యొక్క ఉదాహరణను ఉపయోగించి ట్రావిస్ CIలో PVS-స్టూడియోను ఎలా కాన్ఫిగర్ చేయాలి
ట్రావిస్ CI అనేది GitHubని సోర్స్ కోడ్ హోస్టింగ్‌గా ఉపయోగించే సాఫ్ట్‌వేర్‌ను నిర్మించడం మరియు పరీక్షించడం కోసం పంపిణీ చేయబడిన వెబ్ సేవ. పై ఆపరేటింగ్ దృశ్యాలకు అదనంగా, మీరు విస్తృతమైన కాన్ఫిగరేషన్ ఎంపికలకు మీ స్వంత ధన్యవాదాలు జోడించవచ్చు. ఈ కథనంలో మేము PPSSPP కోడ్ ఉదాహరణను ఉపయోగించి PVS-స్టూడియోతో పని చేయడానికి ట్రావిస్ CIని కాన్ఫిగర్ చేస్తాము.

పరిచయం

ట్రావిస్ సిఐ సాఫ్ట్‌వేర్‌ను నిర్మించడం మరియు పరీక్షించడం కోసం ఒక వెబ్ సేవ. ఇది సాధారణంగా నిరంతర ఏకీకరణ పద్ధతులతో కలిపి ఉపయోగించబడుతుంది.

PPSSPP - PSP గేమ్ కన్సోల్ ఎమ్యులేటర్. ప్రోగ్రామ్ సోనీ PSP కోసం ఉద్దేశించిన డిస్క్ చిత్రాల నుండి ఏదైనా గేమ్‌ల ప్రారంభాన్ని అనుకరించగలదు. ఈ కార్యక్రమం నవంబర్ 1, 2012న విడుదలైంది. PPSSPP GPL v2 కింద లైసెన్స్ పొందింది. ఎవరైనా మెరుగుదలలు చేయవచ్చు ప్రాజెక్ట్ సోర్స్ కోడ్.

పివిఎస్-స్టూడియో — ప్రోగ్రామ్ కోడ్‌లో లోపాలు మరియు సంభావ్య దుర్బలత్వాల కోసం శోధించడానికి స్టాటిక్ కోడ్ ఎనలైజర్. ఈ కథనంలో, మార్పు కోసం, మేము PVS-స్టూడియోను స్థానికంగా డెవలపర్ మెషీన్‌లో కాకుండా క్లౌడ్‌లో ప్రారంభిస్తాము మరియు PPSSPPలో లోపాల కోసం చూస్తాము.

ట్రావిస్ CIని ఏర్పాటు చేస్తోంది

మాకు అవసరమైన ప్రాజెక్ట్ ఉన్న GitHubలో రిపోజిటరీ అవసరం, అలాగే PVS-స్టూడియో కోసం కీ (మీరు పొందవచ్చు. విచారణ కీ లేదా ఓపెన్ సోర్స్ ప్రాజెక్ట్‌లకు ఉచితం).

సైట్‌కి వెళ్దాం ట్రావిస్ సిఐ. మీ GitHub ఖాతాను ఉపయోగించి అధికారం పొందిన తర్వాత, మేము రిపోజిటరీల జాబితాను చూస్తాము:

PSP గేమ్ కన్సోల్ ఎమ్యులేటర్ యొక్క ఉదాహరణను ఉపయోగించి ట్రావిస్ CIలో PVS-స్టూడియోను ఎలా కాన్ఫిగర్ చేయాలి
పరీక్ష కోసం, నేను PPSSPPని ఫోర్క్ చేసాను.

మేము సేకరించాలనుకుంటున్న రిపోజిటరీని సక్రియం చేస్తాము:

PSP గేమ్ కన్సోల్ ఎమ్యులేటర్ యొక్క ఉదాహరణను ఉపయోగించి ట్రావిస్ CIలో PVS-స్టూడియోను ఎలా కాన్ఫిగర్ చేయాలి
ప్రస్తుతానికి, ట్రావిస్ CI మా ప్రాజెక్ట్‌ను నిర్మించలేరు ఎందుకంటే నిర్మాణానికి సూచనలు లేవు. కాబట్టి ఇది కాన్ఫిగరేషన్ కోసం సమయం.

విశ్లేషణ సమయంలో, కొన్ని వేరియబుల్స్ మాకు ఉపయోగకరంగా ఉంటాయి, ఉదాహరణకు, PVS-స్టూడియో కోసం కీ, ఇది కాన్ఫిగరేషన్ ఫైల్‌లో పేర్కొనడం అవాంఛనీయమైనది. కాబట్టి ట్రావిస్ 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

వర్చువల్ మెషీన్ జీవితంలోని వివిధ దశల కోసం మీ స్వంత ఆదేశాలను జోడించడానికి ట్రావిస్ CI మిమ్మల్ని అనుమతిస్తుంది. విభాగం ముందు_ఇన్‌స్టాల్ చేయండి ప్యాకేజీలను ఇన్‌స్టాల్ చేసే ముందు అమలు చేయబడుతుంది. అప్పుడు ఇన్స్టాల్, ఇది జాబితా నుండి ప్యాకేజీల సంస్థాపనను అనుసరిస్తుంది 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
}

ఇప్పుడు మేము ట్రావిస్ CIలో PVS-స్టూడియో యొక్క ఆటోమేటిక్ లాంచ్‌ని సెటప్ చేయడానికి నేరుగా వచ్చాము. ముందుగా మనం సిస్టమ్‌లో 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 విలువను నిల్వ చేస్తుంది అవును (మేము దానిని విభాగంలో సూచించాము ENV బిల్డ్ మ్యాట్రిక్స్ కాన్ఫిగరేషన్ సమయంలో), మేము ప్యాకేజీని ఇన్‌స్టాల్ చేస్తాము pvs-స్టూడియో. దీనికి అదనంగా, ప్యాకేజీలు కూడా సూచించబడ్డాయి 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

కోడ్ యొక్క ఈ విభాగంలో మేము సెట్ చేసాము సిమేక్ కంపైలేషన్ ఆదేశాలను ఎగుమతి చేయడానికి ఫ్లాగ్. స్టాటిక్ కోడ్ ఎనలైజర్ కోసం ఇది అవసరం. మీరు వ్యాసంలో దీని గురించి మరింత చదువుకోవచ్చు "Linux మరియు macOSలో PVS-స్టూడియోను ఎలా అమలు చేయాలి".

అసెంబ్లీ విజయవంతమైతే, మేము పొందుతాము తర్వాత_విజయం, ఇక్కడ మేము స్టాటిక్ విశ్లేషణ చేస్తాము:

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 లైసెన్స్ గడువు ముగియబోతోందని వినియోగదారుని హెచ్చరిస్తుంది. ఇది జరగకుండా నిరోధించడానికి, మీరు ఈ ఫ్లాగ్‌ను పేర్కొనవచ్చు.

లాగ్ ఫైల్‌లో రా అవుట్‌పుట్ ఉంది, అది మార్పిడి లేకుండా చదవబడదు, కాబట్టి మీరు ముందుగా ఫైల్‌ను చదవగలిగేలా చేయాలి. లాగ్లను పాస్ చేద్దాం ప్లగ్-కన్వర్టర్, మరియు అవుట్‌పుట్ 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 రిపోజిటరీకి నెట్టడానికి సమయం ఆసన్నమైంది, ఆ తర్వాత ట్రావిస్ CI స్వయంచాలకంగా నిర్మాణాన్ని అమలు చేస్తుంది. బిల్డ్ నివేదికలకు వెళ్లడానికి “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 || కుడి వాల్యూమ్ <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 '||' యొక్క ఎడమ మరియు కుడి వైపున ఒకే విధమైన ఉప వ్యక్తీకరణలు '!మెమరీ::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

ఈ లోపం ఫోల్డర్‌లో ఉంది ext, కాబట్టి ప్రాజెక్ట్‌కి సరిగ్గా సంబంధం లేదు, కానీ నేను దానిని గమనించేలోపు బగ్ కనుగొనబడింది, కాబట్టి నేను దానిని వదిలివేయాలని నిర్ణయించుకున్నాను. అన్నింటికంటే, ఈ వ్యాసం లోపాలను సమీక్షించడం గురించి కాదు, కానీ ట్రావిస్ CIతో ఏకీకరణ గురించి, మరియు ఎనలైజర్ యొక్క కాన్ఫిగరేషన్ నిర్వహించబడలేదు.

వేరియబుల్ పరిమాణం స్థిరాంకం ద్వారా ప్రారంభించబడుతుంది, అయినప్పటికీ, ఇది కోడ్‌లో పూర్తిగా ఉపయోగించబడదు, ఆపరేటర్ వరకు if, ఇది, కోర్సు యొక్క, ఇస్తుంది తప్పుడు పరిస్థితులను తనిఖీ చేస్తున్నప్పుడు, ఎందుకంటే, మనకు గుర్తున్నట్లుగా, పరిమాణం సున్నాకి సమానం. తదుపరి తనిఖీలు కూడా అర్థం కాదు.

స్పష్టంగా, కోడ్ ఫ్రాగ్మెంట్ రచయిత వేరియబుల్‌ని ఓవర్‌రైట్ చేయడం మర్చిపోయారు పరిమాణం అంతకు ముందు.

ఆపు

ఇక్కడే మనం తప్పులతో ముగుస్తాము. ఈ కథనం యొక్క ఉద్దేశ్యం ట్రావిస్ CIతో కలిసి PVS-స్టూడియో యొక్క పనిని ప్రదర్శించడం మరియు ప్రాజెక్ట్‌ను సాధ్యమైనంత పూర్తిగా విశ్లేషించడం కాదు. మీరు పెద్ద మరియు అందమైన తప్పులను కోరుకుంటే, మీరు ఎల్లప్పుడూ వాటిని ఆరాధించవచ్చు ఇక్కడ :).

తీర్మానం

ఇంక్రిమెంటల్ అనాలిసిస్ అభ్యాసంతో కలిసి ప్రాజెక్ట్‌లను రూపొందించడానికి వెబ్ సేవలను ఉపయోగించడం వలన కోడ్‌ను విలీనం చేసిన వెంటనే అనేక సమస్యలను కనుగొనవచ్చు. అయితే, ఒక బిల్డ్ సరిపోకపోవచ్చు, కాబట్టి స్టాటిక్ అనాలిసిస్‌తో కలిసి టెస్టింగ్‌ని సెటప్ చేయడం వల్ల కోడ్ నాణ్యత గణనీయంగా మెరుగుపడుతుంది.

ఉపయోగకరమైన లింకులు

PSP గేమ్ కన్సోల్ ఎమ్యులేటర్ యొక్క ఉదాహరణను ఉపయోగించి ట్రావిస్ CIలో PVS-స్టూడియోను ఎలా కాన్ఫిగర్ చేయాలి

మీరు ఈ కథనాన్ని ఆంగ్లం మాట్లాడే ప్రేక్షకులతో భాగస్వామ్యం చేయాలనుకుంటే, దయచేసి అనువాద లింక్‌ని ఉపయోగించండి: Maxim Zvyagintsev. PSP గేమ్ కన్సోల్ ఎమ్యులేటర్ ఉదాహరణను ఉపయోగించి ట్రావిస్ CIలో PVS-స్టూడియోను ఎలా సెటప్ చేయాలి.

మూలం: www.habr.com

ఒక వ్యాఖ్యను జోడించండి