PVS-Studio uye Inoenderera Kubatanidzwa: TeamCity. Kuongororwa kweiyo Open RollerCoaster Tycoon 2 chirongwa

PVS-Studio uye Inoenderera Kubatanidzwa: TeamCity. Kuongororwa kweiyo Open RollerCoaster Tycoon 2 chirongwa
Imwe yeazvino mamiriro ekushandisa iyo PVS-Studio analyzer kubatanidzwa kwayo neCI masisitimu. Uye kunyangwe kuongororwa kwePVS-Studio purojekiti kubva kunenge chero inoenderera yekubatanidza system inogona kuvakwa mumirairo mishoma, isu tinoenderera mberi nekuita kuti maitiro aya ave nyore. PVS-Studio ikozvino ine rutsigiro rwekushandura analyzer inobuda kuita fomati yeTeamCity - TeamCity Inspections Type. Ngationei kuti zvinoshanda sei.

Ruzivo nezve software yakashandiswa

PVS Studio - static analyzer yeC, C ++, C # uye Java kodhi, yakagadzirirwa kufambisa basa rekutsvaga nekugadzirisa akasiyana siyana ezvikanganiso. Iyo analyzer inogona kushandiswa paWindows, Linux uye macOS. Muchikamu chino isu tichashanda nesimba kwete chete analyzer pachayo, asiwo zvimwe zvekushandisa kubva pakugovera kwayo.

CLMonitor - ivhavha yekutarisa iyo inotarisisa compiler kutanga. Inofanirwa kumhanyiswa nekukurumidza usati watanga kuvaka chirongwa chako. Mune snooping mode, sevha inopindira kumhanya kwevose vanotsigirwa compilers. Izvo zvakakosha kucherechedza kuti chishandiso ichi chinogona kungoshandiswa kuongorora C / C ++ mapurojekiti.

PlogConverter - chishandiso chekushandura analyzer mishumo kuita akasiyana mafomati.

Ruzivo nezve purojekiti iri kudzidza

Ngatiedzei kuita uku pamuenzaniso unoshanda - ngationgororei chirongwa cheOpenRCT2.

VhuraRCT2 -Kuitwa kwakavhurika kwemutambo RollerCoaster Tycoon 2 (RCT2), kuchiwedzera nemabasa matsva uye kugadzirisa tsikidzi. Gameplay inotenderera kuvaka uye kuchengetedza paki yekunakidzwa ine vatasvi, zvitoro, uye zvivakwa. Mutambi anofanira kuedza kuita purofiti uye kuchengetedza mukurumbira wakanaka wepaki uku uchichengeta vaenzi vachifara. OpenRCT2 inobvumidza iwe kutamba mune ese ari maviri mamiriro uye sandbox. Mamiriro ezvinhu anoda kuti mutambi apedze rimwe basa mukati menguva yakatarwa, nepo Sandbox ichibvumira mutambi kuvaka paki inochinjika pasina zvirambidzo kana mari.

kuchinja

Kuti ndichengetedze nguva, ini ndinogona kusvetuka maitiro ekuisa uye kutanga kubva panguva yandinenge ndine TeamCity server inoshanda pakombuta yangu. Isu tinofanirwa kuenda ku: localhost:{port yakataurwa panguva yekumisikidza} (munyaya yangu, localhost:9090) uye isa data remvumo. Mushure mekupinda tinokwaziswa na:

PVS-Studio uye Inoenderera Kubatanidzwa: TeamCity. Kuongororwa kweiyo Open RollerCoaster Tycoon 2 chirongwa
Dzvanya paGadzira Project bhatani. Zvadaro, sarudza Nemaoko uye zadza minda.

PVS-Studio uye Inoenderera Kubatanidzwa: TeamCity. Kuongororwa kweiyo Open RollerCoaster Tycoon 2 chirongwa
Mushure mekudzvanya bhatani sika, tinokwaziswa nehwindo rine marongero.

PVS-Studio uye Inoenderera Kubatanidzwa: TeamCity. Kuongororwa kweiyo Open RollerCoaster Tycoon 2 chirongwa
Ngatidzvanye Gadzira gadziriso yekugadzira.

