Sida loo habeeyo PVS-Studio gudaha Travis CI iyadoo la adeegsanayo tusaale ahaan emulator-ka ciyaarta ciyaarta PSP

Sida loo habeeyo PVS-Studio gudaha Travis CI iyadoo la adeegsanayo tusaale ahaan emulator-ka ciyaarta ciyaarta PSP
Travis CI waa adeeg shabakadeed oo loo qaybiyey dhisidda iyo tijaabinta software kaas oo u adeegsada GitHub martigelinta koodhka isha. Marka lagu daro xaaladaha hawlgalka ee kor ku xusan, waxaad ku dari kartaa adigaaga mahadsanid fursadaha qaabeynta ballaaran. Maqaalkan waxaan ku habeyn doonaa Travis CI si uu ula shaqeeyo PVS-Studio iyadoo la adeegsanayo tusaalaha koodhka PPSSPP.

Horudhac

Travis CI waa adeeg shabakadeed oo loogu talagalay dhisidda iyo tijaabinta software. Caadi ahaan waxa lala isticmaalaa dhaqamada isdhexgalka ee joogtada ah.

PPSSPP - Emulator game console PSP. Barnaamijku waxa uu awood u leeyahay in uu ku dayo bilaabista ciyaar kasta oo ka timid sawirada diskooga loogu talagalay Sony PSP. Barnaamijka waxa uu soo baxay November 1, 2012 PPSSPP waxa ay ku shatiyeysan tahay GPL v2. Qof kasta ayaa hagaajin kara code isha mashruuca.

PVS-Studio - Falanqeeye koodhka taagan ee raadinta khaladaadka iyo dayacanka suurtagalka ah ee koodhka barnaamijka. Maqaalkan, isbeddelka, waxaanu bilaabi doonaa PVS-Studio ma aha gudaha mashiinka horumarinta, laakiin daruuraha, oo raadi khaladaadka PPSSPP.

Dejinta Travis CI

Waxaan u baahan doonaa meel kayd ah oo ku taal GitHub, halkaas oo mashruuca aan u baahanahay uu yaalo, iyo sidoo kale furaha PVS-Studio (waxaad heli kartaa furaha tijaabada ama bilaash ah mashaariicda Isha Furan).

Aan tagno goobta Travis CI. Kadib ogolaanshaha addoo isticmaalaya akoonkaaga GitHub, waxaanu arki doonaa liiska meelaha kaydka ah:

Sida loo habeeyo PVS-Studio gudaha Travis CI iyadoo la adeegsanayo tusaale ahaan emulator-ka ciyaarta ciyaarta PSP
Imtixaanka, waxaan u furay PPSSPP.

Waxaanu hawlgelinaa kaydka aanu doonayno inaanu ururino:

Sida loo habeeyo PVS-Studio gudaha Travis CI iyadoo la adeegsanayo tusaale ahaan emulator-ka ciyaarta ciyaarta PSP
Waqtigan xaadirka ah, Travis CI ma dhisi karo mashruucayaga sababtoo ah ma jiraan tilmaamo lagu dhisayo. Markaa waa waqtigii qaabaynta.

Inta lagu jiro falanqaynta, doorsoomayaasha qaarkood ayaa faa'iido inoo yeelan doona, tusaale ahaan, furaha PVS-Studio, kaas oo aan loo baahnayn in lagu qeexo faylka qaabeynta. Markaa aynu ku darno doorsoomayaasha deegaanka annagoo adeegsanayna goobaha dhismaha ee Travis CI:

Sida loo habeeyo PVS-Studio gudaha Travis CI iyadoo la adeegsanayo tusaale ahaan emulator-ka ciyaarta ciyaarta PSP
Waxaan u baahan doonaa:

  • PVS_USERNAME - magaca isticmaalaha
  • PVS_KEY - fure
  • MAIL_USER - iimaylka loo isticmaali doono in lagu soo diro warbixinta
  • MAIL_PASSWORD - erayga sirta ah ee iimaylka

Labada ugu dambeeya waa ikhtiyaari. Kuwaas waxaa loo isticmaali doonaa in lagu soo diro natiijooyinka boostada. Haddii aad rabto inaad si kale u qaybiso warbixinta, uma baahnid inaad iyaga tilmaamto.

Markaa, waxaanu ku darnay doorsoomayaasha deegaanka ee aanu u baahanahay:

