Mar a chuireas tu PVS-Studio air dòigh ann an Travis CI a’ cleachdadh an eisimpleir de emuladair tòcan geama PSP

Mar a chuireas tu PVS-Studio air dòigh ann an Travis CI a’ cleachdadh an eisimpleir de emuladair tòcan geama PSP
Tha Travis CI na sheirbheis lìn sgaoilte airson bathar-bog togail agus deuchainn a bhios a’ cleachdadh GitHub mar aoigheachd còd stòr. A bharrachd air na suidheachaidhean obrachaidh gu h-àrd, faodaidh tu do chuid fhèin a chuir ris le taing dha na roghainnean rèiteachaidh farsaing. San artaigil seo rèitichidh sinn Travis CI gus obrachadh le PVS-Studio a’ cleachdadh eisimpleir còd PPSSPP.

Ro-ràdh

Travis CI na sheirbheis lìn airson bathar-bog togail is deuchainn. Mar as trice bidh e air a chleachdadh ann an co-bhonn ri cleachdaidhean amalachaidh leantainneach.

PPSSPP - Emulator console geama PSP. Tha am prògram comasach air aithris a dhèanamh air cur air bhog geamannan sam bith bho dhealbhan diosc airson Sony PSP. Chaidh am prògram fhoillseachadh air 1 Samhain, 2012. Tha cead aig PPSSPP fo GPL v2. Faodaidh duine sam bith leasachaidhean a dhèanamh air Còd stòr a’ phròiseict.

PVS-Studio - anailis còd statach airson a bhith a’ lorg mhearachdan agus so-leòntachd a dh’ fhaodadh a bhith ann an còd prògram. San artaigil seo, airson atharrachadh, cuiridh sinn air bhog PVS-Studio chan ann gu h-ionadail air inneal an leasaiche, ach san sgòth, agus coimheadaidh sinn airson mearachdan ann am PPSSPP.

Travis CI a stèidheachadh

Bidh feum againn air stòr air GitHub, far a bheil am pròiseact a dh’ fheumas sinn suidhichte, a bharrachd air iuchair airson PVS-Studio (gheibh thu iuchair deuchainn no Saor an-asgaidh airson pròiseactan Open Source).

Rachamaid chun na làraich Travis CI. Às deidh cead a bhith a’ cleachdadh do chunntas GitHub, chì sinn liosta de stòran:

Mar a chuireas tu PVS-Studio air dòigh ann an Travis CI a’ cleachdadh an eisimpleir de emuladair tòcan geama PSP
Airson an deuchainn, chuir mi air falbh PPSSPP.

Bidh sinn a’ gnìomhachadh an stòr-dàta a tha sinn airson a chruinneachadh:

Mar a chuireas tu PVS-Studio air dòigh ann an Travis CI a’ cleachdadh an eisimpleir de emuladair tòcan geama PSP
Aig an àm seo, chan urrainn dha Travis CI ar pròiseact a thogail leis nach eil stiùireadh ann airson togail. Mar sin tha an t-àm ann airson rèiteachadh.

Rè an anailis, bidh cuid de chaochladairean feumail dhuinn, mar eisimpleir, an iuchair airson PVS-Studio, a bhiodh neo-mhiannach a shònrachadh anns an fhaidhle rèiteachaidh. Mar sin cuir sinn caochladairean àrainneachd ris a’ cleachdadh na roghainnean togail ann an Travis CI:

Mar a chuireas tu PVS-Studio air dòigh ann an Travis CI a’ cleachdadh an eisimpleir de emuladair tòcan geama PSP
Feumaidh sinn:

  • PVS_USERNAME - ainm-cleachdaiche
  • PVS_KEY - iuchair
  • MAIL_USER - post-d a thèid a chleachdadh gus an aithisg a chur
  • MAIL_PASSWORD - facal-faire post-d

Tha an dithis mu dheireadh roghainneil. Thèid iad sin a chleachdadh gus toraidhean a chuir tron ​​​​phost. Ma tha thu airson an aithisg a sgaoileadh ann an dòigh eile, chan fheum thu an comharrachadh.

Mar sin, tha sinn air na caochladairean àrainneachd a tha a dhìth oirnn a chur ris:

Mar a chuireas tu PVS-Studio air dòigh ann an Travis CI a’ cleachdadh an eisimpleir de emuladair tòcan geama PSP
A-nis cruthaichidh sinn faidhle .travis.yml agus cuir e ann am freumh a’ phròiseict. Bha faidhle rèiteachaidh aig PPSSPP mu thràth airson Travis CI, ge-tà, bha e ro mhòr agus gu tur mì-fhreagarrach airson an eisimpleir, agus mar sin dh'fheumadh sinn a dhèanamh nas sìmplidhe gu mòr agus fàg a-mhàin na h-eileamaidean bunaiteach.

