Quomodo configurare PVS-Studii in Travis CI exemplo PSP ludi console aemulatoris

Quomodo configurare PVS-Studii in Travis CI exemplo PSP ludi console aemulatoris
Travis CI servitium interretialem distributum est ad fabricandum et probandum programmatum, quo GitHub utitur ut fons codice obnoxius. Praeter has missiones operativas, gratias tuas amplae optionum conformationis addere potes. In hoc articulo configurabimus Travis CI ad operandum cum PVS-Studio adhibito exemplo codicis PPSSPP.

introduction

Cogito Ergo C. servitium telae est ad fabricam et programmationem probandam. Solet in conjunctione cum exercitiis integrationibus continuis.

PPSSPP - PSP ludus consolator aemulator. Propositum potest aemulari impulsum cuiuslibet ludorum ex orbium imaginum pro Sony PSP destinatorum. Propositum dimissum est die 1 mensis Novembris anno 2012 . PPSSPP licentiatus est sub GPL v2. Quis potest facere melioramentis Project source code.

PVS Studio, - static codice analyser ad quaerendas errores et vulnerabilitates potentiales in programmatis codice. In hoc articulo, ob mutationem, PVS-Studium non localiter in machina elit, sed in nube mittemus, et errores in PPSSPP exspectabimus.

Travis ci erigas

Opus repositorium in GitHub, ubi inceptum opus est, tum clavis ad PVS-Studium (accipere licebit. key iudicium aut liberum Open Source projects).

Eamus ad locum Cogito Ergo C.. Postquam auctoritas tua GitHub ratione usus est, elenchum repositoriorum videbimus:

Quomodo configurare PVS-Studii in Travis CI exemplo PSP ludi console aemulatoris
Pro test, varam PPSSPP.

Repositorium strenuus nos colligere volumus:

Quomodo configurare PVS-Studii in Travis CI exemplo PSP ludi console aemulatoris
In momento, Travis CI consilium nostrum aedificare non potest quia instructiones ad aedificationem nullae sunt. Tempus igitur est configurationis.

In analysi, aliquae variabiles nobis utiles erunt, exempli gratia, clavis PVS-Studii, quae in lima configurationis definire non oportebit. Addamus igitur variabiles ambitus utentes occasus in Travis CI:

Quomodo configurare PVS-Studii in Travis CI exemplo PSP ludi console aemulatoris
Nos postulo:

  • PVS_USERNAME - nomen usoris
  • PVS_KEY - clavis
  • MAIL_USER - inscriptio quae relationem mittendi adhibebitur
  • MAIL_PASSWORD - email password

Duo ultima sunt ad libitum. Hae eventus electronicarum mittendorum adhibebuntur. Si famam aliter distribuere vis, non debes eis significare.

Ita adiunximus variabilium ambitum quae opus est:

Quomodo configurare PVS-Studii in Travis CI exemplo PSP ludi console aemulatoris
Nunc faciamus lima .travis.yml et pone in radice rei. PPSSPP tabellam configurationem iam pro Travis CI habebat, tamen exemplum nimis amplum et omnino alienum erat, ut eam valde simpliciorem redderemus ac solum elementa elementa relinqueremus.

Primum indicaremus linguam, versionem Ubuntu Linux, qua in machina virtuali uti volumus, et sarcinas necessarias ad aedificandum;

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'

Omnes fasciculi qui inscripti sunt solum ad PPSSPP opus sunt.

Nunc ecclesiam matricis indicamus;

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

Paulo plus de sectione matrix. In Travis CI duo modi sunt ad optiones aedificandas creandas: prima est denominare elenchum compilatorum, genera systematis operandi, variabiles ambitus, etc. secunda significatio matricis est expressa. Utique has duas accessiones miscere potes et casum singularem addere, vel e contra utens sectione excludere excludere. Plura de hoc legere potes in Travis CI documenta.

Reliquum est ut instructiones conventus projecti speciales provideant;

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 permittit ut tua imperia addas ad varios gradus vitae virtualis apparatus. Sectio before_install supplicium ante installing packages. deinde installquae sequitur institutionem fasciculorum ex indice addons.aptquas supra demonstravimus. Ipsa ecclesia fit in script. Si omnia bona sunt, invenimus nos in after_success (in hac sectione analysin static incurremus). Hi omnes gradus non sunt qui mutari possunt, si plus debes, tunc inspicere debes Travis CI documenta.

