Enciklopedija zaštite od požara

X-Ray - igraći motor serije STALKER

X-Ray Engine je vlasnički motor za igre koji je stvorio GSC Game World za internu upotrebu. Velika većina igrača poznaje ovu tvrtku kao developera serije igara S.T.A.L.K.E.R. Upravo je na X-Rayu nastao izvorni dio "Stalkera" - Shadow of Chernobyl, kao i dva službena dodatka: Clear Sky i Call of Pripyat. Štoviše, planirano je da se modificirana verzija motora koristi za razvoj obećavajućeg projekta S.T.A.L.K.E.R. 2. Koji je, nažalost, zamrznut još 2011. godine.

Svrha

U u trenutku X-Ray Engine koriste uglavnom kreatori modova. Da, S.T.A.L.K.E.R je serija igara za koje je objavljen ogroman broj izmjena. Kako bi pomogao modderima, GSC Game World izdao je alat za razvojne programere - SDK (Software Development Kit). Ali GSC ga je zaboravio "opremiti" službenom dokumentacijom, pa su prvi tvorci moda morali raditi s motorom "na dodir". Srećom u vrijeme pisanja ovu recenziju, na mreži se već pojavio ogroman broj "priručnika", pa čak i tematskih foruma na kojima ljudi razmjenjuju iskustva sa SDK-om.

Tehnički podaci

Najnovija verzija X-Ray Engine podržava DirectX 11. Osim toga, engine podržava volumetrijsko osvjetljenje i složene efekte s velikim brojem čestica (poput dima). Osim toga, pruža prilično realističan prikaz složenih scena i radi s fizikom Ragdoll. Već prva verzija X-Ray Enginea omogućila je programerima da igri dodaju podršku za meke sjene, što se u vrijeme izlaska S.T.A.L.K.E.R Shadow of Chernobyl smatralo pravim tehničkim probojem, posebno za igru ​​s velikim otvorenim lokacijama .

Ključne značajke

  • prisutnost službenog SDK-a, koji koriste kreatori modova;
  • podrška za DirectX 11;
  • pružanje realistične fizike i vlastitog AI sustava (A-Life);
  • implementacija tehnologije reljefnog teksturiranja;
  • rad s mekim sjenama i volumetrijskom rasvjetom;
  • podrška za do četiri milijuna poligona u jednom okviru;
  • nedostatak službene dokumentacije od strane programera.

Velik broj korisnika Microsoftovih proizvoda prijavljuje gubitak aktivacije Windowsa 10 i pretvaranje Pro verzije u Home. Korisnici dobivaju obavijest o isteklom ključu, a prilikom pokušaja reaktivacije dobivaju pogrešku 0x803fa067 za Windows 10. Kako riješiti probleme i pokrenuti sustav - više o tome kasnije u članku.

Uzroci kvarova

Microsoft standardno nudi unos aktivacijskih ključeva za potvrdu autentičnosti, kao i pravilnu upotrebu instaliranu verziju sustava Windows.

Greška pri aktivaciji 0x803fa067 Windows 10

Pogreška 0x803fa067 prilikom aktivacije sustava Windows 10 može se pojaviti iz nekoliko razloga:

Zanimljivo znati! Tvrtka je službeno priznala da postoji problem s aktivacijskim poslužiteljem za Pro verzije (0x803fa067) za . Pritužbe su stigle od korisnika iz cijelog svijeta: Koreje, Japana i stanovnika drugih zemalja.

Korištenje alata za rješavanje problema s pogreškama

Funkcija rješavanja problema dostupna je samo ako kopija sustava Windows 10 (verzija 1607 i novija) još nije aktivirana. Ova usluga će vam omogućiti da riješite postojeće probleme s aktivacijom. Za korištenje funkcionalnosti korisnik mora biti administrator.


Pokrenite rješavanje problema ili ponovno unesite licencni ključ ponovno aktivira sustav

Da biste pokrenuli alat za rješavanje problema, slijedite ove korake:

      1. Kliknite na gumb "Start".
      2. Idite na odjeljak "Opcije".
      3. Zatim odaberite "Ažuriranja i sigurnost".
      4. I odaberite stavku "Aktivacija".
      5. Zatim kliknite redak "Rješavanje problema".

    Ako se servis ne može nositi s pogreškom, možete je pokušati popraviti sami ili zatražiti pomoć od tehnička podrška.


    Aktivacija sustava Windows 10

    Važno! Ako se prilikom instaliranja sustava Windows 10 pojavi pogreška 0x803fa067, možda će vam trebati potvrda o legalnoj kupnji proizvoda: skeniranje računa o kupnji, naljepnice i kopije pisama koja označavaju korespondenciju s trgovinama elektroničke distribucije.

    Microsoft izvješćuje da pojava koda pogreške 0x803fa067 prilikom aktivacije sustava Windows 10 može biti posljedica činjenice da trenutno besplatno ažuriranje Najnovija verzija nije instalirana.

    Rješenje pogreške 0x803fa067 prilikom aktivacije Windows 10

    Za aktivaciju sustava Windows 10 potrebna je internetska veza. Da biste dijagnosticirali i znali kako popraviti pogrešku 0x803fa067 u sustavu Windows 10, trebali biste slijediti niz uzastopnih koraka:


    Ako gornji koraci ne pomognu, obratite se

Igre na računalu odličan su način za “ubijanje vremena”, zabavu i jednostavno opuštanje. Čak i ako nije strastveni igrač, osoba često ima svoje preferencije u području razvoja igara. Neki ljudi vole pucačine, drugi ne mogu živjeti bez strategija.

Davne 2006. godine pravi događaj bio je izlazak STALKER: Shadow of Chernobyl. Igra je stekla milijune obožavatelja diljem svijeta. Posljednja verzija, Call of Pripyat, objavljena je 2009. godine, nakon čega se broj ljubitelja igre naglo povećao: atmosfera černobilske nuklearne elektrane toliko je zadivljujuća da čak i odrasli mogu satima sjediti uz nju.

Nažalost, mnogi se korisnici žale da ih greška XRay Enginea sprječava da uopće uživaju u igri. Što uzrokuje njegovu pojavu i kako ga se riješiti? To je upravo ono čemu je posvećen naš članak.

Što je XRay?

Da biste saznali kako riješiti problem, morate detaljnije razumjeti njegov glavni uzrok. Počnimo s činjenicom da je XRay motor igre koji se koristi u svim dijelovima Stalkera.

Napravljen je posebno za ovu igru, a to se dogodilo davne 2001. godine. Budući da se sam projekt STALKER pokazao kao jednostavno epska “dugogradnja”, svjetlo dana je ugledao tek pet godina kasnije. U početku su ga programeri namjeravali koristiti isključivo s DirectX 8, ali do trenutka kada je objavljen prvi dio trilogije, dodali su podršku za DirectX 9. Godine 2008., kada je objavljeno izdanje dugotrajnog Clear Skya, tamo je također dodana verzija 10.