PVS-Studio uye Inoenderera Kubatanidzwa: TeamCity. Kuongororwa kweiyo Open RollerCoaster Tycoon 2 chirongwa
Zadza minda wodzvanya sika. Isu tinoona hwindo richikukumbira kuti usarudze shanduro yekudzora system. Sezvo masosi atove munharaunda, tinya Enda.

PVS-Studio uye Inoenderera Kubatanidzwa: TeamCity. Kuongororwa kweiyo Open RollerCoaster Tycoon 2 chirongwa
Pakupedzisira, tinopfuurira kune zvirongwa zveprojekiti.

PVS-Studio uye Inoenderera Kubatanidzwa: TeamCity. Kuongororwa kweiyo Open RollerCoaster Tycoon 2 chirongwa
Ngatiwedzere matanho egungano, kuita izvi tinya: Vaka matanho -> Wedzera nhanho yekuvaka.

PVS-Studio uye Inoenderera Kubatanidzwa: TeamCity. Kuongororwa kweiyo Open RollerCoaster Tycoon 2 chirongwa
Pano tinosarudza:

  • Runner mhando -> Command Line
  • Mhanya -> Custom Script

Sezvo isu tichaita ongororo panguva yekubatanidza chirongwa, kuungana uye kuongorora kunofanirwa kuve nhanho imwe, saka zadza mumunda Tsika yechiCustom:

PVS-Studio uye Inoenderera Kubatanidzwa: TeamCity. Kuongororwa kweiyo Open RollerCoaster Tycoon 2 chirongwa
Tichatarisa matanho ega ega gare gare. Izvo zvakakosha kuti kurodha analyzer, kuunganidza purojekiti, kuiongorora, kuburitsa mushumo uye kufomati inotora mitsetse gumi neimwe chete yekodhi.

Chekupedzisira chatinofanira kuita kuseta nharaunda dzakasiyana, dzandakatsanangura dzimwe nzira dzekuvandudza kuverenga kwavo. Kuti tiite izvi, ngatienderere mberi: Parameters -> Wedzera itsva parameter uye wedzera matatu akasiyana:

PVS-Studio uye Inoenderera Kubatanidzwa: TeamCity. Kuongororwa kweiyo Open RollerCoaster Tycoon 2 chirongwa
Chaunofanirwa kuita kudzvanya bhatani manya mukona yekurudyi. Ipo purojekiti iri kuunganidzwa uye kuongororwa, ini ndichakuudza nezve script.

Yakananga script

Kutanga, tinoda kudhawunirodha yazvino PVS-Studio kugovera. Kune izvi isu tinoshandisa Chocolatey package maneja. Kune avo vanoda kuziva zvakawanda nezve izvi, pane inowirirana chinyorwa:

choco install pvs-studio -y

Tevere, ngatitangei CLMonitor purojekiti kuvaka yekutevera utility.

%CLmon% monitor –-attach

Ipapo isu tichavaka purojekiti seyakasiyana nharaunda MSB ndiyo nzira yeshanduro yeMSBuild yandinoda kuvaka

%MSB% %ProjPath% /t:clean
%MSB% %ProjPath% /t:rebuild /p:configuration=release
%MSB% %ProjPath% /t:g2
%MSB% %ProjPath% /t:PublishPortable

Ngatiisei kiyi yekupinda uye rezinesi rePVS-Studio:

%PVS-Studio_cmd% credentials --username %PVS_Name% --serialNumber %PVS_Key%

Mushure mekunge kuvaka kwapera, mhanya CLMonitor zvakare kuti ugadzire mafaera akadhindwa uye static ongororo:

%CLmon% analyze -l "c:ptest.plog"

Ipapo isu tichashandisa chimwe chishandiso kubva pakugovera kwedu. PlogConverter inoshandura mushumo kubva kune yakajairwa fomati kuenda kuTeamCity-chaiyo fomati. Nekuda kweizvi, isu tichakwanisa kuiona zvakananga muhwindo rekuvaka.

%PlogConverter% "c:ptest.plog" --renderTypes=TeamCity -o "C:temp"

Danho rekupedzisira ndere kuratidza report yakarongwa mukati stdout, kwainozotorwa neTeamCity parser.

type "C:tempptest.plog_TeamCity.txt"

Izere script kodhi:

