Me pehea te whirihora i te PVS-Studio i Travis CI ma te whakamahi i te tauira o te emulator papatohu takaro PSP

Me pehea te whirihora i te PVS-Studio i Travis CI ma te whakamahi i te tauira o te emulator papatohu takaro PSP
Ko Travis CI he ratonga tukutuku tohatoha mo te hanga me te whakamatautau i nga rorohiko e whakamahi ana i a GitHub hei manaaki waehere puna. I tua atu i nga ahuatanga whakahaere i runga ake nei, ka taea e koe te taapiri i a koe ake mihi ki nga whiringa whirihoranga whanui. I roto i tenei tuhinga ka whirihorahia e matou a Travis CI ki te mahi me te PVS-Studio ma te whakamahi i te tauira waehere PPSSPP.

Whakataki

Travis CI he ratonga tukutuku mo te hanga me te whakamatautau i nga rorohiko. I te nuinga o te wa ka whakamahia tahi me nga mahi whakauru tonu.

PPSSPP - Emulator papatohu kēmu PSP. Ka taea e te kaupapa te peehi i te whakarewatanga o nga keemu mai i nga whakaahua kopae mo Sony PSP. I tukuna te kaupapa i te 1 o Noema 2012. Kua raihanatia a PPSSPP i raro i te GPL v2. Ka taea e te tangata te whakapai ake waehere puna kaupapa.

PVS-Studio — he kaitirotiro waehere pateko mo te rapu hapa me nga whakaraeraetanga pea kei roto i te waehere papatono. I roto i tenei tuhinga, mo te whakarereketanga, ka whakarewahia e matou te PVS-Studio ehara i te rohe i runga i te miihini a te kaiwhakawhanake, engari i roto i te kapua, ka rapu i nga hapa i roto i te PPSSPP.

Te whakatu Travis CI

Ka hiahia matou ki tetahi putunga i runga i te GitHub, kei reira te kaupapa e hiahiatia ana e matou, me te matua mo te PVS-Studio (ka taea e koe te tiki kī whakamātautau ranei kore utu mo nga kaupapa Open Source).

Haere tatou ki te pae Travis CI. Whai muri i te whakamanatanga ma te whakamahi i to putea GitHub, ka kite matou i te rarangi o nga putunga:

Me pehea te whirihora i te PVS-Studio i Travis CI ma te whakamahi i te tauira o te emulator papatohu takaro PSP
Mo te whakamatautau, i mawehe ahau i te PPSSPP.

Ka whakahohehia e matou te putunga e hiahia ana matou ki te kohikohi:

Me pehea te whirihora i te PVS-Studio i Travis CI ma te whakamahi i te tauira o te emulator papatohu takaro PSP
I tenei wa, kaore e taea e Travis CI te hanga i to maatau kaupapa na te mea kaore he tohutohu mo te hanga. Na kua tae ki te wa mo te whirihoranga.

I te wa o te tātaritanga, ka whai hua etahi taurangi ki a tatou, hei tauira, te matua mo te PVS-Studio, kaore e pai ki te tautuhi i roto i te konae whirihoranga. Na me taapiri nga taurangi taiao ma te whakamahi i nga tautuhinga hanga i Travis CI:

Me pehea te whirihora i te PVS-Studio i Travis CI ma te whakamahi i te tauira o te emulator papatohu takaro PSP
Ka hiahia matou:

  • PVS_USERNAME - ingoa kaiwhakamahi
  • PVS_KEY - kī
  • MAIL_USER - he imeera ka whakamahia hei tuku i te ripoata
  • MAIL_PASSWORD - kupuhipa imeera

Ko nga mea whakamutunga e rua he mea whiriwhiri. Ka whakamahia enei ki te tuku hua ma te mēra. Mena kei te pirangi koe ki te tohatoha i te ripoata ma tetahi atu huarahi, kaore koe e tohu.

Na, kua taapirihia e matou nga taurangi taiao e hiahiatia ana e matou:

