PVS-Studio ndi Kuphatikizana Kopitilira: TeamCity. Kuwunika kwa polojekiti ya Open RollerCoaster Tycoon 2

PVS-Studio ndi Kuphatikizana Kopitilira: TeamCity. Kuwunika kwa polojekiti ya Open RollerCoaster Tycoon 2
Chimodzi mwazinthu zamakono zogwiritsira ntchito PVS-Studio analyzer ndikuphatikizana ndi machitidwe a CI. Ndipo ngakhale kuwunika kwa polojekiti ya PVS-Studio kuchokera pafupifupi njira iliyonse yophatikizira ingapangidwe kukhala malamulo ochepa, tikupitiliza kupanga izi kukhala zosavuta. PVS-Studio tsopano ili ndi chithandizo chosinthira zotulutsa za analyzer kukhala mtundu wa TeamCity - TeamCity Inspections Type. Tiyeni tiwone momwe zimagwirira ntchito.

Zambiri zamapulogalamu omwe agwiritsidwa ntchito

Zithunzi za PVS Studio - static analyzer ya C, C ++, C # ndi Java code, yopangidwa kuti itsogolere ntchito yopeza ndi kukonza zolakwika zosiyanasiyana. Analyzer angagwiritsidwe ntchito pa Windows, Linux ndi macOS. M'nkhaniyi tidzagwiritsa ntchito osati analyzer yokha, komanso zina zothandizira kuchokera kugawa kwake.

CLMonitor - ndi seva yowunikira yomwe imayang'anira kuyambika kwa compiler. Iyenera kuyendetsedwa nthawi yomweyo musanayambe kumanga pulojekiti yanu. Munjira yowunikira, seva imasokoneza makina onse omwe amathandizidwa. Ndizofunikira kudziwa kuti izi zitha kugwiritsidwa ntchito kusanthula ma projekiti a C/C ++.

PlogConverter - chida chosinthira malipoti a analyzer kukhala mawonekedwe osiyanasiyana.

Zambiri za polojekiti yomwe ikuphunziridwa

Tiyeni tiyese izi ndi chitsanzo chothandiza - tiyeni tiwunike ntchito ya OpenRCT2.

OpenRCT2 - kukhazikitsa kotseguka kwa masewerawa RollerCoaster Tycoon 2 (RCT2), kukulitsa ndi ntchito zatsopano ndikukonza zolakwika. Masewera amasewera amazungulira pomanga ndi kukonza malo osangalatsa okhala ndi zokwera, mashopu, ndi zida. Wosewera ayenera kuyesetsa kupeza phindu ndikusunga mbiri yabwino ya pakiyo ndikusunga alendo osangalala. OpenRCT2 imakulolani kusewera muzochitika zonse ndi sandbox. Zochitika zimafuna kuti wosewera amalize ntchito inayake mkati mwa nthawi yoikika, pomwe Sandbox imalola wosewera kuti apange paki yosinthika popanda zoletsa kapena ndalama.

kusintha

Kuti ndisunge nthawi, mwina ndidumpha kukhazikitsa ndikuyamba kuyambira pomwe ndili ndi seva ya TeamCity ikuyenda pakompyuta yanga. Tiyenera kupita ku: localhost:{port yomwe idatchulidwa pokhazikitsa} (kwa ine, localhost:9090) ndikulowetsa data yovomerezeka. Titalowa tidzalandilidwa ndi:

PVS-Studio ndi Kuphatikizana Kopitilira: TeamCity. Kuwunika kwa polojekiti ya Open RollerCoaster Tycoon 2
Dinani pa Pangani Project batani. Kenako, sankhani Pamanja ndikudzaza minda.

PVS-Studio ndi Kuphatikizana Kopitilira: TeamCity. Kuwunika kwa polojekiti ya Open RollerCoaster Tycoon 2
Pambuyo kukanikiza batani Pangani, tikulandilidwa ndi zenera lomwe lili ndi zoikamo.

PVS-Studio ndi Kuphatikizana Kopitilira: TeamCity. Kuwunika kwa polojekiti ya Open RollerCoaster Tycoon 2
Tiyeni tidule Pangani kasinthidwe kamangidwe.

PVS-Studio ndi Kuphatikizana Kopitilira: TeamCity. Kuwunika kwa polojekiti ya Open RollerCoaster Tycoon 2
Lembani minda ndikudina Pangani. Tikuwona zenera likukupemphani kuti musankhe makina owongolera. Popeza magwero ali kale kwanuko, dinani Pitani.

PVS-Studio ndi Kuphatikizana Kopitilira: TeamCity. Kuwunika kwa polojekiti ya Open RollerCoaster Tycoon 2
Pomaliza, timapita ku zoikamo za polojekiti.

PVS-Studio ndi Kuphatikizana Kopitilira: TeamCity. Kuwunika kwa polojekiti ya Open RollerCoaster Tycoon 2
Tiyeni tiwonjezere masitepe a msonkhano, kuti tichite izi: Pangani masitepe -> Onjezani sitepe yomanga.