Konačno, "Call of Pripyat" također je dobio DirectX 11. Međutim, s obzirom na neke "hrapavosti" u samom kodu igre, motor nije mogao u potpunosti osloboditi puni potencijal 11. verzije.

Koja je manifestacija greške?

Ovaj se trenutak ne može brkati ni s čim. Igra se iznenada zaustavlja i zatim ruši na radnoj površini. Budući da dijaloški okvir koji opisuje šifru pogreške prikazuje veliku bubu, XRay Engine se na forumima obožavatelja često naziva "zelena katastrofa" i "buba nesreća".

Ipak, dosta lirizma. Koji je razlog za pojavu "bube"?

Razlozi za pojavu

Jao, jednostavno nema jasnog odgovora na tako goruće pitanje. Programeri iz GSC-a nisu posebno komentirali razloge čak ni u vrijeme dok je tvrtka još postojala, a sada je potpuno besmisleno nadati se detaljnim odgovorima.

Metodom pokušaja i pogrešaka utvrđeno je da se igra najčešće ruši na računalima onih korisnika koji nemaju svježe vozače na video karticu. Dakle, ako ne znate koja je verzija ovog softvera instalirana na vašem računalu, vrijeme je da ga ažurirate.

Ažuriramo samu igru

Ako ste svjedočili pojavljivanju Clear Skya, onda se jako dobro sjećate svih onih “laskavih” epiteta koje su igrači dodijelili programerima. I postojao je razlog za to! Bilo je zapravo potpuno nemoguće igrati, a pogreška XRay Enginea ipak je bila minorna!

Pogledajte samo besmrtne snajperiste i potpuno praznu “Tamnu dolinu”! Mogao sam normalno igrati samo s dodatkom 1.5.04, a sva spremanja koja su napravljena na prethodnim verzijama nisu radila. Jednom riječju, ako imate internet, nemojte biti lijeni i idite na web mjesto programera. Sve postojeće zakrpe za sve igre u seriji su tu, tako da ih samo trebate preuzeti i instalirati. U tom će se slučaju pogreška XRay Enginea u Stalkeru vjerojatno pojavljivati ​​puno rjeđe.

Piratske verzije

Budući da programeri nisu uzeli u obzir interese krajnjih korisnika, igra je zaštićena od ilegalnog kopiranja poznatim sustavom StarForce. Nije iznenađujuće da mnogi korisnici radije preuzimaju NoDVD čak iu slučajevima kada imaju licencirani disk s igrom u rukama.

Nažalost, mnoge od ovih "pilula" uzrokuju pojavu pogreške XRay Enginea. Što učiniti ako ne želite pokvariti operativni sustav StarForce, ali također ne želite stalno vidjeti "zelenu grešku"?

Jao, postoji samo jedan izlaz. Kupite igru ​​na Steamu. Budući da je u ovoj trgovini digitalnog sadržaja igra dostupna i stranim korisnicima (gdje je StarForce načelno zabranjen), sigurno ćete se riješiti problema.

Drugi razlozi

Drugi važan faktor koji može pridonijeti pogrešci može biti hardver vašeg računala. Previše nove ili stare komponente možda se neće slagati s tajanstvenim ukrajinskim motorom, nakon čega će vas stalno progoniti pogreška XRay Enginea. “Call of Pripyat” je trenutno “najsvježija” verzija igre, koja ima najmanje uobičajenih hardverskih problema. “Shadow of Chernobyl” i “Clear Sky” su mnogo stariji u tom pogledu, pa stoga često potpuno odbijaju biti prijatelji s novim video karticama.

modifikacije

Kad je “Stalker” tek objavljen, oduševljenju igrača nije bilo kraja. Igra je stvarno dala osjećaj gotovo neograničene slobode. GG je mogao ići bilo gdje, praktički neograničen u smjeru svog kretanja. Kako je vrijeme prolazilo, entuzijazam je bivao sve manji.

Postalo je jasno da programeri neće vratiti izrezane lokacije, a u igri nije bilo dovoljno akcije. Tada su se pojavili MOD-ovi (modifikacije igre), koji su ponekad pravili stvarno globalne promjene u Stalkeru.

Najpoznatiji je bio projekt AMK, bez kojeg igrači s iskustvom sada ne preporučuju dovršavanje "Sjene Černobila". Neki modovi su bili vrlo uspješni, neki ne toliko. Ali gotovo svi imaju pogrešku XRay Enginea. “Call of Pripyat” je puno manje podložan ovom fenomenu iz razloga što ima puno manje modova za ovu igru.

Dakle, ako koristite MOD, onda postoji samo jedan izlaz - izravno komunicirati s programerom ili pretražiti stotine stranica foruma, gdje igrači ponekad postavljaju dobre domaće "zakrpe" koje, pod određenim uvjetima, mogu zapravo eliminirati ovu grešku. Naravno, ne možete se uvijek tome nadati, budući da je u slučaju XRay Enginea (posebno "Call of Pripyat") teško reći nešto konkretno.

varalice

Ostali igrači, kojima su neke razine preteške, često se previše zanose varalicama uz pomoć kojih si mogu sagraditi neograničen broj oružja i opreme te dobiti najbolje artefakte koji su im na raspolaganju.

Kao i obično, sve morate platiti. U ovom konkretnom slučaju, to se izražava u gubitku stabilnosti programa, kada se pogreška XRay Enginea u Stalkeru počinje pojavljivati ​​svakih nekoliko sekundi. Ako se to dogodi, jednostavno pokušajte potražiti drugu verziju varalice. Srećom, danas ih se na internetu može naći u tisućama primjeraka. Konačno, pokušajte pošteno proći tešku razinu! Možda ćete na ovaj način dobiti mnogo više zadovoljstva od igre.

"šamanizam"

Nažalost, čak i najlogičnije i najispravnije, na prvi pogled, metode ne uspijevaju kada je u pitanju ovaj motor igre. Na primjer, ako ne igrate s "nativnom" rezolucijom, to bi mogao biti razlog ove pogreške.

Rezolucija vašeg monitora je 1280x1024, ali više volite igrati na 800x600? Vjerojatno se XRay Engine pojavljuje u Stalkeru upravo zbog toga. Promijenite razlučivost na izvornu (preporučeno za ovaj monitor). U nekim slučajevima takva jednostavna mjera pomaže u potpunosti ukloniti pogrešku.

Ponekad se problem javlja kada je datoteka stranice postavljena na premalu. U idealnom slučaju, njegova veličina bi trebala biti dvostruko veća od količine RAM-a.

Kako povećati veličinu swap datoteke?