Me pehea te whirihora i te PVS-Studio i Travis CI ma te whakamahi i te tauira o te emulator papatohu takaro PSP
Inaianei me hanga he konae .travis.yml ka tuu ki te putake o te kaupapa. Kei a PPSSPP he konae whirihoranga mo Travis CI, heoi, he nui rawa atu, kaore e tika mo te tauira, no reira me tino whakangawari ake ka waiho ko nga mea timatanga anake.

Tuatahi, me tohu te reo, te putanga o Ubuntu Linux e hiahia ana matou ki te whakamahi i roto i te miihini mariko, me nga kohinga e tika ana mo te hanga:

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'

Ko nga kohinga katoa kua whakarārangihia e hiahiatia ana mo te PPSSPP anake.

Inaianei ka tohuhia e matou te matrix hui:

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

He iti ake mo te waahanga Tuhinga. I roto i te Travis CI, e rua nga huarahi ki te hanga i nga whiringa hanga: ko te tuatahi ko te tautuhi i te rarangi o nga kaitoi, nga momo punaha whakahaere, nga taurangi taiao, me etahi atu, i muri mai ka hangaia he matrix o nga huinga katoa ka taea; ko te tuarua he tino tohu mo te matrix. Ae ra, ka taea e koe te whakakotahi i enei huarahi e rua me te taapiri i tetahi keehi motuhake, engari, ka keri, ka whakakorehia ma te whakamahi i te waahanga whakakore. Ka taea e koe te panui atu mo tenei i roto i Nga tuhinga a Travis CI.

Ko nga mea e toe ana ko te whakarato i nga tohutohu huihuinga motuhake mo te kaupapa:

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 taea e Travis CI te taapiri i a koe ake whakahau mo nga momo waahanga o te oranga o te miihini mariko. Wāhanga before_install ka mahia i mua i te whakaurunga o nga kete. Na tāuta, e whai ana i te whakaurunga o nga kete mai i te raarangi addons.apti tohuhia e matou i runga ake nei. Ko te huihuinga ake ka tu ki roto hōtuhi. Mena i pai nga mea katoa, katahi ka uru tatou ki roto muri_angitu (kei roto i tenei waahanga ka whakahaerehia e matou he tātaritanga pateko). Ehara enei i nga huarahi katoa ka taea te whakarereke, mena ka hiahia koe ki etahi atu, me titiro koe Nga tuhinga a Travis CI.

Mo te ngawari o te panui, i tukuna nga whakahau ki tetahi tuhinga motuhake .travis.sh, ka whakanohoia ki te pakiaka kaupapa.

Na kei a matou te konae e whai ake nei .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

I mua i te whakauru i nga kohinga, ka whakahouhia e matou nga waahanga iti. Ka hiahiatia tenei hei hanga i te PPSSPP. Me taapiri te mahi tuatahi ki .travis.sh (tohua te toronga):

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

Inaianei kua tae tika mai matou ki te whakarite i te whakarewanga aunoa o PVS-Studio ki Travis CI. Tuatahi me whakauru tatou i te kete PVS-Studio ki te punaha:

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
}

I te timatanga o te mahi travis_install ka whakaurua e matou nga kaitoi e hiahiatia ana ma te whakamahi i nga taurangi taiao. Na ki te te taurangi $PVS_ANALYZE toa uara Āe (i tohuhia e matou i te waahanga env i roto i te whirihoranga matrix), ka whakauruhia e matou te kete pvs-studio. I tua atu i tenei, ka tohua ano nga kohinga libio-tupapa-ssl-perl и libnet-ssleay-perl, heoi, e hiahiatia ana mo nga hua mēra, no reira kaore e tika mena kua whiriwhiria e koe tetahi atu tikanga mo te tuku i to ripoata.

mahi tango_tango ka tango me te wetewete i te puranga kua tohua:

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

Kua tae ki te wa ki te whakakotahi i te kaupapa. Ka tupu tenei i te waahanga hōtuhi:

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
}

Inaa, he whirihoranga taketake ngawari tenei, engari mo enei rarangi:

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

I tenei wahanga o te waehere i whakaritea e matou cmake haki mo te kaweake i nga whakahau whakahiato. He mea tika tenei mo te kaitirotiro waehere pateko. Ka taea e koe te panui atu mo tenei i roto i te tuhinga "Me pehea te whakahaere i te PVS-Studio i runga i te Linux me te macOS".