Pro legendi facilitate, in singulari script .travis.shpositam ad radicem.

Ita habemus sequentis fasciculi .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

Priusquam fasciculos inaugurarimus, submodules renovabimus. Hoc opus est PPSSPP aedificare. Addamus primum munus to .travis.sh (note extensionem);

travis_before_install() {
  git submodule update --init --recursive
}

Nunc directe ad activitates PVS-Studii in Travis CI erigendas veniamus. Primum opus est ut sarcinam instituat PVS-Studii in systematis:

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
}

In principium munus travis_install compilatores instituimus utentes variabilium ambituum indigemus. Tum si variabilis $PVS_ANALYZE stores valorem Yes (Nos indicavit in sectione env per constructum matrix configuratione), nos install a sarcina pvs-studio. Praeter hoc, etiam fasciculi indicantur libio-socket-ssl-perl ΠΈ libnet-ssleay-perlrequiruntur tamen ad eventus electronicos, ut non sint necessarii si aliam rationem de fama tua perferendam elegeris.

munus download_extract et unpacks ex certa downloads archive:

download_extract() {
  aria2c -x 16 $1 -o $2
  tar -xf $2
}

Sed tempus lorem ut posuere tincidunt. Hoc fit in sectione script:

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
}

Re quidem vera haec figuratio originalis simplicior est, his exceptis lineis;

if [ "$PVS_ANALYZE" = "Yes" ]; then
  CMAKE_ARGS="-DCMAKE_EXPORT_COMPILE_COMMANDS=On ${CMAKE_ARGS}"
fi

In hac sectione codicis posuimus CMake vexillum pro compilatione educendi mandata. Hoc necessarium est pro codice stabili analysi. Plura de hoc legere potes in articulo "Quomodo currere PVS-Studium in Linux et macOS?".

Si ecclesia bene valuit, tunc ad after_successubi analysin stabilis agimus;

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
}

Propius inspiciamus sequentes lineas:

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

Prima linea licentiam fasciculi e usoris et clavibus generat, quod in ipso initio constituimus cum variabiles ambitus ambitus Travis CI constituens.

Secunda linea incipit directe analysin. Flag -j numerum staminum ad analysin ponit, vexillum -l indicat licentia, vexillum -o* tabellam definit pro outputting trabes et vexillum -disableLicenseExpirationCheck versiones ad iudicium requisiti, quoniam per defaltam pvs-studio-analyzer Monet utentis licentia exspiratura. Hoc ne fiat, signum hoc denota.

Tabellarum fasciculus rudis output continet, qui sine conversione legi non potest, ut primum tabellam readabilem reddere debes. Transeamus omnia per plog-converterac output fasciculus HTML modum habet.

Hoc exemplo decrevi relationes mittere per mandatum utens mittere email.

Quam ob rem hanc tabellam consecuti sumus .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;

Nunc tempus est mutationes ad git repositorium impellere, post quas Travis CI aedificandum sponte discurret. Deprime "ppsspp" ad aedificandum tradit:

Quomodo configurare PVS-Studii in Travis CI exemplo PSP ludi console aemulatoris
Videbimus contemplationem hodiernam constructum;

Quomodo configurare PVS-Studii in Travis CI exemplo PSP ludi console aemulatoris
Si aedificatio feliciter consummata est, inscriptionem electronicam cum eventibus analyseos staticae accipiemus. Scilicet, mailing non solum relationem accipere. Quamlibet exsequendam methodum eligere potes. Sed interest meminisse, postquam aedificatum peracta est, prope fasciculi machinae accedere non poterunt.

Error summary

Difficillimam partem feliciter confecimus. Nunc omnia opera nostra operae pretium esse faciamus. Inspiciamus nonnulla puncta interesting ex analysi statice famae quae ad me per epistulas venit (non gratis id indicavi).

Periculo ipsum

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-Studium monitum; V597 Compilator delere potuit munus vocationis 'memset', quod ad ruborem 'sum' quiddam adhibetur. Munus RtlSecureZeroMemory () munus privatas notitias delere debet. sha1.cpp 325

Haec fragmentum codicis in modulo hashing secure situm est, tamen gravem securitatem vitium continet (CWE-14). Intueamur conventum album quod generatur cum versionem Debug componendis:

