PVS-Studio me te Whakauru Tonu: TeamCity. Te tātaritanga o te kaupapa Open RollerCoaster Tycoon 2

PVS-Studio me te Whakauru Tonu: TeamCity. Te tātaritanga o te kaupapa Open RollerCoaster Tycoon 2
Ko tetahi o nga ahuatanga o naianei mo te whakamahi i te kaitirotiro PVS-Studio ko tana whakauru ki nga punaha CI. A ahakoa ko te tātaritanga o te kaupapa PVS-Studio mai i te nuinga o nga punaha whakauru tonu ka taea te hanga ki etahi whakahau noa, kei te haere tonu taatau ki te hanga i tenei mahi kia pai ake. Kei a PVS-Studio te tautoko inaianei mo te huri i te putanga kaitirotiro ki te whakatakotoranga mo TeamCity - Momo Tirotiro TeamCity. Kia kite tatou pehea te mahi.

Nga korero mo te rorohiko i whakamahia

PVS-Studio — he kaitātari pateko o C, C++, C# me te waehere Java, i hangaia hei whakangawari i te mahi rapu me te whakatika i nga momo hapa. Ka taea te whakamahi i te kaitirotiro ki Windows, Linux me te macOS. I roto i tenei tuhinga ka kaha taatau ki te whakamahi ehara i te kaitirotiro anake, engari ano hoki etahi taputapu mai i tana tohatoha.

CLMonitor — he tūmau aroturuki e aro turuki ana i te whakarewatanga o te kaitoha. Me whakahaere tonu i mua i te tiimata ki te hanga i to kaupapa. I roto i te aratau snooping, ka haukotia e te tūmau nga oma o nga kaiwhakaiti tautoko katoa. Kia mahara ko tenei taputapu ka taea anake te whakamahi ki te tarai i nga kaupapa C/C++.

PlogConverter – he whaipainga hei huri i nga purongo kaitaritari ki nga momo whakatakotoranga.

Nga korero mo te kaupapa e rangahaua ana

Me whakamatau tenei mahi me tetahi tauira mahi - me tātari te kaupapa OpenRCT2.

WhakatuwheraRCT2 - he whakatinanatanga tuwhera o te keemu RollerCoaster Tycoon 2 (RCT2), ka whakawhānuihia me nga mahi hou me te whakatika i nga pepeke. Ka huri te takaro ki te hanga me te pupuri i tetahi papa whakangahau kei roto nga eke, toa, me nga whakaurunga. Me ngana te kaitakaro ki te whai hua me te pupuri i te ingoa pai o te papa i te wa e koa ana nga manuhiri. OpenRCT2 ka taea e koe te takaro i roto i nga ahuatanga me te pouaka kirikiri. Ko nga ahuatanga e hiahia ana te kaitakaro ki te whakaoti i tetahi mahi motuhake i roto i te waa kua whakaritea, ko te Sandbox ka taea e te kaitakaro te hanga i tetahi papaa ngawari ake me te kore he here, he putea ranei.

whakatikatikanga

Hei whakaora i te wa, ka pekehia e au te mahi whakaurunga ka timata mai i te wa e rere ana te tūmau TeamCity ki taku rorohiko. Me haere tatou ki: localhost:{tauranga kua tohua i te wa o te whakaurunga} (i taku keehi, localhost:9090) ka uru ki nga raraunga whakamana. I muri i to urunga ka mihihia e:

PVS-Studio me te Whakauru Tonu: TeamCity. Te tātaritanga o te kaupapa Open RollerCoaster Tycoon 2
Patohia te paatene Waihanga Kaupapa. Muri iho, tohua Ma te ringa ka whakakiia nga mara.

PVS-Studio me te Whakauru Tonu: TeamCity. Te tātaritanga o te kaupapa Open RollerCoaster Tycoon 2
I muri i te pehi i te paatene Waihanga, ka mihia e te matapihi me nga tautuhinga.

PVS-Studio me te Whakauru Tonu: TeamCity. Te tātaritanga o te kaupapa Open RollerCoaster Tycoon 2
Kia paato tatou Waihanga whirihoranga hanga.

PVS-Studio me te Whakauru Tonu: TeamCity. Te tātaritanga o te kaupapa Open RollerCoaster Tycoon 2
Whakakiia nga mara ka paato Waihanga. Ka kite matou i tetahi matapihi e tono ana ki a koe ki te whiriwhiri i tetahi punaha whakahaere putanga. I te mea ko nga puna kei te rohe, pawhiria Tīpoka.

PVS-Studio me te Whakauru Tonu: TeamCity. Te tātaritanga o te kaupapa Open RollerCoaster Tycoon 2
Ka mutu, ka neke atu ki nga tautuhinga kaupapa.

PVS-Studio me te Whakauru Tonu: TeamCity. Te tātaritanga o te kaupapa Open RollerCoaster Tycoon 2
Me taapirihia nga waahanga huihuinga, ki te mahi i tenei panui: Hanga nga taahiraa -> Tāpirihia te taahiraa hanga.