Mena i angitu te huihuinga, katahi ka tae atu muri_angitu, i reira ka mahia e matou he tātaritanga pateko:

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
}

Kia ata titiro ki nga rarangi e whai ake nei:

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

Ko te rarangi tuatahi ka whakaputa i te konae raihana mai i te ingoa kaiwhakamahi me te taviri i tohua e matou i te timatanga i te wa e whakatuu ana i nga taurangi taiao Travis CI.

Ko te rarangi tuarua ka tiimata tika te tātari. Kara -j ka tautuhi i te maha o nga miro hei tātari, haki -l tohu raihana, haki -o ka tautuhi i te konae mo te whakaputa i nga raarangi, me te haki -disableLicenseExpirationCheck e hiahiatia ana mo nga putanga whakamatautau, mai i te taunoa pvs-studio-analyzer ka whakatupato i te kaiwhakamahi kua tata te mutunga o te raihana. Kia kore ai e puta, ka taea e koe te tohu i tenei haki.

Kei roto i te kōnae rangitaki te putanga mata e kore e taea te panui me te kore e tahuri, no reira me matua panui koe i te konae. Me tuku nga poroporo poro-tahuri, a ko te putanga he kōnae html.

I tenei tauira, i whakatau ahau ki te tuku purongo ma te mēra ma te whakamahi i te whakahau sendemail.

Ko te mutunga, ka whiwhi matou i te konae e whai ake nei .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;

Inaianei kua tae ki te wa ki te pana i nga huringa ki te putunga git, ka mutu ka whakahaere aunoa a Travis CI i te hanga. Paatohia te "ppsspp" ki te haere ki nga ripoata hanga:

Me pehea te whirihora i te PVS-Studio i Travis CI ma te whakamahi i te tauira o te emulator papatohu takaro PSP
Ka kite tatou i te tirohanga o te hanga o naianei:

Me pehea te whirihora i te PVS-Studio i Travis CI ma te whakamahi i te tauira o te emulator papatohu takaro PSP
Mena kua tutuki pai te hanga, ka whiwhi matou i te imeera me nga hua o te tātaritanga pateko. Ko te tikanga, ehara ko te mēra anake te huarahi ki te whiwhi purongo. Ka taea e koe te whiriwhiri i tetahi tikanga whakatinana. Engari he mea nui kia mahara ka oti te hanga, kaore e taea te uru atu ki nga konae miihini mariko.

Hapa whakarāpopototanga

Kua tutuki pai i a maatau te waahanga tino uaua. Inaianei kia mohio tatou kei te whai hua a tatou mahi katoa. Kia titiro tatou ki etahi mea whakamere mai i te purongo tātaritanga pateko i tae mai ki ahau ma te mēra (ehara i te mea mo te kore noa i tohu ahau).

Te arotautanga kino

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

Whakatupato PVS-Studio: V597 Ka taea e te kaitoha te whakakore i te waea mahi 'memset', e whakamahia ana ki te horoi i te 'tau' buffer. Me whakamahi te mahi RtlSecureZeroMemory() hei ūkui i nga raraunga tūmataiti. sha1.cpp 325

Ko tenei waahanga waehere kei roto i te waahanga hashing haumaru, heoi, kei roto he hapa haumarutanga nui (CWE-14). Kia titiro tatou ki te rarangi huihuinga i hangaia i te wa e whakahiato ana i te putanga Debug:

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

Ko nga mea katoa kei te raupapa me te mahi whakamaumahara ka mahia, na reira ka tuhirua i nga raraunga nui i roto i te RAM, heoi, kaua e koa tonu. Me titiro ki te rarangi huihuinga o te putanga Tuku me te arotautanga:

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

Ka kitea mai i te raarangi, kaore i arohia e te kaitoi te piiraa whakamaumahara. Ko tenei na te mea i roto i te mahi sha1 i muri i te karanga whakamaumahara karekau he korero mo te hanganga CTX. Na reira, karekau e kitea e te kaikoipi he take mo te moumou i te wa tukatuka ki te tuhi i te mahara kaore e whakamahia a muri ake nei. Ka taea e koe te whakatika i tenei ma te whakamahi i te mahi RtlSecureZeroMemory ranei pera ki a ia.