; Line 355
  mov r8d, 20
  xor edx, edx
  lea rcx, QWORD PTR sum$[rsp]
  call memset
; Line 356

Omnia in ordine et munere memeset supplicium est, in RAM momenti notitias scribentes, tamen non solum adhuc laetantur. Intueamur conventum recensitum versionis Release cum ipsum:

; 354  :
; 355  :  memset( sum, 0, sizeof( sum ) );
; 356  :}

Ut ex enumeratione videri potest, vocationem compilator neglexit memeset. Hoc ex eo quod est in officio sha1 post vocationem memeset non magis ad structuram CTX. Ideo compilator nullum punctum in tabe processu temporis rescribere memoria videt quod in futuro non est adhibitum. Hoc figere potes utendo munere RtlSecureZeroMemory aut similis est s.

corrigere;

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

supervacanea comparatio

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-Studium monitum; V547 Expressio 'leftvol>=0' semper vera est. sceAudio.cpp 120

Attende ad alium ramum pro primo if. In signum exsecutioni mandabitur solum si condiciones omnes leftvol > 0xFFFF || rightvol > 0xFFFF || leftvol < 0 || rightvol <0 evadet falsum. Sequuntur ergo sequentia, quae vera erunt pro alio genere; leftvol <= 0xFFFF, rightvol <= 0xFFFF, leftvol >= 0 ΠΈ rightvol >= 0. Animadverte duas ultimas propositiones. Sensus est inhibere condicionem necessariam ad exsequendam huius codicis partem?

Haec igitur condiciones condiciones removere tuto possumus:

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

Alterum missionis. Error est quidam latet post has conditiones redundantes. Fortasse non reprehendo quod opus erat.

Ctrl+C Ctrl+V Sternit Back

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 Sub- expressiones identicae sunt 'Memoria ::IsValidAddress(psmfData)' ad sinistram et ad dextram '||' operator. scePsmf.cpp 703

Attende intus reprehendo if. Non mirum tibi videtur quod si oratio valida reprimeretur? psmfDatabis tantum? Ita hoc mihi mirum videtur... Re vera, hoc est, typo, et notio erat input parametris coercere.

Recta optio:

static u32 scePsmfSetPsmf(u32 psmfStruct, u32 psmfData) {
  if (!Memory::IsValidAddress(psmfStruct) ||
      !Memory::IsValidAddress(psmfData)) {
    return hleReportError(ME, SCE_KERNEL_ERROR_ILLEGAL_ADDRESS, "bad address");
  }
  ....
}

variabilis oblitus

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-Studium monitum; V547 Expressio 'magnitudo ==8' semper falsa est. syn-att.c 195

Hic error sita est in folder citita non vere ad propositum pertinet, sed cimex repertus est antequam eam animadverti, sic eam relinquere decrevi. Ceterum hic articulus non est de erroribus recensendis, sed de integratione cum Travis CI, nullaque analystoris figura peracta est.

variabilis magnitudine constanti initialised tamen, nullo modo in codice usque ad operator ifquod quidem dat falsum, conditiones iniecta, quia, ut meminimus; magnitudine nulla eft. Posteriores cohibet etiam nullos sensus.

Ut videtur, auctor codicis fragmenti oblitus est variabilem rescribere magnitudine qui ante.

prohibere

Hoc est, ubi cum erroribus verisimiliter finiemus. Propositum huius articuli opus PVS-Studii una cum Travis CI demonstrare est, nec quam diligentissime rem enucleare. Si vis maiora et pulchriora errata, semper mirari potes hic :).

conclusio,

Operas interretiales utens ad incepta aedificandi una cum usu analyseos incrementalis permittit te invenire multa problemata statim post codicem bus. Sed una constructio non sufficiat, ut simul cum analysi stabili analysi probatio signanter emendare possit qualitatem codicis.

Nexus utilis

Quomodo configurare PVS-Studii in Travis CI exemplo PSP ludi console aemulatoris

Si vis communicare hunc articulum cum auditorio Anglico loquentem, quaeso utere vinculo translationis: Maxim Zvyagintsev. Quomodo constituere PVS-Studium in Travis CI exemplo PSP ludi consolatorii aemulantis.

Source: www.habr.com