PVS-Studio a me ka hoʻohui mau ʻana: TeamCity. ʻIkepili o ka papahana Open RollerCoaster Tycoon 2

PVS-Studio a me ka hoʻohui mau ʻana: TeamCity. ʻIkepili o ka papahana Open RollerCoaster Tycoon 2
ʻO kekahi o nā hiʻohiʻona o kēia manawa no ka hoʻohana ʻana i ka anana PVS-Studio ʻo ia ka hoʻohui ʻana me nā ʻōnaehana CI. A ʻoiai ʻo ka nānā ʻana i kahi papahana PVS-Studio mai kahi kokoke i nā ʻōnaehana hoʻohui hoʻomau hiki ke kūkulu ʻia i loko o nā kauoha liʻiliʻi, hoʻomau mākou i kēia kaʻina hana i ʻoi aku ka maʻalahi. Loaʻa iā PVS-Studio ke kākoʻo no ka hoʻohuli ʻana i ka mea hoʻopuka analyer i kahi ʻano no TeamCity - TeamCity Inspections Type. E ʻike kākou pehea e hana ai.

ʻIke e pili ana i ka polokalamu i hoʻohana ʻia

ʻO PVS-Studio - he mea hoʻoponopono static o C, C++, C# a me Java code, i hoʻolālā ʻia e hoʻomaʻamaʻa i ka hana o ka ʻimi a hoʻoponopono ʻana i nā ʻano hewa like ʻole. Hiki ke hoʻohana ʻia ka mea loiloi ma Windows, Linux a me macOS. Ma kēia ʻatikala e hoʻohana ikaika mākou ʻaʻole wale i ka mea analista ponoʻī, akā i kekahi mau mea pono mai kāna hoʻolaha ʻana.

CLMonitor - he kikowaena kiaʻi e nānā ana i ka hoʻomaka ʻana o ka mea hoʻopili. Pono e holo koke ma mua o ka hoʻomaka ʻana e kūkulu i kāu papahana. Ma ke ʻano nānā ʻana, e kāpae ke kikowaena i nā holo o nā mea hoʻopili kākoʻo āpau. Pono e hoʻomaopopo ʻia hiki ke hoʻohana wale ʻia kēia pono no ka nānā ʻana i nā papahana C/C++.

PlogConverter - he pono no ka hoʻololi ʻana i nā hōʻike loiloi i nā ʻano like ʻole.

ʻIke e pili ana i ka papahana e aʻo ʻia nei

E ho'āʻo kākou i kēia hana me kahi laʻana kūpono - e nānā kākou i ka papahana OpenRCT2.

WeheRCT2 - kahi hoʻokō wehe o ka pāʻani RollerCoaster Tycoon 2 (RCT2), hoʻonui iā ia me nā hana hou a hoʻoponopono i nā pōpoki. Hoʻopili ka pāʻani i ke kūkulu ʻana a me ka mālama ʻana i kahi pā leʻaleʻa i loaʻa nā kaʻa, nā hale kūʻai, a me nā mea pono. Pono ka mea pāʻani e hoʻāʻo e loaʻa ka loaʻa kālā a mālama i ka inoa maikaʻi o ka paka me ka hauʻoli o nā malihini. OpenRCT2 hiki iā ʻoe ke pāʻani ma ke ʻano ʻelua a me ka pahu one. Pono nā hiʻohiʻona i ka mea pāʻani e hoʻopau i kahi hana kikoʻī i loko o kahi manawa i hoʻonohonoho ʻia, ʻoiai ʻo Sandbox e ʻae i ka mea pāʻani e kūkulu i kahi paka ʻoi aku ka maʻalahi me ka ʻole o nā palena a i ʻole kālā.

hoʻoponopono

I mea e mālama ai i ka manawa, e hoʻokuʻu paha wau i ke kaʻina hana hoʻonohonoho a hoʻomaka mai ka manawa e holo ana ka server TeamCity ma kaʻu kamepiula. Pono mākou e hele i: localhost:{port specified during the installation process} (ma koʻu hihia, localhost:9090) a hoʻokomo i ka ʻikepili ʻae. Ma hope o ke komo ʻana e hoʻokipa ʻia mākou e:

PVS-Studio a me ka hoʻohui mau ʻana: TeamCity. ʻIkepili o ka papahana Open RollerCoaster Tycoon 2
Kaomi ma ka pihi Create Project. A laila, koho Manual a hoʻopiha i nā kahua.