Sida loo habeeyo PVS-Studio gudaha Travis CI iyadoo la adeegsanayo tusaale ahaan emulator-ka ciyaarta ciyaarta PSP
Hadda aan abuurno fayl .travis.yml oo dhig xididka mashruuca. PPSSPP waxay horey u haysatay faylka qaabeynta Travis CI, si kastaba ha ahaatee, waxay ahayd mid aad u weyn oo gebi ahaanba aan ku habboonayn tusaale ahaan, markaa waa inaan si weyn u fududeyno oo aan ka tagno oo kaliya qaybaha aasaasiga ah.

Marka hore, aan tilmaanno luqadda, nooca Ubuntu Linux ee aan rabno inaan ku isticmaalno mashiinka farsamada, iyo xirmooyinka lagama maarmaanka u ah dhismaha:

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'

Dhammaan baakadaha liiska ku jira ayaa si gaar ah loogu baahan yahay PPSSPP.

Hadda waxaan tilmaannaa matrixka shirka:

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

Wax yar oo dheeraad ah oo ku saabsan qaybta Matrix. Travis CI, waxaa jira laba siyaabood oo loo abuuro fursado dhismo: marka hore waa in la qeexo liiska isku-dubaridyada, noocyada nidaamka hawlgalka, doorsoomayaasha deegaanka, iwm. Midda labaad waa tilmaan cad oo shaxanka. Dabcan, waxaad isku dari kartaa labadan hab oo aad ku dari kartaa kiis gaar ah, ama, liddi ku ah, ka saar adigoo isticmaalaya qaybta ka baxsan. Waxaad wax badan oo arrintan ku saabsan ka akhriyi kartaa gudaha Dukumentiyada Travis CI.

Waxa hadhay oo dhan waa in la bixiyo hab-raacyada isu-ururinta ee mashruuca-gaarka ah:

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 wuxuu kuu ogolaanayaa inaad ku darto amarradaada heerar kala duwan oo nolosha mashiinka farsamada ah. Qaybta ka hor_install la fuliyay ka hor inta aan la rakibin baakadaha. Markaa rakibi, kaas oo raacaya rakibaadda baakadaha liiska addons.ku habboonoo aan kor ku tilmaamnay. Golaha laftiisa ayaa ka dhaca script. Haddii wax walba si fiican u dhaceen, markaas waxaan is helaynaa gudaha kadib_guul (waa qaybtan in aan ku samayn doono falanqaynta taagan). Kuwani maaha dhammaan tallaabooyinka la beddeli karo, haddii aad u baahan tahay wax badan, markaa waa inaad eegtaa Dukumentiyada Travis CI.

Si loo fududeeyo akhrinta, amarrada waxaa lagu dhejiyay qoraal gaar ah .travis.sh, kaas oo la dhigo xididka mashruuca.

Markaa waxaan haynaa faylka soo socda .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

Ka hor inta aan la rakibin xirmooyinka, waxaan cusbooneysiin doonaa submodules. Tan waxaa loo baahan yahay si loo dhiso PPSSPP. Aynu ku darno shaqada ugu horreysa .travis.sh (ogow kordhinta):

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

Hadda waxaan si toos ah u nimid inaan dejino si toos ah bilaabista PVS-Studio ee Travis CI. Marka hore waxaan u baahanahay inaan ku rakibno xirmada PVS-Studio nidaamka:

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
}

Bilowga shaqada travis_install waxaan ku rakibnaa qalabeeyayaasha aan u baahanahay anagoo adeegsanayna doorsoomayaasha deegaanka. Markaa haddii doorsoomuhu $PVS_ANALYZE kaydiya qiimaha Haa (waxaanu ku tilmaamnay qaybta dir inta lagu guda jiro qaabeynta matrixka), waxaan ku rakibnaa xirmada pvs-studio. Intaa waxaa dheer, baakadaha ayaa sidoo kale la tilmaamay libio-socket-ssl-perl ΠΈ libnet-ssleay-perl, si kastaba ha ahaatee, waxaa looga baahan yahay natiijooyinka boostada, markaa lagama maarmaan maaha haddii aad dooratay hab kale oo aad ku gudbiso warbixintaada.

function soo dejiso_saar soo dejiso oo ka furto kaydka la cayimay:

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

Waa waqtigii la isku dari lahaa mashruuca. Tani waxay ku dhacdaa qaybta 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
}

Dhab ahaantii, tani waa qaabeynta asalka ah ee la fududeeyay, marka laga reebo khadadkan:

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

Qaybtan koodka waxaan u dejinay samee calanka dhoofinta amarada isu-ururinta. Tani waxay lagama maarmaan u tahay falanqaynta koodhka taagan. Waxaad wax badan oo arrintan ku saabsan ka akhriyi kartaa maqaalka "Sida loo socodsiiyo PVS-Studio Linux iyo macOSΒ«.