An toiseach, comharraich sinn an cànan, an dreach de Ubuntu Linux a tha sinn airson a chleachdadh san inneal brìgheil, agus na pacaidean riatanach airson an togail:

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'

Tha feum air a h-uile pasgan a tha air an liostadh airson PPSSPP a-mhàin.

A-nis tha sinn a 'sealltainn an matrix cruinneachaidh:

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

Beagan a bharrachd mun roinn Matrix. Ann an Travis CI, tha dà dhòigh air roghainnean togail a chruthachadh: is e a’ chiad fhear liosta de luchd-cruinneachaidh, seòrsachan siostam obrachaidh, caochladairean àrainneachd, msaa a shònrachadh, às deidh sin thèid matrix de gach cothlamadh a chruthachadh; tha an dàrna fear na chomharra soilleir air a’ mhaitrix. Gu dearbh, faodaidh tu an dà dhòigh-obrach seo a chur còmhla agus cùis shònraichte a chur ris, no, air an làimh eile, cuir a-mach e leis an earrainn dùnadh. Faodaidh tu barrachd a leughadh mu dheidhinn seo ann an Sgrìobhainnean Travis CI.

Chan eil air fhàgail ach stiùireadh cruinneachaidh sònraichte a thoirt seachad:

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

Leigidh Travis CI leat na h-òrdughan agad fhèin a chuir ris airson diofar ìrean de bheatha inneal brìgheil. Earrann ro-stàlaich air a chuir gu bàs mus stàlaich thu pacaidean. An uair sin stàlaich, a tha a 'leantainn stàladh pacaidean bhon liosta addons.apta dh'ainmich sinn gu h-àrd. Bidh an co-chruinneachadh fhèin a’ gabhail àite ann an sgriobt. Ma chaidh a h-uile càil gu math, lorg sinn sinn fhìn a-staigh às dèidh_soirbheachas (Is ann san roinn seo a bhios sinn a’ ruith mion-sgrùdadh statach). Chan e seo a h-uile ceum a ghabhas atharrachadh, ma tha feum agad air barrachd, bu chòir dhut coimhead a-steach Sgrìobhainnean Travis CI.

Airson a bhith furasta an leughadh, chaidh na h-òrdughan a chuir ann an sgriobt air leth .travis.sh, a tha air a chuir aig freumh a’ phròiseict.

Mar sin tha am faidhle a leanas againn .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

Mus stàlaich sinn na pacaidean, bheir sinn ùrachadh air na fo-mhodalan. Tha feum air seo gus PPSSPP a thogail. Nach cuir sinn a’ chiad ghnìomh ri .travis.sh (Thoir an aire don leudachadh):

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

A-nis thig sinn gu dìreach gu bhith a’ stèidheachadh foillseachadh fèin-ghluasadach PVS-Studio ann an Travis CI. An toiseach feumaidh sinn am pasgan PVS-Studio a stàladh air an t-siostam:

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
}

Aig toiseach an gnìomh travis_install bidh sinn a’ stàladh an luchd-cruinneachaidh a dh’ fheumas sinn a’ cleachdadh caochladairean àrainneachd. An uairsin ma tha an caochlaideach $PVS_ANALYZE luach nan stòran Tha (dh’ainmich sinn e anns an earrainn approx rè rèiteachadh matrix togail), bidh sinn a’ stàladh a ’phacaid pvs-stiùidio. A bharrachd air an seo, tha pasganan air an comharrachadh cuideachd libio-socaid-ssl-perl и libnet-ssleay-perl, ge-tà, tha feum orra airson toraidhean postachd, agus mar sin chan eil iad riatanach ma tha thu air dòigh eile a thaghadh airson an aithisg agad a lìbhrigeadh.

gnìomh download_extract luchdaich sìos agus dì-phacaich an tasglann ainmichte:

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

Tha an t-àm ann am pròiseact a chur ri chèile. Bidh seo a’ tachairt anns an earrainn sgriobt:

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
}

Gu dearbh, is e rèiteachadh tùsail sìmplidh a tha seo, ach a-mhàin na loidhnichean sin:

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

Anns an earrainn seo den chòd a shuidhich sinn cmake bratach airson às-mhalairt òrdughan cruinneachaidh. Tha seo riatanach airson anailisiche còd statach. Faodaidh tu barrachd a leughadh mu dheidhinn seo san artaigil “Mar a ruitheas tu PVS-Studio air Linux agus macOS".

Ma bha an co-chruinneachadh soirbheachail, ruigidh sinn às dèidh_soirbheachas, far am bi sinn a’ dèanamh mion-sgrùdadh staitigeach:

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
}

Bheir sinn sùil nas mionaidiche air na loidhnichean a leanas:

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