PVS-Studio ndi Kuphatikizana Kopitilira: TeamCity. Kuwunika kwa polojekiti ya Open RollerCoaster Tycoon 2
Apa tikusankha:

  • Mtundu wothamanga -> Command Line
  • Thamangani -> Custom Script

Popeza tidzachita kusanthula panthawi yopanga polojekiti, kusonkhanitsa ndi kusanthula kuyenera kukhala gawo limodzi, choncho lembani ntchitoyi Malemba Achizolowezi:

PVS-Studio ndi Kuphatikizana Kopitilira: TeamCity. Kuwunika kwa polojekiti ya Open RollerCoaster Tycoon 2
Tidzawona masitepe apayekha pambuyo pake. Ndikofunikira kuti kutsitsa analyzer, kusonkhanitsa polojekiti, kuisanthula, kutulutsa lipoti ndikuikonza kumangotengera mizere khumi ndi imodzi yokha.

Chomaliza chomwe tikuyenera kuchita ndikukhazikitsa zosintha zachilengedwe, zomwe ndafotokoza njira zina zowongolera kuwerenga kwawo. Kuti tichite izi, tiyeni tipitirire: Ma Parameters -> Onjezani magawo atsopano ndi kuwonjezera mitundu itatu:

PVS-Studio ndi Kuphatikizana Kopitilira: TeamCity. Kuwunika kwa polojekiti ya Open RollerCoaster Tycoon 2
Zomwe muyenera kuchita ndikudina batani Thamangani mu ngodya yapamwamba kumanja. Pamene polojekiti ikusonkhanitsidwa ndikuwunikidwa, ndikuwuzani za script.

Mwachindunji script

Choyamba, tiyenera kutsitsa kugawa kwaposachedwa kwa PVS-Studio. Kwa ichi timagwiritsa ntchito Chocolatey package manager. Kwa iwo amene akufuna kudziwa zambiri za izi, pali lolingana nkhani:

choco install pvs-studio -y

Chotsatira, tiyeni tiyambitse pulogalamu ya CLMonitor yomanga chotsatira.

%CLmon% monitor –-attach

Kenako tidzamanga pulojekiti ngati kusintha kwa chilengedwe MSB ndiye njira yopita ku mtundu wa MSBuild womwe ndikufunika kupanga

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

Tiyeni tilowetse kiyi yolowera ndi laisensi ya PVS-Studio:

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

Ntchitoyi ikamalizidwa, thamangitsaninso CLMonitor kuti mupange mafayilo okonzedweratu ndi kusanthula kokhazikika:

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

Kenako tidzagwiritsa ntchito chida china kuchokera pakugawa kwathu. PlogConverter imasintha lipoti kuchokera pamtundu wokhazikika kukhala mawonekedwe a TeamCity enieni. Chifukwa cha izi, tidzatha kuziwona mwachindunji pawindo lomanga.

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

Gawo lomaliza ndikuwonetsa lipoti losinthidwa stdout, kumene idzatengedwa ndi TeamCity parser.

type "C:tempptest.plog_TeamCity.txt"

Script kodi:

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"

Pakalipano, msonkhano ndi kusanthula kwa polojekitiyo zatha bwino, tikhoza kupita ku tabu ntchito ndipo tsimikizirani zimenezo.

PVS-Studio ndi Kuphatikizana Kopitilira: TeamCity. Kuwunika kwa polojekiti ya Open RollerCoaster Tycoon 2
Tsopano tiyeni dinani Kuyendera Totalkupita kukuwona lipoti la analyzer:

PVS-Studio ndi Kuphatikizana Kopitilira: TeamCity. Kuwunika kwa polojekiti ya Open RollerCoaster Tycoon 2
Machenjezo amaikidwa m'magulu ndi manambala a malamulo a matenda. Kuti mudutse pama code, muyenera dinani nambala ya mzere ndi chenjezo. Kudina chizindikiro chafunso pakona yakumanja yakumanja kukutsegulirani tabu yatsopano yokhala ndi zolembedwa. Mukhozanso kuyang'ana pa code podina nambala ya mzere ndi chenjezo la analyzer. Kuyenda kuchokera pakompyuta yakutali ndikotheka mukamagwiritsa ntchito SourceTreeRoot chikhomo. Aliyense amene ali ndi chidwi ndi njira iyi yogwiritsira ntchito analyzer akhoza kudzidziwa bwino ndi gawo lolingana zolemba.

Kuwona zotsatira za analyzer

Tsopano popeza tamaliza kuyika ndikukonza zomanga, tiyeni tiwone machenjezo osangalatsa omwe akupezeka mu polojekiti yomwe tikuyang'ana.

Chenjezo N1

V773 [CWE-401] Chosiyanacho chinaponyedwa popanda kutulutsa cholozera cha 'zotsatira'. Kutaya kukumbukira ndi kotheka. 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;
}

Analyzer adawona cholakwika chomwe atatha kugawa mozama kukumbukira CreateObject, pamene chosiyana chichitika, kukumbukira sikuchotsedwa, ndipo kukumbukira kutayika.

Chenjezo N2