PVS-Studio a me ka hoʻohui mau ʻana: TeamCity. ʻIkepili o ka papahana Open RollerCoaster Tycoon 2
Ma hope o ke kaomi ʻana i ke pihi Hoʻoulu, hoʻokipa ʻia mākou e kahi puka aniani me nā hoʻonohonoho.

PVS-Studio a me ka hoʻohui mau ʻana: TeamCity. ʻIkepili o ka papahana Open RollerCoaster Tycoon 2
E kaomi kāua E hana i ka hoʻonohonoho kūkulu.

PVS-Studio a me ka hoʻohui mau ʻana: TeamCity. ʻIkepili o ka papahana Open RollerCoaster Tycoon 2
E hoʻopiha i nā kahua a kaomi Hoʻoulu. ʻIke mākou i kahi puka aniani e noi ana iā ʻoe e koho i kahi ʻōnaehana mana mana. No ka mea aia nā kumu ma ka ʻāina, kaomi E lele.

PVS-Studio a me ka hoʻohui mau ʻana: TeamCity. ʻIkepili o ka papahana Open RollerCoaster Tycoon 2
ʻO ka hope, neʻe mākou i nā hoʻonohonoho papahana.

PVS-Studio a me ka hoʻohui mau ʻana: TeamCity. ʻIkepili o ka papahana Open RollerCoaster Tycoon 2
E hoʻohui i nā ʻanuʻu hui, e hana i kēia kaomi: Hana i nā ʻanuʻu -> Hoʻohui i ka hana kūkulu.

PVS-Studio a me ka hoʻohui mau ʻana: TeamCity. ʻIkepili o ka papahana Open RollerCoaster Tycoon 2
Maanei mākou e koho ai:

  • ʻAno holo -> Laina kauoha
  • Holo -> Palapala Kuʻuna

No ka mea e hana mākou i ka nānā ʻana i ka wā o ka hōʻuluʻulu ʻana o ka papahana, ʻo ka hui ʻana a me ka nānā ʻana i hoʻokahi pae, no laila e hoʻopiha i ke kahua Hōʻike Kūʻokoʻa:

PVS-Studio a me ka hoʻohui mau ʻana: TeamCity. ʻIkepili o ka papahana Open RollerCoaster Tycoon 2
E nānā mākou i kēlā me kēia pae ma hope. He mea nui ka hoʻouka ʻana i ka mea loiloi, ka hui ʻana i ka papahana, ka nānā ʻana iā ia, ka hoʻopuka ʻana i ka hōʻike a me ka hoʻopili ʻana iā ia he ʻumikumamākahi laina o ke code.

ʻO ka mea hope a mākou e hana ai, ʻo ia ka hoʻonohonoho ʻana i nā ʻano hoʻololi kaiapuni, aʻu i wehewehe ai i kekahi mau ala e hoʻomaikaʻi ai i kā lākou heluhelu ʻana. No ka hana ʻana i kēia, e neʻe kākou: Nā ʻāpana -> Hoʻohui i nā ʻāpana hou a hoʻohui i ʻekolu mau hoʻololi:

PVS-Studio a me ka hoʻohui mau ʻana: TeamCity. ʻIkepili o ka papahana Open RollerCoaster Tycoon 2
ʻO nā mea a pau āu e hana ai, e kaomi i ke pihi holo ma ke kihi akau luna. ʻOiai e hōʻuluʻulu ʻia a nānā ʻia ka papahana, e haʻi wau iā ʻoe e pili ana i ka palapala.

Palapala pololei

ʻO ka mea mua, pono mākou e hoʻoiho i ka hoʻolaha PVS-Studio hou. No kēia, hoʻohana mākou i ka luna Chocolatey package. No ka poʻe makemake e ʻike hou aku e pili ana i kēia, aia kahi pili 'atikala:

choco install pvs-studio -y

Ma hope aʻe, e hoʻolauna i ka CLMonitor project build tracking utility.

%CLmon% monitor –-attach

A laila e kūkulu mākou i ka papahana ma ke ʻano he hoʻololi kaiapuni MSB ʻo ia ke ala i ka mana o MSBuild pono wau e kūkulu

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

E komo kāua i ke kī komo a me ka laikini no PVS-Studio:

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