Bidh a’ chiad loidhne a’ gineadh faidhle cead bhon ainm-cleachdaidh agus an iuchair a shònraich sinn aig an fhìor thoiseach nuair a bha sinn a’ stèidheachadh caochladairean àrainneachd Travis CI.

Bidh an dàrna loidhne a’ tòiseachadh an anailis gu dìreach. Bratach -j a’ suidheachadh àireamh nan snàithleanan airson mion-sgrùdadh, bratach -l comharrachadh cead, bratach -o a’ mìneachadh am faidhle airson a bhith a’ cur a-mach logaichean, agus a’ bhratach - cuir à comas Cead-sgrùdaidh Expiration riatanach airson dreachan deuchainn, oir gu bunaiteach pvs-stiùidio-anailisiche bheir e rabhadh don neach-cleachdaidh gu bheil an ceadachas gu bhith a’ tighinn gu crìch. Gus casg a chuir air seo, faodaidh tu am bratach seo a shònrachadh.

Tha toradh amh anns an fhaidhle log nach gabh a leughadh gun tionndadh, agus mar sin feumaidh tu am faidhle a leughadh an-toiseach. Bheir sinn seachad na logaichean troimhe plog-tionndaidh, agus is e faidhle html a th’ anns an toradh.

San eisimpleir seo, chuir mi romhpa aithisgean a chuir tron ​​​​phost a’ cleachdadh an àithne post-dealain.

Mar thoradh air an sin, fhuair sinn am faidhle a leanas .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;

A-nis tha an t-àm ann na h-atharrachaidhean air an stòr git a phutadh, agus às deidh sin bidh Travis CI a’ ruith an togail gu fèin-ghluasadach. Cliog air “ppsspp” gus a dhol gu na h-aithisgean togail:

Mar a chuireas tu PVS-Studio air dòigh ann an Travis CI a’ cleachdadh an eisimpleir de emuladair tòcan geama PSP
Chì sinn sealladh farsaing air an togalach làithreach:

Mar a chuireas tu PVS-Studio air dòigh ann an Travis CI a’ cleachdadh an eisimpleir de emuladair tòcan geama PSP
Ma thèid an togail a chrìochnachadh gu soirbheachail, gheibh sinn post-d le toraidhean an sgrùdaidh statach. Gu dearbh, chan e post-d an aon dòigh air aithisg fhaighinn. Faodaidh tu modh buileachaidh sam bith a thaghadh. Ach tha e cudromach cuimhneachadh nach bi e comasach faighinn gu faidhlichean inneal brìgheil às deidh an togail a chrìochnachadh.

Geàrr-chunntas mearachd

Tha sinn air a’ phàirt as duilghe a chrìochnachadh gu soirbheachail. A-nis dèanamaid cinnteach gur fhiach ar n-oidhirpean gu lèir. Bheir sinn sùil air cuid de phuingean inntinneach bhon aithisg anailis statach a thàinig thugam tron ​​​​phost (cha b’ ann airson rud sam bith a chomharraich mi e).

Optimization cunnartach

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

Rabhadh PVS-Studio: V597 Dh’ fhaodadh an compiler a’ ghairm gnìomh ‘memset’ a sguabadh às, a thathas a’ cleachdadh gus bufair ‘suim’ a shruthladh. Bu chòir an gnìomh RtlSecureZeroMemory() a chleachdadh gus an dàta prìobhaideach a dhubhadh às. sha1.cpp 325

Tha am pìos còd seo suidhichte anns a’ mhodal hashing tèarainte, ge-tà, tha fìor lochd tèarainteachd ann (CWE-14). Bheir sinn sùil air an liosta cruinneachaidh a thèid a chruthachadh nuair a bhios sinn a’ cur ri chèile an dreach Debug:

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

Tha a h-uile dad ann an òrdugh agus an gnìomh memeset air a chur gu bàs, mar sin a’ sgrìobhadh thairis air dàta cudromach ann an RAM, ge-tà, na dèan gàirdeachas fhathast. Nach toir sinn sùil air liosta co-chruinneachaidh an dreach Release le optimization:

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

Mar a chithear bhon liostadh, cha tug an neach-cruinneachaidh an aire don ghairm memeset. Tha seo air sgàth gu bheil ann an gnìomh sha1 às deidh a’ ghairm memeset gun iomradh a bharrachd air structar ctx. Mar sin, chan eil an compiler a’ faicinn feum sam bith ann a bhith a’ caitheamh ùine pròiseasar a’ sgrìobhadh thairis air cuimhne nach eilear a’ cleachdadh san àm ri teachd. Faodaidh tu seo a chàradh le bhith a’ cleachdadh a’ ghnìomh RtlSecureZeroCuimhne no coltach rithe.

Ceart:

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

Coimeas neo-riatanach

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