V501 Pali mawu ang'onoang'ono ofanana '(1ULL << WIDX_MONTH_BOX)' kumanzere ndi kumanja kwa '|' woyendetsa. 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),
  ....
};

Ndi anthu ochepa kupatulapo static analyzer omwe angapambane mayeso atcheru awa. Chitsanzo cha copy-paste ndi chabwino pachifukwa ichi.

Machenjezo N3

V703 Ndizodabwitsa kuti gawo la 'mbendera' m'gulu lotengedwa 'RCT12BannerElement' limalembanso gawo la "RCT12TileElementBase". Yang'anani mizere: RCT12.h:570, RCT12.h:259. libopenrct2 RCT12.h 570

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

Zoonadi, kugwiritsa ntchito kusinthika komwe kuli ndi dzina lomwelo m'kalasi yoyambira komanso mbadwa sizovuta nthawi zonse. Komabe, ukadaulo wa cholowa palokha umaganiza kuti magawo onse a kalasi ya makolo alipo mu kalasi ya ana. Polengeza minda yokhala ndi dzina lomwelo mwa wolowa, timayambitsa chisokonezo.

Chenjezo N4

V793 Ndizosadabwitsa kuti zotsatira za mawu a 'imageDirection / 8' ndi gawo la chikhalidwecho. Mwina, mawu awa amayenera kufananizidwa ndi zina. libopenrct2 ObservationTower.cpp 38

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

Tiyeni tione bwinobwino. Kufotokozera Chithunzi Njira / 8 zikhala zabodza ngati imageDirection ili pakati pa -7 mpaka 7. Gawo lachiwiri: (chithunziMalangizo / 8) != 3 cheke imageDirection kukhala kunja kwa mitundu: kuchokera -31 mpaka -24 ndi kuchokera 24 mpaka 31, motero. Zikuwoneka zachilendo kwa ine kuyang'ana manambala kuti aphatikizidwe mumtundu wina motere, ndipo, ngakhale palibe cholakwika pachidutswa ichi, ndingalimbikitse kulembanso izi kuti zikhale zomveka bwino. Izi zikanapangitsa moyo kukhala wosavuta kwa anthu omwe angawerenge ndikusunga code iyi.

Chenjezo N5

V587 Magawo osamvetseka amtunduwu: A = B; B = A;. Onani mizere: 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;
      ....
  }
  ....
}

Chidutswa cha code ichi mwachiwonekere chinapezedwa ndi decompilation. Kenaka, kuweruza ndi ndemanga yomwe yatsala, gawo la code yosagwira ntchito linachotsedwa. Komabe, pali ntchito zingapo zomwe zatsala cursorId, zomwenso sizimamveka bwino.

Chenjezo N6

V1004 [CWE-476] Cholozera cha 'player' chidagwiritsidwa ntchito mosatetezeka chikatsimikiziridwa motsutsana ndi nullptr. Onani mizere: 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);                    // <=
  }
  ....
}

Khodi iyi ndiyosavuta kukonza; muyenera kungoyang'ana kachitatu player pa cholozera chachabechabe, kapena yonjezerani ku thupi la mawu ovomerezeka. Ndingapangire njira yachiwiri:

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

Chenjezo N7

V547 [CWE-570] Mawu akuti 'dzina == nullptr' amakhala abodza nthawi zonse. 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));
    ....
  }
  ....
}

Mutha kuchotsa mzere wosavuta kuwerenga wamakhodi mumsewu umodzi ndikuthana ndi vuto ndikufufuza nullptr. Ndikupangira kusintha code motere:

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

Chenjezo N8

V1048 [CWE-1164] Kusintha kwa 'ColumnHeaderPressedCurrentState' kunapatsidwa mtengo womwewo. libopenrct2ui CustomListView.cpp 510

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

Code ikuwoneka yachilendo kwambiri. Zikuwoneka kwa ine kuti panali vuto la typo mumkhalidwewo kapena poperekanso kusinthako ColumnHeaderPressedCurrentState mfundo zabodza.

Pomaliza

Monga tikuonera, kuphatikiza PVS-Studio static analyzer mu projekiti yanu ya TeamCity ndikosavuta. Kuti muchite izi, ndikwanira kulemba fayilo imodzi yaying'ono yosinthira. Kuyang'ana kachidindo kudzakuthandizani kuzindikira mavuto mwamsanga mutangotha ​​​​msonkhano, zomwe zingathandize kuwathetsa pamene zovuta ndi mtengo wa kusintha zikadali zotsika.

PVS-Studio ndi Kuphatikizana Kopitilira: TeamCity. Kuwunika kwa polojekiti ya Open RollerCoaster Tycoon 2
Ngati mukufuna kugawana nkhaniyi ndi omvera olankhula Chingerezi, chonde gwiritsani ntchito ulalo womasulira: Vladislav Stolyarov. PVS-Studio ndi Kuphatikizana Kopitilira: TeamCity. Kuwunika kwa polojekiti ya Open RollerCoaster Tycoon 2.

Source: www.habr.com

Kuwonjezera ndemanga