Ma hope o ka pau ʻana o ke kūkulu ʻana, e holo hou iā CLMonitor e hana i nā faila preprocessed a me ka loiloi static:

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

A laila e hoʻohana mākou i kahi mea hoʻohana ʻē aʻe mai kā mākou mahele. Hoʻololi ʻo PlogConverter i kahi hōʻike mai kahi ʻano maʻamau i kahi ʻano kikoʻī TeamCity. Mahalo i kēia, hiki iā mākou ke nānā pono iā ia ma ka puka makani kūkulu.

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

ʻO ka hana hope e hōʻike i ka hōʻike i hoʻonohonoho ʻia ma stdout, kahi e kiʻi ʻia e ka TeamCity parser.

type "C:tempptest.plog_TeamCity.txt"

Helu palapala piha:

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 kēia manawa, ua hoʻopau maikaʻi ʻia ka hui a me ka nānā ʻana o ka papahana, hiki iā mākou ke hele i ka pā hana a e hooiaio.

PVS-Studio a me ka hoʻohui mau ʻana: TeamCity. ʻIkepili o ka papahana Open RollerCoaster Tycoon 2
I kēia manawa e kaomi ma luna Huina Nanae hele i ka nānā ʻana i ka hōʻike loiloi:

PVS-Studio a me ka hoʻohui mau ʻana: TeamCity. ʻIkepili o ka papahana Open RollerCoaster Tycoon 2
Hoʻopili ʻia nā ʻōlelo aʻo e nā helu lula diagnostic. No ka hoʻokele ʻana i ke code, pono ʻoe e kaomi i ka helu laina me ka ʻōlelo aʻo. Ke kaomi ʻana i ka māka nīnau ma ke kihi ʻākau i luna e wehe iā ʻoe i kahi ʻaoʻao hou me nā palapala. Hiki iā ʻoe ke hoʻokele i ke code ma ke kaomi ʻana i ka helu laina me ka ʻōlelo aʻoaʻo analyer. Hiki ke hoʻokele mai kahi kamepiula mamao ke hoʻohana SourceTreeRoot hoailona. ʻO ka mea makemake i kēia ʻano hana o ka mea ananely hiki ke hoʻomaʻamaʻa iā lākou iho me ka pauku pili palapala.

Ke nānā 'ana i nā hualoa'a a ka mea ho'oponopono

I kēia manawa ua pau mākou i ka hoʻonohonoho ʻana a me ka hoʻonohonoho ʻana i ke kūkulu ʻana, e nānā i kekahi mau ʻōlelo aʻo hoihoi i loaʻa i ka papahana a mākou e nānā nei.

'Ōlelo N1

V773 [CWE-401] Ua hoʻolei ʻia ka ʻokoʻa me ka hoʻokuʻu ʻole ʻana i ke kuhikuhi 'hopena'. Hiki i ka leak hoʻomanaʻo. 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;
}

Ua ʻike ka mea loiloi i kahi hewa ma hope o ka hoʻokaʻawale ʻana i ka hoʻomanaʻo i loko CreateObject, i ka wā e puka mai ai kahi ʻokoʻa, ʻaʻole i holoi ʻia ka hoʻomanaʻo, a hiki mai kahi leak hoʻomanaʻo.

'Ōlelo N2

V501 Aia nā mana'o like '(1ULL << WIDX_MONTH_BOX)' ma ka hema a ma ka ʻākau o ka '|' mea hoʻohana. 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),
  ....
};

ʻAʻole hiki i nā kānaka ʻē aʻe ke hele i kēia hōʻike hoʻolohe. Maikaʻi kēia laʻana kope-paste no kēia kumu.

'Ōlelo N3

V703 He mea ʻē aʻe ʻo ka 'hae' kahua ma ka papa i loaʻa 'RCT12BannerElement' e kākau i ka papa ma ka papa kumu 'RCT12TileElementBase'. E nānā i nā laina: RCT12.h:570, RCT12.h:259. libopenrct2 RCT12.h 570

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

ʻOiaʻiʻo, ʻo ka hoʻohana ʻana i kahi ʻano me ka inoa hoʻokahi i ka papa kumu a me ka mamo ʻaʻole ia he hewa mau. Eia naʻe, manaʻo ka ʻenehana hoʻoilina ponoʻī aia nā kahua āpau o ka papa makua i ka papa keiki. Ma ka haʻi ʻana i nā māla me ka inoa like i ka hoʻoilina, hana mākou i ka huikau.