Haddii golaha uu guulaystey, markaa waan helnaa kadib_guul, halkaas oo aan ku samayno falanqaynta taagan:

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
}

Aynu si qoto dheer u eegno sadarradan soo socda:

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

Xariiqda koowaad waxay soo saartaa faylka shatiga ee magaca isticmaalaha iyo furaha aan ku qeexnay bilawgii bilawgii markii la dejinayo doorsoomayaasha deegaanka Travis CI.

Sadarka labaad wuxuu si toos ah u bilaabayaa falanqaynta. Calan -j dejiyaa tirada dunta falanqaynta, calanka -l waxay tilmaamaysaa shatiga, calanka -o wuxuu qeexayaa faylka soo saarida logs, iyo calanka -DableLicenseExpirationCheck looga baahan yahay noocyada tijaabada, tan iyo markii default pvs-studio-analyzer wuxuu uga digayaa isticmaalaha in shatiga uu dhacayo. Si aysan taasi u dhicin, waxaad cayimi kartaa calankan.

Faylka loggu wuxuu ka kooban yahay wax soo saar cayriin ah oo aan la akhrin karin beddelaad la'aan, marka waa inaad marka hore ka dhigtaa faylka mid la akhriyi karo. Aan ka gudubno geedaha rog-beddele, oo wax soo saarku waa faylka html.

Tusaalahan, waxaan go'aansaday inaan ku diro warbixinnada boostada anigoo isticmaalaya amarka iimayl.

Natiijo ahaan, waxaan helnay faylka soo socda .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;

Hadda waa waqtigii lagu riixi lahaa isbeddelada kaydka git, ka dib Travis CI wuxuu si toos ah u maamuli doonaa dhismaha. Guji "ppsspp" si aad u tagto warbixinnada dhismaha:

Sida loo habeeyo PVS-Studio gudaha Travis CI iyadoo la adeegsanayo tusaale ahaan emulator-ka ciyaarta ciyaarta PSP
Waxaan arki doonaa dulmar guud ee dhismaha hadda:

Sida loo habeeyo PVS-Studio gudaha Travis CI iyadoo la adeegsanayo tusaale ahaan emulator-ka ciyaarta ciyaarta PSP
Haddii dhismuhu si guul leh u dhammaado, waxaan heli doonaa iimayl wata natiijooyinka falanqaynta taagan. Dabcan, boostada maaha habka kaliya ee lagu helo warbixinta. Waxaad dooran kartaa hab kasta oo hirgelinta. Laakiin waxaa muhiim ah in la xasuusto in ka dib markii la dhammeeyo dhismaha, ma suurtagal noqon doonto in la galo faylasha mashiinka farsamada.

Soo koobid khalad

Waxaan si guul ah u dhamaystirnay qaybtii ugu adkeyd. Hadda aynu hubinno in dhammaan dadaalkeena uu u qalmo. Bal aan eegno qodobbo xiiso leh oo ka mid ah warbixintii falanqaynta ma guurtada ah ee boostada iigu timid (ma ahayn mid aan ku tilmaamay).

Hagaajinta khatarta ah

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

Digniinta PVS-Studio: V597 Soo-sameeyaha ayaa tirtiri kara wicitaanka shaqada 'memset', kaas oo loo isticmaalo in lagu daadiyo 'wadarta' kaydka. Shaqada RtlSecureZeroMemory() waa in la isticmaalo si loo tirtiro xogta gaarka ah. sha1.cpp 325

Qaybtan koodka ah waxa ay ku dhex taal qaybta hashing-ka ee sugan, si kastaba ha ahaatee, waxa ku jira cilad amni oo halis ah (CWE-14). Aynu eegno liiska golaha ee la soo saaray marka la ururinayo nooca Debug:

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

Wax walba waa hagaagsan yihiin iyo shaqada xusuus Waa la fuliyaa, oo sidaas ku beddela xogta muhiimka ah ee RAM, si kastaba ha ahaatee, ha ku farxin weli. Aynu eegno liiska golaha ee nooca Siideynta oo la hagaajinayo:

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

Sida ka muuqata liiska, iskudubariduhu wuu iska dhega tiray wicitaankii xusuus. Tani waxay sabab u tahay xaqiiqda ah in shaqada sha1 wicitaanka kadib xusuus ma jirto tixraac dheeraad ah oo ku saabsan qaabdhismeedka CTX. Sidaa darteed, compiler-ku wax macno ah uma arko in processor-ku wakhtiga ku luminayo xusuusta aan la isticmaalin mustaqbalka. Waxaad hagaajin kartaa tan adoo isticmaalaya shaqada RtlSecureZeroMemory ama la mid ah ku socota iyada.

Sax ah:

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