choco install pvs-studio -y
%CLmon% monitor --attach
set platform=x64
%MSB% %ProjPath% /t:clean
%MSB% %ProjPath% /t:rebuild /p:configuration=release
%MSB% %ProjPath% /t:g2
%MSB% %ProjPath% /t:PublishPortable
%PVS-Studio_cmd% credentials --username %PVS_Name% --serialNumber %PVS_Key%
%CLmon% analyze -l "c:ptest.plog"
%PlogConverter% "c:ptest.plog" --renderTypes=TeamCity -o "C:temp"
type "C:tempptest.plog_TeamCity.txt"

Panguva ino, gungano uye kuongororwa kweprojekti kwapera kubudirira, tinogona kuenda kune tab Projects uye iva nechokwadi nazvo.

PVS-Studio uye Inoenderera Kubatanidzwa: TeamCity. Kuongororwa kweiyo Open RollerCoaster Tycoon 2 chirongwa
Zvino ngatidzvanye Inspections Totalkuenda kukuona iyo analyzer report:

PVS-Studio uye Inoenderera Kubatanidzwa: TeamCity. Kuongororwa kweiyo Open RollerCoaster Tycoon 2 chirongwa
Yambiro dzakaiswa muboka nenhamba dzemitemo yekuongorora. Kuti ufambe nekodhi, unofanirwa kudzvanya pane nhamba yemutsara neyambiro. Kudzvanya pamucherechedzo wemubvunzo uri pakona yekurudyi kuchakuvhurira tebhu nyowani ine zvinyorwa. Iwe unogona zvakare kufamba kuburikidza nekodhi nekudzvanya pane iyo mutsara nhamba ine analyzer yambiro. Kufamba kubva kune komputa iri kure kunogoneka kana uchishandisa SourceTreeRoot marker. Chero ani anofarira iyi nzira yekushanda yeanalyzer anogona kujairana nechikamu chinoenderana zvinyorwa.

Kuona mhinduro dze analyzer

Zvino zvatapedza kuendesa nekugadzirisa kuvaka, ngatitarisei dzimwe yambiro dzinonakidza dzinowanikwa mupurojekiti yatiri kutarisa.

Yambiro N1

V773 [CWE-401] Iyo yakasarudzika yakakandwa isina kuburitsa 'mhedzisiro' pointer. Kudonha kwendangariro kunogoneka. libopenrct2 ObjectFactory.cpp 443

Object* CreateObjectFromJson(....)
{
  Object* result = nullptr;
  ....
  result = CreateObject(entry);
  ....
  if (readContext.WasError())
  {
    throw std::runtime_error("Object has errors");
  }
  ....
}

Object* CreateObject(const rct_object_entry& entry)
{
  Object* result;
  switch (entry.GetType())
  {
    case OBJECT_TYPE_RIDE:
      result = new RideObject(entry);
      break;
    case OBJECT_TYPE_SMALL_SCENERY:
      result = new SmallSceneryObject(entry);
      break;
    case OBJECT_TYPE_LARGE_SCENERY:
      result = new LargeSceneryObject(entry);
      break;
    ....
    default:
      throw std::runtime_error("Invalid object type");
  }
  return result;
}

Iye analyzer akaona chikanganiso icho mushure mekugovera zvine simba ndangariro mukati CreateObject, kana kusarudzika kukaitika, chiyeuchidzo hachina kucheneswa, uye kudonha kwendangariro kunoitika.

Yambiro N2

V501 Kune akafanana madiki-mazwi '(1ULL << WIDX_MONTH_BOX)' kuruboshwe uye kurudyi rwe'|' opareta. libopenrct2ui Cheats.cpp 487

static uint64_t window_cheats_page_enabled_widgets[] = 
{
  MAIN_CHEAT_ENABLED_WIDGETS |
  (1ULL << WIDX_NO_MONEY) |
  (1ULL << WIDX_ADD_SET_MONEY_GROUP) |
  (1ULL << WIDX_MONEY_SPINNER) |
  (1ULL << WIDX_MONEY_SPINNER_INCREMENT) |
  (1ULL << WIDX_MONEY_SPINNER_DECREMENT) |
  (1ULL << WIDX_ADD_MONEY) |
  (1ULL << WIDX_SET_MONEY) |
  (1ULL << WIDX_CLEAR_LOAN) |
  (1ULL << WIDX_DATE_SET) |
  (1ULL << WIDX_MONTH_BOX) |  // <=
  (1ULL << WIDX_MONTH_UP) |
  (1ULL << WIDX_MONTH_DOWN) |
  (1ULL << WIDX_YEAR_BOX) |
  (1ULL << WIDX_YEAR_UP) |
  (1ULL << WIDX_YEAR_DOWN) |
  (1ULL << WIDX_DAY_BOX) |
  (1ULL << WIDX_DAY_UP) |
  (1ULL << WIDX_DAY_DOWN) |
  (1ULL << WIDX_MONTH_BOX) |  // <=
  (1ULL << WIDX_DATE_GROUP) |
  (1ULL << WIDX_DATE_RESET),
  ....
};

Vashoma vanhu kunze kweiyo static analyzer vanogona kupasa iyi yekuteerera bvunzo. Uyu kopi-paste muenzaniso wakanaka nekuda kwechikonzero ichi.

Yambiro N3

V703 Izvo zvisinganzwisisike kuti iyo 'mireza' ndima mukirasi yakatorwa 'RCT12BannerElement' inonyora pasi munda mubase kirasi 'RCT12TileElementBase'. Tarisa mitsetse: RCT12.h:570, RCT12.h:259. libopenrct2 RCT12.h 570

struct RCT12SpriteBase
{
  ....
  uint8_t flags;
  ....
};
struct rct1_peep : RCT12SpriteBase
{
  ....
  uint8_t flags;
  ....
};

Zvechokwadi, kushandisa shanduko ine zita rimwechete mukirasi yepasi uye mudzinza haisi nguva dzose kukanganisa. Nekudaro, tekinoroji yenhaka pachayo inofunga kuti minda yese yekirasi yevabereki iripo mukirasi yemwana. Nekuzivisa minda ine zita rimwechete mumugari wenhaka, tinosuma nyonganiso.

Yambiro N4

V793 Izvo zvisinganzwisisike kuti mhedzisiro ye 'imageDirection / 8' chirevo chikamu chechimiro. Zvichida, chirevo ichi chinofanira kunge chakafananidzwa nechimwe chinhu. libopenrct2 ObservationTower.cpp 38

void vehicle_visual_observation_tower(...., int32_t imageDirection, ....)
{
  if ((imageDirection / 8) && (imageDirection / 8) != 3)
  {
    ....
  }
  ....
}

Ngatinyatsoongororai. Kutaura mufananidzoDirection/8 achanyepa kana imageDirection iri pakati pe -7 kusvika 7. Chikamu chechipiri: (Mufananidzo / 8) != 3 checks imageDirection yekuve kunze kwemhando: kubva -31 kusvika -24 uye kubva pa24 kusvika 31, zvichiteerana. Zvinoita sezvisinganzwisisike kwandiri kutarisa nhamba kuti dzipinzwe mune imwe nzira nenzira iyi uye, kunyangwe pasina chikanganiso muchidimbu ichi chekodhi, ndingakurudzira kunyora patsva mamiriro aya kuti ave akajeka. Izvi zvaizoita kuti hupenyu huve nyore kune vanhu vaizoverenga nekuchengetedza iyi kodhi.

Yambiro N5

V587 Kutevedzana kusinganzwisisike kwemabasa erudzi urwu: A = B; B = A;. Tarisa mitsetse: 1115, 1118. libopenrct2ui MouseInput.cpp 1118

void process_mouse_over(....)
{
  ....
  switch (window->widgets[widgetId].type)
  {
    case WWT_VIEWPORT:
      ebx = 0;
      edi = cursorId;                                 // <=
      // Window event WE_UNKNOWN_0E was called here,
      // but no windows actually implemented a handler and
      // it's not known what it was for
      cursorId = edi;                                 // <=
      if ((ebx & 0xFF) != 0)
      {
        set_cursor(cursorId);
        return;
      }
      break;
      ....
  }
  ....
}

Ichi chidimbu chekodhi chakanyanya kuwanikwa nekuparara. Zvadaro, tichitonga nemashoko akasiyiwa, chikamu chekodhi isina kushanda chakabviswa. Nekudaro, kuchine maviri maoparesheni asara cursorId, izvo zvakare zvisina musoro zvakanyanya.