Rabhadh PVS-Studio: V547 Tha an abairt 'leftvol > = 0' daonnan fìor. sceAudio.cpp 120

Thoir aire don mheur eile airson a 'chiad uair if. Thèid an còd a chur an gnìomh a-mhàin ma tha a h-uile suidheachadh clìvol > 0xFFFF || còir> 0xFFFF || clìvol < 0 || còir <0 tionndaidhidh e gu bhi meallta. Mar sin, gheibh sinn na h-aithrisean a leanas, a bhios fìor airson a’ mheur eile: clìvol <= 0xFFFF, còir <= 0xFFFF, clì>= 0 и còir >= 0. Mothaich an dà aithris mu dheireadh. A bheil e ciallach dearbhadh dè an suidheachadh a tha riatanach airson a’ phìos còd seo a chur an gnìomh?

Mar sin is urrainn dhuinn na h-aithrisean cumhach seo a thoirt air falbh gu sàbhailte:

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

Sgeul eile. Tha mearachd de sheòrsa air choreigin falaichte air cùl nan cumhachan sin nach eil feum. Is dòcha nach do rinn iad sgrùdadh air na bha a dhìth.

Ctrl+C Ctrl+V a' bualadh air ais

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 Tha an aon fho-aithris ann '!Memory::IsValidAddress(psmfData)' air an taobh chlì agus air an làimh dheis den '||' gnìomhaiche. scPsmf.cpp 703

Thoir aire don t-seic a-staigh if. Nach eil thu a’ smaoineachadh gu bheil e neònach gun dèan sinn sgrùdadh a bheil an seòladh dligheach? psmf Dàta, a dhà uiread? Mar sin tha seo a 'coimhead neònach dhomh ... Gu dearbh, is e typo a tha seo, gu dearbh, agus b' e am beachd a bhith a 'sgrùdadh an dà pharaimear inntrigidh.

Roghainn ceart:

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

Caochladair air a dhìochuimhneachadh

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

Rabhadh PVS-Studio: V547 Tha an abairt 'meud == 8' an-còmhnaidh ceàrr. sin-att.c 195

Tha am mearachd seo suidhichte sa phasgan ext, mar sin chan eil e gu math buntainneach don phròiseact, ach chaidh am biast a lorg mus do mhothaich mi e, agus mar sin chuir mi romhpa fhàgail. Às deidh na h-uile, chan eil an artaigil seo mu dheidhinn ath-sgrùdadh mhearachdan, ach mu bhith ag amalachadh le Travis CI, agus cha deach rèiteachadh an anailisiche a dhèanamh.

Caochlaideach meud air a thòiseachadh le seasmhach, ge-tà, chan eil e air a chleachdadh idir sa chòd, dìreach sìos chun ghnìomhaiche if, a tha, gu dearbh, a 'toirt seachad ceàrr agus sinn a’ cumail sùil air na suidheachaidhean, oir, mar a chuimhnicheas sinn, meud co-ionann ri neoni. Chan eil sgrùdaidhean às deidh sin a’ dèanamh ciall sam bith cuideachd.

A rèir choltais, dhìochuimhnich ùghdar a’ chriomag còd an caochladair a sgrìobhadh thairis meud roimhe sin.

stad

Seo far an tig sinn gu crìch leis na mearachdan. Is e adhbhar an artaigil seo obair PVS-Studio a thaisbeanadh còmhla ri Travis CI, agus gun a bhith a’ dèanamh mion-sgrùdadh air a’ phròiseact cho mionaideach ‘s a ghabhas. Ma tha thu ag iarraidh mearachdan nas motha agus nas bòidhche, faodaidh tu an-còmhnaidh a bhith gam meas an seo :).

co-dhùnadh

Le bhith a’ cleachdadh seirbheisean lìn gus pròiseactan a thogail còmhla ri cleachdadh mion-sgrùdadh mean air mhean leigidh sin dhut mòran dhuilgheadasan a lorg dìreach às deidh dhut còd a chur còmhla. Ach, dh’ fhaodadh nach bi aon togail gu leòr, agus mar sin le bhith a’ stèidheachadh deuchainn còmhla ri mion-sgrùdadh statach leasaichidh sin càileachd a’ chòd gu mòr.

Ceanglaichean feumail

Mar a chuireas tu PVS-Studio air dòigh ann an Travis CI a’ cleachdadh an eisimpleir de emuladair tòcan geama PSP

Ma tha thu airson an artaigil seo a cho-roinn le luchd-èisteachd Beurla, cleachd an ceangal eadar-theangachaidh: Maxim Zvyagintsev. Mar a stèidhicheas tu PVS-Studio ann an Travis CI a’ cleachdadh an eisimpleir de emuladair tòcan geama PSP.

Source: www.habr.com

Cuir beachd ann