PVS-Studio me te Whakauru Tonu: TeamCity. Te tātaritanga o te kaupapa Open RollerCoaster Tycoon 2
I konei ka whiriwhiri tatou:

  • Momo Runner -> Raina Whakahau
  • Whakahaere -> Hōtuhi Ritenga

I te mea ka mahia e matou he tātaritanga i te wa o te whakahiato kaupapa, ko te huihuinga me te tātari kia kotahi te taahiraa, no reira whakakiia te mara Tautuhi Ritenga:

PVS-Studio me te Whakauru Tonu: TeamCity. Te tātaritanga o te kaupapa Open RollerCoaster Tycoon 2
Ka titiro tatou ki nga taahiraa takitahi a muri ake. He mea nui kia utaina te kaitirotiro, te whakahiato i te kaupapa, te tātari, te whakaputa i te purongo me te whakahōputu kia tekau ma tahi noa nga rarangi waehere.

Ko te mea whakamutunga hei mahi ma tatou ko te whakarite i nga taurangi taiao, i whakahuahuahia e au etahi huarahi hei whakapai ake i to raatau panui. Ki te mahi i tenei, me haere tonu: Tawhā -> Tāpiri tawhā hōu me te taapiri kia toru nga taurangi:

PVS-Studio me te Whakauru Tonu: TeamCity. Te tātaritanga o te kaupapa Open RollerCoaster Tycoon 2
Ko nga mea katoa hei mahi maau ko te pehi i te paatene Whakahaere i te kokonga matau o runga. I te wa e whakaemihia ana te kaupapa me te wetewetehia, ka korero ahau ki a koe mo te tuhinga.

Tuhituhi tika

Tuatahi, me tango i te tohatoha PVS-Studio hou. Mo tenei ka whakamahia e matou te kaiwhakahaere putea Chocolatey. Mo te hunga e hiahia ana ki te mohio atu mo tenei, kei reira tetahi korero tuhinga:

choco install pvs-studio -y

I muri mai, me whakarewahia te kaupapa CLMonitor hanga whaipainga aroturuki.

%CLmon% monitor –-attach

Na ka hanga e matou te kaupapa hei taurangi taiao MSB Ko te ara ki te putanga o MSBuild me hanga e au

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

Whakauruhia te takiuru me te taviri raihana mo te PVS-Studio:

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

Ka oti te hanga, whakahaere ano i a CLMonitor ki te whakaputa i nga konae kua oti te tukatuka me te tātari pateko:

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

Na ka whakamahia e matou tetahi atu taputapu mai i ta maatau tohatoha. Ka huri a PlogConverter i tetahi purongo mai i te whakatakotoranga paerewa ki te whakatakotoranga TeamCity-motuhake. He mihi ki tenei, ka taea e matou te tiro tika i te matapihi hanga.

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

Ko te mahi whakamutunga ko te whakaatu i te ripoata kua whakahōputuhia ki roto stdout, i reira ka kohia e te roopu roopu TeamCity.

type "C:tempptest.plog_TeamCity.txt"

Waehere tuhi katoa:

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"

I tenei wa, kua oti pai te huihuinga me te tātaritanga o te kaupapa, ka taea te haere ki te ripa kaupapa kia mohio hoki.

PVS-Studio me te Whakauru Tonu: TeamCity. Te tātaritanga o te kaupapa Open RollerCoaster Tycoon 2
Inaianei me paato tatou Nga Tirohanga Tapekeki te haere ki te tiro i te purongo tātari:

PVS-Studio me te Whakauru Tonu: TeamCity. Te tātaritanga o te kaupapa Open RollerCoaster Tycoon 2
Ka whakarōpūhia ngā whakatūpato mā ngā tau ture tātari. Hei whakatere i roto i te waehere, me panui koe i te nama raina me te whakatupato. Ma te panui i te tohu patai kei te kokonga matau o runga ka whakatuwhera koe i tetahi ripa hou me nga tuhinga. Ka taea hoki e koe te whakatere i roto i te waehere ma te panui i te nama raina me te whakatupato kaitirotiro. Ka taea te whakatere mai i te rorohiko mamao ina whakamahi PūtakeTreeRoot tohu. Ko nga tangata katoa e aro nui ana ki tenei momo mahi a te kaitirotiro ka taea te mohio ki te waahanga e pa ana tuhinga.

Te tiro i nga hua a te kaitātari

Inaianei kua oti taatau te whakatakoto me te whirihora i te hanga, me titiro ki etahi whakatupato whakamere i kitea i roto i te kaupapa e tirohia ana e tatou.

Whakatupato N1

V773 [CWE-401] I makahia te okotahi me te kore tuku i te tohu 'hua'. Ka taea te pakaru mahara. 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;
}

I kite te kaitirotiro i tetahi hapa i muri i te tohatoha o te mahara ki roto Waihanga Ahanoa, ka puta he tuunga, karekau te mahara e whakawāteahia, ka puta he turuturu mahara.