To je zapravo vrlo lako učiniti. Da biste to učinili, desnom tipkom miša kliknite "Moje računalo", a zatim odaberite "Svojstva" iz kontekstnog izbornika. U dijaloškom okviru koji se otvori odaberite opciju " Dodatne mogućnosti sustavi." Kliknite gumb "Opcije" u stavci "Performanse", a zatim odaberite karticu "Napredno". Zatim morate kliknuti "Promijeni" u stavci "Virtualna memorija", zatim tamo unijeti željenu vrijednost i lijevom tipkom miša kliknuti na "U redu".

Povremeno se igra može pokrenuti ako sustav ima manje od 512 MB memorije, ali to ne biste trebali učiniti: pogreška XRay Enginea i strašne "kočnice" i dalje vam neće dopustiti da igrate.

Na kraju, moramo razgovarati o značajkama same igre. Preporučljivo je onemogućiti nepotrebne mogućnosti poboljšanja slike. Ova izjava je posebno istinita kada je u pitanju “Stalker Call of Pripyat”. XRay Engine se vrlo često pojavljivao u verziji 1.6.0 kada je igrač pokušavao postaviti maksimalne postavke kvalitete.

I više o vozačima. Nije tako rijetko da pogreška muči one korisnike čija računala imaju diskretnu audio karticu. Pokušajte ažurirati upravljačke programe za njega, au posebno teškim slučajevima onemogućite uređaj s upravljačke ploče. Pažnja! Učinite to pažljivo jer inače možete izgubiti sav zvuk na računalu.

Što reći na kraju cijele naše priče? Želimo vam da vas nijedna greška ne spriječi u postavljanju novih rekorda igre! Nadamo se da će vam naše preporuke pomoći u ovom pitanju.

    Sadržaj
  • Lada XRAY, uz model Vesta, sada se može nazvati novom nadom i osloncem AvtoVAZ-a. To su automobili koji predstavljaju lice tvrtke i nova runda u svom razvoju. Nije iznenađujuće da je razvoj novog X-Ray hatchbacka proveden s najvećom pažnjom. Štoviše posebnu pozornost pažnja je posvećena ne samo izgledu, već i tehničkoj komponenti. A motor je, kao što znate, "srce automobila", tako da su motori uvijek bili prioritet za inženjere tvrtke.

    Kratke karakteristike Lada X-Ray motora.

    Popis Lada X-Ray motora

    Ukupno će hatchback dobiti tri motora, s nekoliko domaćih jedinica razrijeđenih s jednim "prekomorskim". Popis motora:

    Tehničke karakteristike i značajke dizajna

    Svi pogonski agregati novog modela prilično su moderni i zadovoljavaju sve aktualne kriterije koji se postavljaju za ovaj segment.

    VAZ-21129

    Ovo je domaći benzinski motor, koji se proizvodi već duže vrijeme, a ugrađen je i na druge modele AvtoVAZ-a, uključujući Lada Vesta.

    • volumen - 1.596 cm³;
    • konfiguracija – in-line;
    • mjesto - poprečno;
    • broj cilindara - 4;
    • broj ventila – 16;
    • maksimalna snaga – 106 l. S. (78,2 kW) pri 5.800 o/min;
    • maksimalni okretni moment – ​​148 Nm pri 4.200 o/min;
    • razvodni pogon - remen;
    • dinamika – 11,4 sek.;
    • maksimalna brzina - 176 km / h;
    • omjer kompresije - 11 jedinica;
    • promjer cilindra – 82 mm;
    • hod klipa - 75,6 mm;
    • ekološki standardi - Euro-5;
    • gorivo - AI-95;
    • potrošnja goriva (grad/autocesta/mješoviti način) – 9,3 l/7,2 l/5,9 l.
    • Potencijal – 400+ l. S.
    • Bez gubitka resursa - 150 l. S.

    Rentgen motora VAZ 21129.

    Motor Lada X-Ray VAZ-21129 nastao je na temelju motora serije VAZ-21127, koji je namijenjen modelu Priora. U njega su unesene brojne promjene i poboljšanja. Najznačajnija je upotreba seta zaklopki u usisnoj grani, preko kojih se mijenja njezina duljina, što jamči rad pri malim i velikim brzinama u optimalnom režimu. Osim toga, inženjeri su napustili senzor u dizajnu motora maseni protok zrak. Umjesto njih ugrađena su dva druga uređaja - senzori temperature zraka i apsolutnog tlaka. Takvo rješenje pruža mogućnost potpunije kontrole nad zapaljivom smjesom, a također eliminira mogućnost "plutajuće" brzine u stanju mirovanja.

    Iza uobičajene zapremine od 1,6 litara i 16 ventila skrivaju se mnoge nijanse.

    Također u dizajnu motora primijenjena su nova rješenja za ovjes agregata koji je ugrađen na podokvir, a promjene su napravljene i na ispušnom i usisnom sustavu. Ove mjere motoru su, između ostalog, jamčile smanjenje buke pri radu, kao i smanjenje toksičnosti i potrošnje goriva.

    Ova priča detaljno govori o motoru VAZ 21129:

    HR16DE

    Motor Renault-Nissan H4M-HR16DE osigurali su partneri AvtoVAZ-a iz Alijanse Renault Nissan. Proizvodi se dosta dugo i uspješno je instaliran na mnogim drugim modelima francuskih i japanskih tvrtki - Nissan Tiida, Nissan Wingroad, Nissan Note, Lada Vesta, Nissan Qashqai i drugi.

    X-Ray HR16DE motor u punom sjaju.

    • volumen - 1.598 cm³;
    • konfiguracija – in-line;
    • mjesto - poprečno;
    • broj cilindara - 4;
    • broj ventila – 16;
    • vrsta snage - distribuirano ubrizgavanje goriva s elektroničkom kontrolom;
    • maksimalna snaga – 110 l. S. (81 kW) pri 5.500 o/min;
    • maksimalni okretni moment – ​​150 Nm pri 4.000 o/min;
    • razvodni pogon – lanac;
    • dinamika – 11,1 sek.;
    • maksimalna brzina – 181 km/h;
    • omjer kompresije - 10,7 jedinica;
    • promjer cilindra – 76 mm;
    • hod klipa - 88 mm;
    • ekološki standardi – Euro-4/5;
    • gorivo – AI-92/95;
    • potrošnja goriva (grad/autocesta/mješoviti način) – 8,9 l/6,8 l/5,6 l.
    • Potencijal – 150+ l. S.
    • Bez gubitka resursa - 125 l. S.

    Ovaj agregat Lada X-Ray ima nekoliko značajki. Najkarakterističnije je smanjenje snage - dok na drugim modelima varira od 114 do 118 KS. s., zatim je u slučaju X-Raya smanjena na 110 KS. p., što je učinjeno kako bi se ovaj motor prilagodio stvarnosti Rusije i drugih zemalja ZND-a.

    Upotreba lanca u razvodnom pogonu čini ga a priori pouzdanijim.

    Dakle, umjesto uobičajenog remena za vlasnike Lade, u njegovom dizajnu koristi se lanac, što značajno povećava pouzdanost, jer se ne lomi i ne rasteže brzo. Trenutno nema modernih hidrauličkih kompenzatora - umjesto njih postoje obični podesivi ventili. Međutim, postupak podešavanja gurača neće biti potreban prije 80 000 - 100 000 km. Među ostalim značajkama, može se istaknuti korištenje kompleksa za promjenu vremena ventila, fiksiranje faznog mjenjača izravno na usisnu osovinu, prisutnost para mlaznica u svakom cilindru, kao i korištenje elektroničkog ventila za gas.

    Odbijanje hidrauličkih kompenzatora dovodi do potrebe za podešavanjem ventila.

    Osim toga, tijekom procesa modernizacije smanjeni su pokazatelji trenja komponenti agregata Lada X-Ray. To je postignuto upotrebom fluornog premaza u vodilici lanca, poliranjem (ogledalo), kao i strojna obrada koljenasto vratilo. U praznom hodu smanjeni su gubici (goriva i pumpanja), što je osigurano povećanjem kuta pretvorbe C-VTC, kao i preračunavanjem upravljanja (privremeno).

    VAZ-21179

    Ovo je novi domaći motor, razvijen posebno za modele X-Ray i Vesta. Kao osnova za njega odabrana je pogonska jedinica serije VAZ 21126, od koje je posuđen blok cilindra. Međutim, tu njihove sličnosti prestaju.

    Najsnažniji u liniji je motor VAZ-21179.

  1. zapremina – 1.774 cm³;
  2. konfiguracija – in-line;
  3. mjesto - poprečno;
  4. broj cilindara - 4;
  5. broj ventila – 16;
  6. vrsta snage - distribuirano ubrizgavanje goriva s elektroničkom kontrolom;
  7. maksimalna snaga – 122 l. S. (90 kW) pri 6.050 o/min;
  8. maksimalni okretni moment – ​​170 Nm pri 3.750 o/min;
  9. razvodni pogon - remen;
  10. broj bregastih osovina - 2 (tip DOHC);
  11. dinamika – 10,9 sek.;
  12. maksimalna brzina - 186 km / h;
  13. omjer kompresije - 9,8 jedinica;
  14. hod klipa - 84 mm;
  15. ekološki standardi - Euro-5;
  16. gorivo - AI-95;
  17. potrošnja goriva (grad/autocesta/mješoviti način) – 8,6 l/6,8 l/5,8 l.
  • Potencijal - nema podataka;
  • Bez gubitka resursa - nema podataka.