Tika:

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

Whakataurite kore

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

Whakatupato PVS-Studio: V547 Ko te kupu 'leftvol >= 0' he pono tonu. sceAudio.cpp 120

Kia tupato ki tetahi atu peka mo te tuatahi if. Ka mahia te waehere mena he tikanga katoa taha maui > 0xFFFF || rightvol > 0xFFFF || taha maui < 0 || taha matau < 0 ka puta he teka. No reira, ka whiwhi tatou i nga korero e whai ake nei, ka tika mo tera atu peka: maui<= 0xFFFF, putunga matau <= 0xFFFF, taha maui >= 0 и Pukamatau >= 0. A hi‘o na i na parau hopea e piti. He mea tika ki te tirotiro he aha te tikanga e tika ana mo te mahia o tenei waahanga waehere?

Na ka taea e tatou te tango haumaru i enei korero here:

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

Ko tetahi atu ahuatanga. He momo hapa kei te huna i muri i enei tikanga taapiri. Kaore pea ratou i tirotirohia nga mea e hiahiatia ana.

Ctrl+C Ctrl+V Ka Patua Whakamuri

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 He rite tonu nga kupu-iti '!Memory::IsValidAddress(psmfData)' ki te taha maui me te taha matau o te '||' kaiwhakahaere. scePsmf.cpp 703

Kia tupato ki te haki o roto if. Kare koe e whakaaro he mea ke ki te tirotirohia mena he tika te wahi noho? psmfRaraunga, e rua te nui? No reira he ahua ke tenei ki ahau... Inaa, he tika tenei, he patopato, ko te whakaaro ko te tirotiro i nga tawhā whakauru e rua.

Kōwhiringa tika:

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

Taurangi kua warewaretia

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

Whakatupato PVS-Studio: V547 He teka tonu te korero 'rahi == 8'. syn-att.c 195

Kei te kōpaki tēnei hapa ext, no reira kaore e tino whai paanga ki te kaupapa, engari i kitea te bug i mua i taku kitenga, na reira ka whakatau ahau ki te waiho. I muri i nga mea katoa, ehara tenei tuhinga mo te arotake i nga hapa, engari mo te whakauru ki a Travis CI, kaore he whirihoranga o te kaitirotiro i mahia.

Taurangi rahi ka arawhitihia e te taumau, heoi, kaore i te whakamahia i roto i te waehere, tae noa ki te kaiwhakahaere if, e, o te akoranga, homai teka i te wa e tirotirohia ana nga tikanga, na te mea, e mahara ana tatou, rahi rite ki te kore. Kare hoki he tikanga o nga arowhai o muri mai.

Ko te ahua, i wareware te kaituhi o te wahanga waehere ki te tuhirua i te taurangi rahi i mua i tera.

Kāti

I konei ka mutu pea me nga he. Ko te kaupapa o tenei tuhinga ko te whakaatu i nga mahi a PVS-Studio me Travis CI, kaua hoki ki te tātari i te kaupapa i te mea ka taea. Mena kei te hiahia koe ki nga hapa nui ake me te ataahua, ka taea e koe te mihi ki a raatau konei :).

mutunga

Ma te whakamahi i nga ratonga tukutuku ki te hanga kaupapa me te mahi tātaritanga taapiri ka taea e koe te kimi raru maha i muri tonu i te hanumi waehere. Heoi, kare pea i te rawaka te hanga kotahi, no reira ko te whakarite whakamatautau me te tātaritanga pateko ka tino pai ake te kounga o te waehere.

hononga whaihua

Me pehea te whirihora i te PVS-Studio i Travis CI ma te whakamahi i te tauira o te emulator papatohu takaro PSP

Mena kei te pirangi koe ki te tiri i tenei tuhinga ki te hunga whakarongo ki te reo Ingarihi, whakamahia te hononga whakamaori: Maxim Zvyagintsev. Me pehea te whakarite i te PVS-Studio i Travis CI ma te whakamahi i te tauira o te emulator papatohu keemu PSP.

Source: will.com

Tāpiri i te kōrero