Whakatupato N2

V501 He rite tonu nga kupu-iti '(1ULL << WIDX_MONTH_BOX)' ki te taha maui me te taha matau o te '|' kaiwhakahaere. 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),
  ....
};

He iti noa nga tangata i tua atu i te kaitirotiro pateko ka taea tenei whakamatautau aro. He pai tenei tauira kape-whakapiri mo tenei take.

Whakatupato N3

V703 He rerekee ko te mara 'kara' i roto i te karaehe take 'RCT12BannerElement' ka tuhirua i te mara ki te akomanga turanga 'RCT12TileElementBase'. Tirohia nga rarangi: RCT12.h:570, RCT12.h:259. libopenrct2 RCT12.h 570

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

Ko te tikanga, ko te whakamahi i tetahi taurangi me te ingoa kotahi i roto i te akomanga turanga me te uri kaore i te he i nga wa katoa. Heoi ano, ko te hangarau tuku iho e kii ana ko nga mara katoa o te akomanga matua kei roto i te akomanga tamariki. Ma te whakapuaki i nga mara me te ingoa kotahi i roto i te tangata tuku iho, ka puta te raruraru.

Whakatupato N4

V793 He mea rereke ko te hua o te korero 'imageDirection / 8' he waahanga o te ahuatanga. Tena pea, me whakarite tenei korero ki tetahi atu mea. libopenrct2 ObservationTower.cpp 38

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

Kia ata titiro tatou. Whakaaturanga atahanga Aronga/8 ka teka ki te atahanga Aronga kei te awhe mai i te -7 ki te 7. Wāhanga tuarua: (Whakaahuatanga / 8) != 3 arowhai atahanga Aronga mo te noho ki waho o te awhe: mai i te -31 ki te -24 me te 24 ki te 31. He ahua ke ki ahau ki te tirotiro i nga nama mo te whakauru ki roto i etahi awhe penei, a, ahakoa karekau he he o tenei waahanga waehere, ka tūtohu ahau kia tuhia ano enei tikanga kia tino marama ake. Ma tenei ka ngawari ake te oranga mo te hunga ka panui me te pupuri i tenei waehere.

Whakatupato N5

V587 He raupapa rereke o nga taumahi penei: A = B; B = A;. Tirohia nga rarangi: 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;
      ....
  }
  ....
}

Ko tenei kongakonga waehere i riro mai i te wetewete. Na, ma te whakatau i te korero i mahue, ka tangohia tetahi waahanga o te waehere kore mahi. Heoi ano, e rua tonu nga mahi e toe ana cursorId, e kore hoki e tino whai tikanga.

Whakatupato N6

V1004 [CWE-476] I whakamahia kino te tohu 'kaitakaro' i muri i tana manatoko ki te nullptr. Tirohia nga rarangi: 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);                    // <=
  }
  ....
}

He tino ngawari tenei waehere ki te whakatika; me tirotiro koe i te toru o nga wa kaitākaro ki te atatohu kore, ki te taapiri atu ranei ki te tinana o te korero here. Ka whakaaro ahau ki te whiringa tuarua:

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

Whakatupato N7

V547 [CWE-570] He teka tonu te whakahua 'ingoa == nullptr'. 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));
    ....
  }
  ....
}

Ka taea e koe te whakakore i te rarangi waehere pakeke-ki-te-panui i te wa kotahi ka whakatau i te raru ma te tirotiro mo nullptr. Ka whakaaro ahau ki te whakarereke i te waehere penei:

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

Whakatupato N8

V1048 [CWE-1164] Ko te taurangi 'ColumnHeaderPressedCurrentState' he rite tonu te uara. libopenrct2ui CustomListView.cpp 510

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

He rereke te ahua o te waehere. Ki taku whakaaro i puta he hapa i roto i te ahuatanga, i te wa ranei e tautapa ana te taurangi ColumnHeaderPressedCurrentState tikanga teka.

mutunga

Kei te kite tatou, he ngawari noa te whakauru i te kaitirotiro pateko PVS-Studio ki to kaupapa TeamCity. Ki te mahi i tenei, he nui noa te tuhi i tetahi konae whirihoranga iti. Ko te tirotiro i te waehere ka taea e koe te tautuhi i nga raruraru i muri tonu i te huihuinga, ka awhina i te whakakore i te wa e iti tonu ana te uaua me te utu o nga huringa.

PVS-Studio me te Whakauru Tonu: TeamCity. Te tātaritanga o te kaupapa Open RollerCoaster Tycoon 2
Mena kei te pirangi koe ki te tiri i tenei tuhinga ki te hunga whakarongo ki te reo Ingarihi, whakamahia te hononga whakamaori: Vladislav Stolyarov. PVS-Studio me te Whakauru Tonu: TeamCity. Te tātaritanga o te kaupapa Open RollerCoaster Tycoon 2.

Source: will.com

Tāpiri i te kōrero