Ovaj Lada X-Ray motor upečatljivo se razlikuje od ostalih VAZ motora. U dizajnu agregata korišten je novi prigušni ventil, bez mehaničkog pogona, glava cilindra opremljena je novim ventilima (laganim) iz Mahlea, a dodatni uljni kanali povezani su s faznim regulatorom.

Prigušni ventil nema mehanički pogon.

Veći hod klipa osigurao je povećanje radnog volumena, koljenasto vratilo karakterizira povećan radijus radijusa, a ulazni kanali kolektora tvrtke Ecoalliance (Rusija) povećani su u promjeru na 39 mm. Senzor za kisik isporučuje Bosch, a pumpu za kisik GMB (Koreja). Ista korejska tvrtka odgovorna je za isporuku uljne pumpe s povećanim učinkom.

Radilice imaju povećan radijus radijusa.

Marka Federal Mogul isporučuje grupu klipnjača i klipa (lagani tip), a njemačka tvrtka INA isporučuje automatske zatezače zupčastog remena opremljene parom valjaka. Rail goriva je kupljen od koncerna Continental. Njegove brizgaljke karakterizira povećana učinkovitost, zbog čega je uzorak prskanja posebno prilagođen radu novog X-Ray motora.

Sama bregasta vratila dolaze iz Koreje.

Kao što vidite, unatoč ruskom razvoju, značajan dio komponenti kupuje se od stranih tvrtki.

Video prikazuje proces sastavljanja novog 1,8-litrenog motora za Lada X-Ray:

X-Ray je kreirala ukrajinska tvrtka GSC GameWorld za igru ​​S.T.A.L.K.E.R.: Shadow of Chernobyl. Motor uključuje renderiranje s podrškom za DirectX 8.1/9.0c/10/10.1/11, motore fizike i zvuka, multiplayer i sustav umjetne inteligencije A-Life. Nakon toga, tvrtka je stvorila verziju 2.0 motora za svoju novu igru, ali razvoj je zaustavljen, a izvorni kodovi su procurili online.

Projekt se, zajedno sa svim svojim ovisnostima, jednostavno sastavlja u Visual Studio 2015. Za testiranje smo koristili izvorni kod verzije 1.6 motora s GitHub repozitorija i statički analizator koda PVS-Studio 6.04 koji se može preuzeti s link.

Kopiraj-zalijepi

Prvo, pogledajmo pogreške povezane s kopiranjem koda. Scenarij njihovog pojavljivanja u različitim slučajevima obično je sličan: kopirali su kod, promijenili neke od varijabli, a neke zaboravili. Takve se pogreške mogu brzo proširiti bazom koda, a bez statičkog analizatora vrlo ih je lako promašiti.