Isbarbardhigga aan loo baahnayn

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

Digniinta PVS-Studio: V547 Odhaahda 'bidix>= 0' had iyo jeer waa run. sceAudio.cpp 120

U fiirso laanta kale marka ugu horeysa if. Koodhka waxaa la fulin doonaa kaliya haddii dhammaan shuruudaha bidix> 0xFFFF || rightvol> 0xFFFF || bidix <0 || midigta <0 waxay noqon doontaa been. Sidaa darteed, waxaan helnaa weedhahan soo socda, oo run u noqon doona laanta kale: bidix <= 0xFFFF, midigta <= 0xFFFF, bidix >= 0 ΠΈ midigta>= 0. U fiirso labada hadal ee u dambeeya. Miyay macno samaynaysaa in la hubiyo waxa shardiga lagama maarmaanka u ah fulinta qaybtan koodka?

Markaa waxaan si badbaado leh uga saari karnaa weedhahan shuruudaysan:

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

Xaalad kale. Waxaa jira nooc ka mid ah khaladka qarsoon ee ka dambeeya xaaladahan aan badnayn. Waxaa laga yaabaa inaysan hubin waxa loo baahan yahay.

Ctrl+C Ctrl+V ayaa dib u garaacaya

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 Waxa jira odhaah-hoosaadyo isku mid ah '!Memory::IsValidAddress(psmfData)' ee bidix iyo midig ee '||' hawlwadeen. scePsmf.cpp 703

U fiirso jeegga gudaha if. Miyaadan u malayn inay la yaab leh tahay in aan hubinno in ciwaanku uu sax yahay iyo in kale? psmfData, laba jeer ka badan? Markaa tani waxay iila muuqataa qariib... Dhab ahaantii, tani waa, dabcan, typo, fikraduna waxay ahayd in la hubiyo labada cabbir ee wax-gelinta.

Doorashada saxda ah:

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

Doorsoome la iloobay

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

Digniinta PVS-Studio: V547 Odhaahda 'cabbirka == 8' had iyo jeer waa been. syn-att.c 195

Ciladani waxay ku taal galka dheer, si aan dhab ahaantii u khusayn mashruuca, laakiin cayayaanka ayaa la helay ka hor intaanan ogaanin, markaa waxaan go'aansaday inaan ka tago. Ka dib oo dhan, maqaalkani maaha mid ku saabsan dib u eegista khaladaadka, laakiin ku saabsan isdhexgalka Travis CI, iyo wax qaabeyn ah oo falanqeeye ah lama fulin.

Isbadal size waxaa lagu bilaabay si joogto ah, si kastaba ha ahaatee, laguma isticmaalo dhammaan koodka, ilaa hadda hawlwadeenka if, kaas oo, dabcan, bixiya been ah marka la hubinayo shuruudaha, sababtoo ah, sida aan xasuusano, size oo le'eg eber. Jeegaga xiga sidoo kale macno ma samaynayaan.

Sida muuqata, qoraaga jajabka koodku wuxuu illoobay inuu beddelo doorsoomiyaha size intaa ka hor.

Jooji

Tani waa halka ay u badan tahay in aan ku dhamaan doono khaladaadka. Ujeedada maqaalkani waa in la muujiyo shaqada PVS-Studio oo ay weheliso Travis CI, oo aan loo falanqeyn mashruuca sida ugu macquulsan. Haddii aad rabto khaladaad ka weyn oo qurux badan, mar walba waad u bogi kartaa iyaga halkan :).

gunaanad

Isticmaalka adeegyada shabakada si aad u dhisto mashaariicda si wadajir ah ula dhaqmaan falanqaynta kordhinta waxay kuu ogolaaneysaa inaad hesho dhibaatooyin badan isla markiiba ka dib marka la isku daro code. Si kastaba ha ahaatee, hal dhismo ayaa laga yaabaa inaanay ku filnayn, markaa samaynta tijaabada oo ay weheliso falanqaynta joogtada ah waxay si weyn u wanaajin doontaa tayada koodka.

Xiriiro faa'iido leh

Sida loo habeeyo PVS-Studio gudaha Travis CI iyadoo la adeegsanayo tusaale ahaan emulator-ka ciyaarta ciyaarta PSP

Haddii aad rabto inaad maqaalkan la wadaagto dhagaystayaasha ku hadla Ingiriisiga, fadlan isticmaal xidhiidhka tarjumaadda: Maxim Zvyagintsev. Sida loo sameeyo PVS-Studio gudaha Travis CI iyadoo la adeegsanayo tusaalaha emulator-ka ciyaarta PSP.

Source: www.habr.com

Add a comment