Yambiro N6

V1004 [CWE-476] Iyo 'player' pointer yakashandiswa zvisina kuchengetedzeka mushure mekunge yasimbiswa pane nullptr. Tarisa mitsetse: 2085, 2094. libopenrct2 Network.cpp 2094

void Network::ProcessPlayerList()
{
  ....
  auto* player = GetPlayerByID(pendingPlayer.Id);
  if (player == nullptr)
  {
    // Add new player.
    player = AddPlayer("", "");
    if (player)                                          // <=
    {
      *player = pendingPlayer;
       if (player->Flags & NETWORK_PLAYER_FLAG_ISSERVER)
       {
         _serverConnection->Player = player;
       }
    }
    newPlayers.push_back(player->Id);                    // <=
  }
  ....
}

Iyi kodhi iri nyore kugadzirisa; iwe unongoda kuitarisa kechitatu mutambi kune null pointer, kana kuiwedzera kumutumbi wechirevo chechirevo. Ini ndingapa zano rechipiri:

void Network::ProcessPlayerList()
{
  ....
  auto* player = GetPlayerByID(pendingPlayer.Id);
  if (player == nullptr)
  {
    // Add new player.
    player = AddPlayer("", "");
    if (player)
    {
      *player = pendingPlayer;
      if (player->Flags & NETWORK_PLAYER_FLAG_ISSERVER)
      {
        _serverConnection->Player = player;
      }
      newPlayers.push_back(player->Id);
    }
  }
  ....
}

Yambiro N7

V547 [CWE-570] Tsanangudzo 'zita == nullptr' inogara iri yenhema. libopenrct2 ServerList.cpp 102

std::optional<ServerListEntry> ServerListEntry::FromJson(...)
{
  auto name = json_object_get(server, "name");
  .....
  if (name == nullptr || version == nullptr)
  {
    ....
  }
  else
  {
    ....
    entry.name = (name == nullptr ? "" : json_string_value(name));
    ....
  }
  ....
}

Iwe unogona kubvisa yakaoma-ku-kuverenga mutsara wekodhi mune imwe yakawa swoop uye kugadzirisa dambudziko nekutarisa nullptr. Ini ndinokurudzira kuchinja kodhi sezvinotevera:

std::optional<ServerListEntry> ServerListEntry::FromJson(...)
{
  auto name = json_object_get(server, "name");
  .....
  if (name == nullptr || version == nullptr)
  {
    name = ""
    ....
  }
  else
  {
    ....
    entry.name = json_string_value(name);
    ....
  }
  ....
}

Yambiro N8

V1048 [CWE-1164] Iyo 'ColumnHeaderPressedCurrentState' musiyano yakapihwa kukosha kwakafanana. libopenrct2ui CustomListView.cpp 510

void CustomListView::MouseUp(....)
{
  ....
  if (!ColumnHeaderPressedCurrentState)
  {
    ColumnHeaderPressed = std::nullopt;
    ColumnHeaderPressedCurrentState = false;
    Invalidate();
  }
}

Kodhi yacho inotaridzika chaizvo. Zvinoratidzika kwandiri kuti pakanga paine typo ingave iri mumamiriro ezvinhu kana pakupazve shanduko ColumnHeaderPressedCurrentState zvinoreva venhema.

mhedziso

Sezvatinoona, kubatanidza iyo PVS-Studio static analyzer muTeamCity yako chirongwa chiri nyore. Kuti uite izvi, zvakakwana kunyora imwe chete diki yekumisikidza faira. Kuongorora kodhi kuchakubvumira kuti uone matambudziko pakarepo mushure megungano, izvo zvichabatsira kuzvibvisa kana kuoma uye mari yekuchinja ichiri yakaderera.

PVS-Studio uye Inoenderera Kubatanidzwa: TeamCity. Kuongororwa kweiyo Open RollerCoaster Tycoon 2 chirongwa
Kana iwe uchida kugovera chinyorwa ichi nevateereri vanotaura Chirungu, tapota shandisa shanduro yekushandura: Vladislav Stolyarov. PVS-Studio uye Inoenderera Kubatanidzwa: TeamCity. Kuongororwa kweiyo Open RollerCoaster Tycoon 2 chirongwa.

Source: www.habr.com

Voeg