MxMatrix& MxQuadric::homogeneous(MxMatrix& H) const ( .... unsigned int i, j; for(i=0; i Upozorenje PVS-Studio: V533 Vjerojatno je da se unutar operatora "for" povećava pogrešna varijabla. Razmotrite pregled "i". mxqmetric.cpp 76

Analizator je to otkrio u ugniježđenoj petlji za varijabla se povećava ja, a varijabla je provjerena j, što dovodi do beskonačne petlje. Najvjerojatnije su ga jednostavno zaboravili promijeniti prilikom kopiranja.
void CBaseMonster::settings_read(CInifile const * ini, LPCSTR odjeljak, SMonsterSettings &data) ( .... if (ini->line_exist(ppi_section,"color_base")) sscanf(ini->r_string(ppi_section,"color_base"), "%f,%f,%f", &data.m_attack_effector.ppi.color_base.r, &data.m_attack_effector.ppi.color_base.g, &data.m_attack_effector.ppi.color_base.b); if (ini->line_exist(ppi_section ) ,"color_base")) sscanf(ini->r_string(ppi_section,"color_gray"), "%f,%f,%f", &data.m_attack_effector.ppi.color_gray.r, &data.m_attack_effector.ppi.color_gray. g , &data.m_attack_effector.ppi.color_gray.b); if (ini->line_exist(ppi_section,"color_base")) sscanf(ini->r_string(ppi_section,"color_add"), "%f,%f,%f " , &data.m_attack_effector.ppi.color_add.r, &data.m_attack_effector.ppi.color_add.g, &data.m_attack_effector.ppi.color_add.b);
PVS-Studio upozorenja:

  • V581 Uvjetni izrazi operatora "if" koji se nalaze jedan pored drugog su identični. Provjerite linije: 445, 447. base_monster_startup.cpp 447
  • V581 Uvjetni izrazi operatora "if" koji se nalaze jedan pored drugog su identični. Provjerite linije: 447, 449. base_monster_startup.cpp 449
U ovom se fragmentu u nizu koristi nekoliko identičnih uvjetnih izraza. Očito ga treba zamijeniti baza_boje na boja_siva I boja_dodavanje prema šifri u tijelu ako grane .
/* obradi jednu izjavu */ static void ProcessStatement(char *buff, int len) ( .... if (strncmp(buff,"\\pauthr\\",8) == 0) ( ProcessPlayerAuth(buff, len) ); ) else if (strncmp(buff,"\\getpidr\\",9) == 0) ( ProcessGetPid(buff, len); ) else if (strncmp(buff,"\\getpidr\\",9) == 0) ( ProcessGetPid(buff, len); ) else if (strncmp(buff,"\\getpdr\\",8) == 0) ( ProcessGetData(buff, len); ) else if (strncmp(buff, "\\setpdr\\",8) == 0) ( ProcessSetData(buff, len); ) )
Upozorenje PVS-Studio: V517 Otkrivena je upotreba uzorka "if (A) (...) else if (A) (...)". Postoji vjerojatnost prisutnosti logičke pogreške. Provjerite retke: 1502, 1505. gstats.c 1502

Kao i u prethodnom primjeru, ovdje se koriste dva identična uvjeta ( strncmp(buff,"\\getpidr\\",9) == 0). Teško je sa sigurnošću reći radi li se o bugu ili samo o nedostupnom kodu, ali je svakako vrijedan pažnje. Moguće je da bi trebali biti blokovi sa dobitipidr/setpidr po analogiji sa dobitipdr/setpdr.
class RGBAMipMappedCubeMap ( .... size_t height() const ( return cubeFaces.height(); ) size_t width() const ( return cubeFaces.height(); ) .... );
Upozorenje PVS-Studio: V524 Čudno je da je tijelo funkcije "width" potpuno ekvivalentno tijelu funkcije "height". tpixel.h 1090

Metode visina() I širina() imaju isto tijelo. S obzirom da se izračunavaju dimenzije stranica kocke, ovdje možda i nema greške. Ali bolje je ponovno napisati metodu širina() kako slijedi:
size_t width() const ( return cubeFaces.width(); )

Zlouporaba jezika C++

C++ je prekrasan jezik koji programeru daje mnogo mogućnosti... da si puca u nogu na posebno okrutan način. Nedefinirano ponašanje, curenje memorije i, naravno, greške pri upisu - o greškama ove vrste raspravljat ćemo u ovom odjeljku.

Predložak struct _matrix33 ( javno: typedef _matrix33 Sebstvo;
Upozorenje PVS-Studio typedef Self& SelfRef;

.... IC SelfRef sMTxV(Tvector& R, float s1, const Tvector& V1) const ( R.x = s1*(m * V1.x + m * V1.y + m * V1.z); R.y = s1*(m * V1.x + m * V1.y + m * V1.z); R.z = s1*(m * V1.x + m * V1.y + m * V1.z) ....) : V591 Funkcija koja nije void trebala bi vratiti vrijednost. _matrica33.h 435 Na kraju se metoda preskače
vratiti *ovo
Upozorenje PVS-Studio. Prema standardu, takav kod će dovesti do nedefiniranog ponašanja. Budući da je povratna vrijednost referenca, to će najvjerojatnije uzrokovati rušenje programa pri pokušaju pristupa povratnoj vrijednosti.

ETOOLS_API int __stdcall ogg_enc(....) ( .... FILE *in, *out = NULL; .... input_format *format; .... in = fopen(in_fn, "rb"); if(in == NULL) return 0; format = open_audio_file(in, &enc_opts); if(!format)(fclose(in); return 0; ); out = fopen(out_fn, "wb"); (fclose(out); return 0;) .... ) : V575 Null pokazivač se prosljeđuje u funkciju "fclose". Provjerite prvi argument. ogg_enc.cpp 47 Dovoljno zanimljiv primjer. Analizator je otkrio da argument u pozivu fclose jednaki nullptr
, što poziv funkcije čini besmislenim. Može se pretpostaviti da je potok trebao biti zatvoren< hxw; i++) { DWORD col; GetPixel_ARGB8(&col, i); DWORD a = (col >> 24) && 0x000000FF;<< 24) | (r << 16) | (g << 8) | b; SetPixel_ARGB8(i, col); } }
DWORD b = (kolona >> 16) && 0x000000FF;

  • DWORD g = (kolona >> 8) && 0x000000FF;
  • DWORD r = (kolona >> 0) && 0x000000FF;
  • stupac = (a
  • PVS-Studio upozorenja:
V560 Dio uvjetnog izraza uvijek je istinit: 0x000000FF. nvi_image.cpp 170 V560 Dio uvjetnog izraza uvijek je istinit: 0x000000FF. nvi_image.cpp 171 V560 Dio uvjetnog izraza uvijek je istinit: 0x000000FF. nvi_image.cpp 172

V560 Dio uvjetnog izraza uvijek je istinit: 0x000000FF. nvi_image.cpp 173
U ovom dijelu koda miješaju se logičke i bitne operacije. Rezultat neće biti onakav kakav je programer očekivao:
kol
uvijek će biti jednak 0x01010101 bez obzira na ulazne podatke.
Upozorenje PVS-Studio Ispravna opcija:

DWORD a = (kolona >> 24) & 0x000000FF; DWORD b = (kolona >> 16) & 0x000000FF; DWORD g = (kolona >> 8) & 0x000000FF; DWORD r = (kolona >> 0) & 0x000000FF; Još jedan primjer čudnog koda: VertexCache::VertexCache() ( VertexCache(16); )
: V603 Objekt je kreiran, ali se ne koristi. Ako želite pozvati konstruktor, treba koristiti "this->VertexCache::VertexCache(....)". vertexcache.cpp 6
Upozorenje PVS-Studio Umjesto pozivanja jednog konstruktora iz drugog za inicijalizaciju instance, novi objekt tipa bit će kreiran i odmah uništen

VertexCache . Kao rezultat toga, članovi stvorenog objekta ostat će neinicijalizirani. I BOOL CActor::net_Spawn(CSE_Abstract* DC) ( .... m_States.empty(); .... ): . Kao rezultat toga, članovi stvorenog objekta ostat će neinicijalizirani.: V530 Potrebno je koristiti povratnu vrijednost funkcije "empty". actor_network.cpp 657

Analizator upozorava da se vrijednost koju vraća funkcija ne koristi. Čini se da je programer pomiješao metode prazan() jasan() . Kao rezultat toga, članovi stvorenog objekta ostat će neinicijalizirani. ne briše niz, ali provjerava da li je prazan. Takve se greške često javljaju u razne projekte . Problem je u tome što ime nije očito: neki to doživljavaju kao akciju - uklanjanje. Da biste izbjegli takve dvosmislenosti, bolje je dodati BOOL CActor::net_Spawn(CSE_Abstract* DC) ( .... m_States.empty(); .... ) ima glagole

, je na početku metode: doista,

isEmpty()
S
Upozorenje PVS-Studio teško zbuniti.

Slično upozorenje: V530 Potrebno je koristiti povratnu vrijednost funkcije "unique". uidragdroplistex.cpp 780 argumenti su zamijenjeni i kao rezultat međuspremnik nije resetiran kao što je izvorno zamišljeno. Ovakva greška može živjeti u projektu jako dugo jer ju je vrlo teško otkriti. Na takvim mjestima programeru u pomoć dolazi statički analizator.

Ispravna uporaba V530 Potrebno je koristiti povratnu vrijednost funkcije "unique". uidragdroplistex.cpp 780:
memset(buffer, 0, kapacitet*linijaKapacitet);
Sljedeća pogreška povezana je s netočno sastavljenim logičkim izrazom.
void configs_dumper::dumper_thread(void* my_ptr) ( .... DWORD wait_result = WaitForSingleObject(this_ptr->m_make_start_event, INFINITE); while (wait_result != WAIT_BANDONED) || (wait_result != WAIT_FAILED)) .... )
Upozorenje PVS-Studio: V547 Izraz je uvijek istinit. Vjerojatno bi se ovdje trebao koristiti operator "&&". configs_dumper.cpp 262

Izrazi poput "x != a || x != b" su uvijek istiniti. Najvjerojatnije umjesto operatora || operator && se podrazumijevao.

Više o pogreškama u logičkim izrazima možete pročitati u članku “Logički izrazi u C/C++ Kako profesionalci griješe.”
void SBoneProtections::reload(const shared_str& bone_sect, IKinematics* kinematics) ( .... CInifile::Sect &protections = pSettings->r_section(bone_sect); for (CInifile::SectCIt i=protections.Data.begin(); protections .Data.end() != i; ++i) (string256 međuspremnik; BoneProtection BP; .... BP.BonePassBullet = (BOOL) (atoi(_GetItem(i->second.c_str(), 2, međuspremnik) )>0,5f); .... ) )
Upozorenje PVS-Studio: V674 "0.5f" literal tipa "float" uspoređuje se s vrijednošću tipa "int". zaštita kostiju.cpp 54

Analizator je otkrio usporedbu cjelobrojne vrijednosti s realnom konstantom. Moguće je da je ovdje, po analogiji, trebala biti korištena funkcija atof, ne atoi, u drugom slučaju vrijedi prepisati ovu usporedbu tako da ne izgleda sumnjivo. Međutim, samo programer koji ga je napisao može sa sigurnošću reći je li ovaj primjer pogrešan ili ne.
klasa IGameObject: javni virtualni IFactoryObject, javni virtualni ISpatial, javni virtualni ISheduled, javni virtualni IRenderable, javni virtualni ICollidable ( public: .... virtualni u16 ID() const = 0; .... ) BOOL CBulletManager::test_callback(const collide::ray_defs& rd, IGameObject* objekt, LPVOID parametri) ( bullet_test_callback_data* pData = (bullet_test_callback_data*)params; SBullet* bullet = pData->pBullet; if((object->ID() == bullet->parent_id) && (bullet->fly_dist flags.ricochet_was)) return FALSE;
Upozorenje PVS-Studio: V595 Pokazivač "objekta" korišten je prije nego što je provjeren u odnosu na nullptr. Provjerite linije: 42, 47. level_bullet_manager_firetrace.cpp 42

Provjera pokazivača objekt za jednakost fclose ide nakon dereferenciranja objekt->ID(). U slučaju objekt je jednako nullptr, to će uzrokovati rušenje programa.
#ifdef _EDITOR BOOL WINAPI DllEntryPoint(....) #else BOOL WINAPI DllMain(....) #endif ( switch (ul_reason_for_call) ( .... case DLL_THREAD_ATTACH: if (!strstr(GetCommandLine(), "-editor ")) CoInitializeEx(NULL, COINIT_MULTITHREADED); timeBeginPeriod(1); break; .... ) return TRUE; )
Upozorenje PVS-Studio: V718 Funkcija "CoInitializeEx" ne bi se trebala pozivati ​​iz funkcije "DllMain". xrcore.cpp 205

U tijelu DllMain Ne možete koristiti neke WinAPI funkcije, uključujući CoInitializeEx. To možete provjeriti čitanjem dokumentacije na MSDN-u. Nemoguće je dati definitivan savjet o tome kako prepisati ovu funkciju, ali vrijedi razumjeti da je takva situacija opasna jer može dovesti do međusobnog blokiranja niti ili nenormalnog prekida.

Greške u prioritetima

int sgetI1(unsigned char **bp) ( int i; if (flen == FLEN_ERROR) return 0; i = **bp; if (i > 127) i -= 256; flen += 1; *bp++; return i ;)
Upozorenje PVS-Studio: V532 Razmotrite provjeru izraza uzorka "*pointer++". Vjerojatno je mislio: "(*pokazivač)++". lwio.c 316

Pogreška je povezana s korištenjem inkrementa. Radi jasnoće, prepišimo ovaj izraz stavljajući zagrade:
*(bp++);
Odnosno, sadržaj se neće prebaciti na adresu bp, već sam pokazivač koji je u ovom kontekstu besmislen. Dolje u kodu postoje fragmenti poput *bp += N, zbog čega sam zaključio da se radi o pogrešci.

Stavljanje zagrada bi pomoglo da se izbjegne takva greška, što bi redoslijed izračuna učinio jasnijim. Još jedna dobra tehnika je korištenje konst za argumente koji se ne bi trebali mijenjati.

Slična upozorenja:

  • V532 Razmotrite provjeru izraza uzorka "*pointer++". Vjerojatno je mislio: "(*pokazivač)++". lwio.c 354
  • V532 Razmotrite provjeru izraza uzorka "*pointer++". Vjerojatno je mislio: "(*pokazivač)++". lwob.c 80
void CHitMemoryManager::load (IReader &packet) ( .... if (!spawn_callback || !spawn_callback->m_object_callback) if(!g_dedicated_server) Level().client_spawn_manager().add(delayed_object.m_object_id,m_object->ID( ),callback); #ifdef DEBUG else (if (spawn_callback && spawn_callback->m_object_callback) ( VERIFY(spawn_callback->m_object_callback == callback); ) ) #endif // DEBUG )
Upozorenje PVS-Studio: V563 Moguće je da se ova "else" grana mora primijeniti na prethodnu "if" naredbu. hit_memory_manager.cpp 368

U ovom ulomku grana drugo pripada drugom ako zbog svoje desne asocijativnosti, koja se ne podudara s oblikovanjem koda. Srećom, ovaj slučaj ne utječe na rad programa, ali može zakomplicirati proces uklanjanja pogrešaka i testiranja.

Preporuka je jednostavna - koristite vitičaste zagrade u više ili manje složenim granama.
void HUD_SOUND_ITEM::PlaySound(HUD_SOUND_ITEM& hud_snd, const Fvector& position, const IGameObject* parent, bool b_hud_mode, bool looped, u8 index) ( .... hud_snd.m_activeSnd->snd.set_volume(hud_snd.m_activeSnd->volume * b_hud_mode? psHUDSoundVolume:1.0f);
Upozorenje PVS-Studio: V502 Možda operator "?:" radi na drugačiji način od očekivanog. Operator "?:" ima manji prioritet od operatora "*". hudsound.cpp 108

Ternarni uvjetni operator ima manji prioritet od množenja, pa je redoslijed operacija sljedeći:
(hud_snd.m_activeSnd->volume * b_hud_mode)?psHUDSoundVolume:1.0f
Očito bi ispravan kod trebao izgledati ovako:
hud_snd.m_activeSnd->volume * (b_hud_mode?psHUDSoundVolume:1.0f)
Postoji nekoliko izraza koji sadrže ternarni operator ako-drugače grananja ili operacije I/ILI su oni slučajevi kada je bolje staviti dodatne zagrade.

Slična upozorenja:

  • V502 Možda operator "?:" radi na drugačiji način od očekivanog. Operator "?:" ima manji prioritet od operatora "+". uihudstateswnd.cpp 487
  • V502 Možda operator "?:" radi na drugačiji način od očekivanog. Operator "?:" ima manji prioritet od operatora "+". uicellcustomitems.cpp 106

Dodatne usporedbe

void CDestroyablePhysicsObject::OnChangeVisual() ( if (m_pPhysicsShell)( if(m_pPhysicsShell)m_pPhysicsShell->Deactivate(); .... ) .... )
Upozorenje PVS-Studio: V571 Periodična provjera. Uvjet "if (m_pPhysicsShell)" već je potvrđen u retku 32. destroyablephysicsobject.cpp 33

U u ovom primjeru dvostruko provjereno m_pPhysicsShell. Najvjerojatnije je druga provjera nepotrebna.
void CSE_ALifeItemPDA::STATE_Read(NET_Packet &tNetPacket, u16 size) ( .... if (m_wVersion > 89) if ((m_wVersion > 89)&&(m_wVersion< 98)) { .... }else{ .... } }
Upozorenje PVS-Studio: V571 Periodična provjera. Uvjet "m_wVersion > 89" već je provjeren u retku 987. xrserver_objects_alife_items.cpp 989

Vrlo čudan kod. Možda su poslije zaboravili izraz if (m_wVersion > 89), ili cijelu seriju inače-ako. Ova metoda zahtijeva detaljnije razmatranje od strane razvijača projekta.
void ELogCallback(void *context, LPCSTR txt) ( .... bool bDlg = ("#"==txt)||((0!=txt)&&("#"==txt)); if (bDlg) ( int mt = ("!"==txt)||((0!=txt)&&("!"==txt))?1:0; .... ) )
PVS-Studio upozorenja:

  • V590 Razmotrite provjeru izraza "(0 != txt) && ("#" == txt)". Izraz je pretjeran ili sadrži tiskarsku pogrešku. elog.cpp 29
  • V590 Razmotrite provjeru izraza "(0 != txt) && ("!" == txt)". Izraz je pretjeran ili sadrži tiskarsku pogrešku. elog.cpp 31
U izrazima za inicijalizaciju varijabli bDlg I mt ispitivanje (0 != txt) je suvišan. Ako ga izostavite, izrazi će biti mnogo lakši za čitanje:
bool bDlg = ("#"==txt)||("#"==txt); int mt = ("!"==txt)||("!"==txt)?1:0;

Greške tipa podataka


Float CRenderTarget::im_noise_time; CRenderTarget::CRenderTarget() ( .... param_blur = 0.f; param_gray = 0.f; param_noise = 0.f; param_duality_h = 0.f; param_duality_v = 0.f; param_noise_fps = 25.f; param_noise_scale = 1 .f; im_noise_time = 1/100; im_noise_shift_w = 0;
Upozorenje PVS-Studio: V636 Izraz "1 / 100" implicitno je bačen iz tipa "int" u tip "float". Razmislite o korištenju eksplicitnog pretvaranja tipa kako biste izbjegli gubitak frakcijskog dijela. Primjer: dvostruko A = (dvostruko)(X) / Y;. gl_rendertarget.cpp 245

Vrijednost 1/100 je 0 jer je to operacija cjelobrojnog dijeljenja. Da biste dobili vrijednost 0,01f, trebate upotrijebiti pravi literal, prepisujući izraz: 1/100,0f. Iako je moguće da je ovo ponašanje bilo namjerno od strane autora, i tu nema greške.
CSpaceRestriction::merge(....) const ( .... LPSTR S = xr_alloc (acc_length);
Upozorenje PVS-Studio za (; I != E; ++I) temp = strconcat(sizeof(S),S,*temp,",",*(*I)->name());

.... ) : V579 Funkcija strconcat prima pokazivač i njegovu veličinu kao argumente. Moguće je da je greška. Provjerite prvi argument. ograničenje_prostora.cpp 201 Funkcija strconcat, uzima duljinu međuspremnika kao prvi parametar. Pufer S najavljen kao LPSTR, odnosno kao pokazivač na string. veličina(S) bit će jednaka veličini pokazivača u bajtovima, tj sizeof(char *).
, a ne broj znakova u retku. Za izračun duljine trebate koristiti
Upozorenje PVS-Studio: V712 Imajte na umu da kompajler može izbrisati ovaj ciklus ili ga učiniti beskonačnim. Koristite promjenljive varijable(e) ili primitive za sinkronizaciju da biste to izbjegli. xrcdb.cpp 100

Prevoditelj može ukloniti provjeru S_INIT == status kao optimizacija, budući da varijabla status nije modificiran u petlji. Da biste izbjegli ovakvo ponašanje, morate koristiti nepostojan varijable ili vrste sinkronizacije podataka između niti.

Slična upozorenja:

  • V712 Imajte na umu da kompajler može izbrisati ovaj ciklus ili ga učiniti beskonačnim. Koristite promjenljive varijable(e) ili primitive za sinkronizaciju da biste to izbjegli. levelcompilerloggerwindow.cpp 23
  • V712 Imajte na umu da kompajler može izbrisati ovaj ciklus ili ga učiniti beskonačnim. Koristite promjenljive varijable(e) ili primitive za sinkronizaciju da biste to izbjegli. levelcompilerloggerwindow.cpp 232
void CAI_Rat::UpdateCL() ( .... if (!Useful()) ( inherited::UpdateCL (); Exec_Look (Device.fTimeDelta); CMonsterSquad *squad = monster_squad().get_squad(this); if (squad && ((squad->GetLeader() != ovo && !squad->GetLeader()->g_Alive()) || squad->get_index(this) == u32(-1))) squad->SetLeader(this ); .... ) .... )
Upozorenje PVS-Studio: V547 Izraz "squad->get_index(this) == u32(- 1)" uvijek je lažan. Raspon vrijednosti tipa unsigned char: . ai_rat.cpp 480

Da bismo razumjeli zašto je ovaj izraz uvijek lažan, izračunajmo vrijednosti pojedinačnih operanda. u32(-1) jednako je 0xFFFFFFFF ili 4294967295. Vrsta povrata metode sastav->get_index(....), - u8, stoga je njegova najveća vrijednost 0xFF ili 255, što je striktno manje od u32(-1). Sukladno tome, vrijednost takve usporedbe uvijek će biti lažno. Ovaj kod se može lako popraviti promjenom vrste podataka u u8:
squad->get_index(this) == u8(-1)
Ista dijagnostika radi za redundantne usporedbe nepredznačenih varijabli:
prostor imena ALife ( typedef u64 _TIME_ID; ) ALife::_TIME_ID CScriptActionCondition::m_tLifeTime; IC bool CScriptEntityAction::CheckIfTimeOver() ( return((m_tActionCondition.m_tLifeTime >= 0) && ((m_tActionCondition.m_tStartTime + m_tActionCondition.m_tLifeTime)< Device.dwTimeGlobal)); }
Upozorenje PVS-Studio: V547 Izraz "m_tActionCondition.m_tLifeTime >= 0" je uvijek istinit. Nepotpisana vrijednost tipa uvijek je >= 0. script_entity_action_inline.h 115

Varijabilna m_tLifeTime je bez predznaka, tako da je uvijek veći ili jednak nuli. Radi li se o nepotrebnoj provjeri ili postoji skrivena pogreška u logici na programeru je da procijeni.

Slično upozorenje:

V547 Izraz "m_tActionCondition.m_tLifeTime< 0" is always false. Unsigned type value is never < 0. script_entity_action_inline.h 143
ObjectFactory::ServerObjectBaseClass * CObjectItemScript::server_object (LPCSTR odjeljak) const ( ObjectFactory::ServerObjectBaseClass *object = nullptr; try ( object = m_server_creator(section); ) catch(std::exception e) ( Msg("Iznimka [%s) ] podignuto tijekom stvaranja objekta poslužitelja iz " "odjeljka [%s]", e.what(),odjeljka); return (0); ) .... )
Upozorenje PVS-Studio: V746 Tip rezanje. Iznimku treba uhvatiti referencom, a ne vrijednošću. object_item_script.cpp 39

.... ) std::exception::what() je virtualan i može se nadjačati u naslijeđenim klasama. U ovom primjeru, iznimka je uhvaćena prema vrijednosti, stoga će se instanca klase kopirati i sve informacije o polimorfnom tipu će biti izgubljene. Kontakt što() u tom slučaju je besmisleno. Iznimku treba uhvatiti pomoću veze:
catch(const std::exception& e) (

Razno

void compute_cover_value (....) ( .... float value ; .... if (vrijednost< .999f) { value = value; } .... }
Upozorenje PVS-Studio: V570 Varijabla "vrijednost" dodijeljena je sama sebi. compiler_cover.cpp 260

Varijabilna vrijednost dodijeljena sama sebi. Zašto to učiniti nije jasno. Možda mu je trebalo dati drugačije značenje.
void CActor::g_SetSprintAnimation(u32 mstate_rl, MotionID &head, MotionID &torso, MotionID &legs) ( SActorSprintState& sprint = m_anims->m_sprint; bool jump = (mstate_rl&mcFall) || (mstate_rl&mcLanding) || (mstate_rl&mcLanding) || (mstate _rl&m slijetanje2) | |. (mstate_rl&mcJump);
Upozorenje PVS-Studio: V501 Postoje identični podizrazi "(mstate_rl & mcLanding)" lijevo i desno od "||" operater. glumačka animacija.cpp 290

Najvjerojatnije je ovo samo dodatna provjera. mstate_rl & mcLanding, ali često takva upozorenja signaliziraju pogrešku u logici i neispitane enum vrijednosti.

Slična upozorenja:

  • V501 Postoje identični podizrazi "HudItemData()" lijevo i desno od operatora "&&". huditem.cpp 338
  • V501 Postoje identični podizrazi "list_idx == e_outfit" lijevo i desno od "||" operater. uimptradewnd_misc.cpp 392
  • V501 Postoje identični podizrazi "(D3DFMT_UNKNOWN == fTarget)" lijevo i desno od "||" operater. hw.cpp 312
RELATION_REGISTRY::RELATION_MAP_SPOTS::RELATION_MAP_SPOTS() ( .... spot_names = "neprijateljska_lokacija"; spot_names = "neprijateljska_lokacija"; .... )
Upozorenje PVS-Studio: V519 Varijabli se dodjeljuju vrijednosti dva puta uzastopno. Možda je ovo greška. Provjerite retke: 57, 58. relation_registry.cpp 58

Analizator je otkrio da su dvije vrijednosti dodijeljene jednoj varijabli u nizu. U ovom slučaju, izgleda da je to samo mrtav kod i treba ga ukloniti.
void safe_verify(....) ( .... printf("FATALNA POGREŠKA (%s): nije uspjela provjera podataka\n"); .... )
Upozorenje PVS-Studio: V576 Netočan format. Prilikom pozivanja funkcije "printf" očekuje se različit broj stvarnih argumenata. Očekivano: 2. Prisutno: 1. entry_point.cpp 41

Funkcionirati printf Nije proslijeđeno dovoljno argumenata: format "%s" označava da treba proslijediti pokazivač na niz. Ova situacija može dovesti do pogreške u pristupu memoriji i hitnog prekida programa.

  • pvs-studio
  • statička analiza koda
  • C++
  • stalker
  • Dodajte oznake

    Povezane publikacije