'Ōlelo N4

V793 He mea ʻē ka hopena o ka ʻōlelo 'imageDirection / 8' he ʻāpana o ke kūlana. Malia paha, ua hoʻohālikelike ʻia kēia ʻōlelo me kekahi mea ʻē aʻe. libopenrct2 ObservationTower.cpp 38

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

E nānā pono kākou. Hōʻike kiʻi kuhikuhi/8 e hoopunipuni ina kiʻi kuhikuhi Aia ma ka laulima mai -7 a hiki i 7. Mahele ʻelua: (Ala kiʻi / 8) != 3 hōʻoia kiʻi kuhikuhi no ka mea ma waho o ka laulā: mai -31 a i -24 a mai 24 a 31. He mea kupanaha iaʻu ke nānā i nā helu no ka hoʻokomo ʻana i kekahi ʻano ma kēia ʻano, a inā ʻaʻohe hewa o kēia ʻāpana code, makemake wau e kākau hou i kēia mau kūlana i ʻoi aku ka maopopo. ʻO kēia ka mea e maʻalahi ai ke ola no ka poʻe e heluhelu a mālama i kēia code.

'Ōlelo N5

V587 He kaʻina hana ʻē aʻe o kēia ʻano: A = B; B = A;. E nānā i nā laina: 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;
      ....
  }
  ....
}

Loaʻa paha kēia ʻāpana code ma o ka decompilation. A laila, i ka hoʻoholo ʻana ma ka ʻōlelo i waiho ʻia, ua wehe ʻia kahi hapa o ka code hana ʻole. Eia nō naʻe, aia nō ʻelua mau hana i koe cursorId, ʻaʻole hoʻi i manaʻo nui.

'Ōlelo N6

V1004 [CWE-476] Ua hoʻohana pono ʻole ʻia ka mea kuhikuhi 'mea pāʻani' ma hope o ka hōʻoia ʻana i ka nullptr. E nānā i nā laina: 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 mea maʻalahi kēia code e hoʻoponopono; pono ʻoe e nānā i ke kolu o ka manawa Hawaii i kahi kuhikuhi null, a i ʻole e hoʻohui i ke kino o ka ʻōlelo kūlana. Manaʻo wau i ka koho ʻelua:

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

'Ōlelo N7

V547 [CWE-570] He wahaheʻe ka ʻōlelo 'name == 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));
    ....
  }
  ....
}

Hiki iā ʻoe ke hoʻopau i kahi laina paʻakikī o ka helu helu i hoʻokahi swoop a hoʻoponopono i ka pilikia me ka nānā ʻana nullptr. Manaʻo wau e hoʻololi i ke code 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);
    ....
  }
  ....
}

'Ōlelo N8

V1048 [CWE-1164] Ua hāʻawi ʻia ka helu 'ColumnHeaderPressedCurrentState' i ka waiwai like. libopenrct2ui CustomListView.cpp 510

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

ʻAno ʻē ke ʻano o ke code. Me he mea lā aia kekahi typo ma ke kūlana a i ʻole ke kau hou ʻana i ka loli ColumnHeaderPressedCurrentState nā hiʻohiʻona wahahee.

hopena

E like me kā mākou e ʻike ai, maʻalahi ka hoʻohui ʻana i ka PVS-Studio static analyzer i kāu papahana TeamCity. No ka hana ʻana i kēia, ua lawa ke kākau ʻana i hoʻokahi faila hoʻonohonoho liʻiliʻi. ʻO ka nānā ʻana i ke code e ʻae iā ʻoe e ʻike i nā pilikia ma hope koke o ka hōʻuluʻulu ʻana, e kōkua i ka hoʻopau ʻana iā lākou inā haʻahaʻa ka paʻakikī a me ke kumukūʻai o nā loli.

PVS-Studio a me ka hoʻohui mau ʻana: TeamCity. ʻIkepili o ka papahana Open RollerCoaster Tycoon 2
Inā makemake ʻoe e kaʻana like i kēia ʻatikala me ka lehulehu ʻōlelo Pelekania, e ʻoluʻolu e hoʻohana i ka loulou unuhi: Vladislav Stolyarov. PVS-Studio a me ka hoʻohui mau ʻana: TeamCity. ʻIkepili o ka papahana Open RollerCoaster Tycoon 2.

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka