PVS-Studio le Kopano e Tsoelang Pele: TeamCity. Tlhahlobo ea morero oa Open RollerCoaster Tycoon 2

PVS-Studio le Kopano e Tsoelang Pele: TeamCity. Tlhahlobo ea morero oa Open RollerCoaster Tycoon 2
E 'ngoe ea maemo a hajoale a ho sebelisa analyzer ea PVS-Studio ke ho hokahana ha eona le litsamaiso tsa CI. Mme leha tlhahlobo ea projeke ea PVS-Studio ho tsoa ho sistimi efe kapa efe e tsoelang pele ea ho kopanya e ka hahuoa ka litaelo tse 'maloa feela, re ntse re tsoela pele ho etsa hore ts'ebetso ena e be bonolo le ho feta. Hona joale PVS-Studio e na le ts'ehetso ea ho fetolela tlhahiso ea analyzer hore e be sebopeho sa TeamCity - Mofuta oa Tlhahlobo oa TeamCity. A re bone hore na e sebetsa joang.

Lintlha tse mabapi le software e sebelisitsoeng

Studio-PVS - mohlahlobi o tsitsitseng oa khoutu ea C, C ++, C # le Java, e etselitsoeng ho nolofatsa mosebetsi oa ho fumana le ho lokisa mefuta e fapaneng ea liphoso. Analyzer e ka sebelisoa ho Windows, Linux le macOS. Sehloohong sena re ke ke ra sebelisa analyzer ka mafolofolo feela, empa le lisebelisoa tse ling tse tsoang kabong ea eona.

CLMonitor - ke seva ea ho beha leihlo e behang leihlo ho qala komporo. E tlameha ho tsamaisoa hang hang pele o qala ho aha projeke ea hau. Ka mokhoa oa ho snooping, seva e tla thibela li-compilers tsohle tse tšehetsoeng. Ke habohlokoa ho hlokomela hore sesebelisoa sena se ka sebelisoa feela ho hlahloba merero ea C / C ++.

PlogConverter - Sesebelisoa sa ho fetolela litlaleho tsa analyzer hore e be lifomate tse fapaneng.

Lintlha tse mabapi le morero o ntseng o ithutoa

Ha re leke ts'ebetso ena ho mohlala o sebetsang - ha re hlahlobeng morero oa OpenRCT2.

OpenRCT2 - ts'ebetsong e bulehileng ea papali ea RollerCoaster Tycoon 2 (RCT2), e e atolosa ka mesebetsi e mecha le ho lokisa liphoso. Papali e mabapi le ho aha le ho hlokomela serapa sa boithabiso se nang le likoloi, mabenkele le lisebelisoa. Sebapali se tlameha ho leka ho etsa phaello le ho boloka botumo bo botle ba serapa sa boikhathollo ha se ntse se boloka baeti ba thabile. OpenRCT2 e u lumella ho bapala maemong le sandbox. Maemo a hloka hore sebapali se phethe mosebetsi o itseng ka nako e behiloeng, ha Sandbox e lumella sebapali ho haha ​​​​paka e feto-fetohang ntle le lithibelo kapa lichelete.

phetoho

E le ho boloka nako, mohlomong ke tla tlōla mokhoa oa ho kenya 'me ke qale ho tloha ha ke e-na le seva sa TeamCity se sebetsang khomphuteng ea ka. Re hloka ho ea ho: localhost:{port e boletsoeng nakong ea ts'ebetso ea ho kenya} (tabeng ea ka, localhost:9090) 'me u kenye lintlha tsa tumello. Ka mor'a ho kena re tla amoheloa ke:

PVS-Studio le Kopano e Tsoelang Pele: TeamCity. Tlhahlobo ea morero oa Open RollerCoaster Tycoon 2
Tobetsa konopo ea Create Project. E latelang, khetha Ka letsoho 'me u tlatse libaka.

PVS-Studio le Kopano e Tsoelang Pele: TeamCity. Tlhahlobo ea morero oa Open RollerCoaster Tycoon 2
Ka mor'a ho tobetsa konopo Create, re lumelisoa ke fensetere e nang le litlhophiso.

PVS-Studio le Kopano e Tsoelang Pele: TeamCity. Tlhahlobo ea morero oa Open RollerCoaster Tycoon 2
Ha re tobetse Etsa tlhophiso ea ho haha.

PVS-Studio le Kopano e Tsoelang Pele: TeamCity. Tlhahlobo ea morero oa Open RollerCoaster Tycoon 2
Tlatsa masimo mme o tobetse Create. Re bona fensetere e u kopang hore u khethe mokhoa oa ho laola mofuta. Kaha mehloli e se e fumaneha sebakeng sa heno, tobetsa Skip.

PVS-Studio le Kopano e Tsoelang Pele: TeamCity. Tlhahlobo ea morero oa Open RollerCoaster Tycoon 2
Qetellong, re fetela ho litlhophiso tsa morero.

PVS-Studio le Kopano e Tsoelang Pele: TeamCity. Tlhahlobo ea morero oa Open RollerCoaster Tycoon 2
Ha re kenye mehato ea kopano, ho etsa tlanya ena: Haha mehato -> Eketsa mohato oa ho haha.

PVS-Studio le Kopano e Tsoelang Pele: TeamCity. Tlhahlobo ea morero oa Open RollerCoaster Tycoon 2
Mona re khetha:

  • Mofuta oa semathi -> Mola oa Taelo
  • Matha -> Custom Script

Kaha re tla etsa tlhahlobo nakong ea ho bokella morero, kopano le tlhahlobo e lokela ho ba mohato o le mong, kahoo tlatsa tšimo Script Script:

PVS-Studio le Kopano e Tsoelang Pele: TeamCity. Tlhahlobo ea morero oa Open RollerCoaster Tycoon 2
Re tla sheba mehato ea motho ka mong hamorao. Ke habohlokoa hore ho kenya analyzer, ho bokella morero, ho e hlahloba, ho ntša tlaleho le ho e hlophisa ho nka mela e leshome le motso o mong feela oa khoutu.

Ntho ea ho qetela eo re lokelang ho e etsa ke ho beha mefuta-futa ea tikoloho, eo ke e hlalositseng litsela tse ling tsa ho ntlafatsa ho bala ha tsona. Ho etsa sena, ha re tsoeleng pele: Liparamente -> Kenya paramente e ncha ebe o eketsa mefuta e meraro:

PVS-Studio le Kopano e Tsoelang Pele: TeamCity. Tlhahlobo ea morero oa Open RollerCoaster Tycoon 2
Seo u lokelang ho se etsa ke ho tobetsa konopo Matha sekhutlong se kaholimo ho le letona. Ha morero o ntse o bokelloa le ho hlahlojoa, ke tla u bolella ka script.

Script ka ho toba

Taba ea pele, re hloka ho khoasolla phepelo ea morao-rao ea PVS-Studio. Bakeng sa sena re sebelisa mookameli oa sephutheloana sa Chocolatey. Bakeng sa ba batlang ho tseba haholoanyane ka sena, ho na le e tsamaisanang sehlooho:

choco install pvs-studio -y

Ka mor'a moo, ha re qaleng ts'ebeliso ea ts'ebeliso ea projeke ea CLMonitor.

%CLmon% monitor –-attach

Joale re tla aha morero ona e le mofuta oa tikoloho MSB ke tsela ea mofuta oa MSBuild eo ke hlokang ho e haha

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

Ha re kenye senotlolo sa ho kena le laesense bakeng sa PVS-Studio:

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

Kamora hore moaho o phetheloe, tsamaisa CMonitor hape ho hlahisa lifaele tse fetisitsoeng pele le tlhahlobo e tsitsitseng:

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

Joale re tla sebelisa sesebelisoa se seng ho tloha kabong ea rona. PlogConverter e fetolela tlaleho ho tloha sebopehong se tloaelehileng ho ea ho sebopeho se ikhethileng sa TeamCity. Ka lebaka la sena, re tla khona ho e sheba ka kotloloho fensetereng ea kaho.

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

Mohato oa ho qetela ke ho hlahisa tlaleho e hlophisitsoeng ho stout, moo e tla nkuoa ke mohlahlobi oa TeamCity.

type "C:tempptest.plog_TeamCity.txt"

Khoutu e felletseng ea mongolo:

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"

Ho sa le joalo, kopano le tlhahlobo ea morero e phethiloe ka katleho, re ka ea ho tab Projects le убедиться в этом.

PVS-Studio le Kopano e Tsoelang Pele: TeamCity. Tlhahlobo ea morero oa Open RollerCoaster Tycoon 2
Joale ha re tobetse Kakaretso ea Litlhahloboho ea ho sheba tlaleho ea analyzer:

PVS-Studio le Kopano e Tsoelang Pele: TeamCity. Tlhahlobo ea morero oa Open RollerCoaster Tycoon 2
Litemoso li hlophisoa ka linomoro tsa melao ea tlhahlobo. Ho tsamaea ka khoutu, o hloka ho tobetsa nomoro ea mohala ka temoso. Ho tobetsa letšoao la potso hukung e kaholimo ho le letona ho tla u bulela tab e ncha e nang le litokomane. U ka boela ua tsamaea ka khoutu ka ho tobetsa nomoro ea mohala ka temoso ea analyzer. Ho tsamaea ho tsoa komporong e hole hoa khoneha ha u sebelisa SourceTreeRoot lesupa. Mang kapa mang ea thahasellang mokhoa ona oa ts'ebetso ea analyzer a ka tloaelana le karolo e lumellanang litokomane.

Ho sheba liphetho tsa mohlahlobi

Kaha joale re se re qetile ho tsamaisa le ho hlophisa moaho, ha re shebeng litemoso tse khahlisang tse fumanoang morerong oo re o shebileng.

Tlhokomeliso N1

V773 [CWE-401] Mokhelo o ile oa lahleloa ntle le ho lokolla sesupo sa 'sephetho'. Ho dutla memori ho a kgoneha. 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 e hlokometse phoso eo kamora ho fana ka memori ka matla CreateObject, ha mokhelo o hlaha, memori ha e hlakoloe, mme ho dutla memoring.

Tlhokomeliso N2

V501 Ho na le mengolo e ts'oanang '(1ULL << WIDX_MONTH_BOX)' ka ho le letšehali le ka ho le letona la '|' mosebeletsi. 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),
  ....
};

Ke batho ba 'maloa ntle le setsebi sa static analyzer ba ka khonang ho etsa tlhahlobo ena ea ho ela hloko. Mohlala ona oa kopi-paste o nepahetse ka lebaka lena.

Litemoso N3

V703 Hoa makatsa hore ebe karolo ea 'lifolakha' sehlopheng se nkiloeng 'RCT12BannerElement' e hlakola karolo ea sehlopha sa "RCT12TileElementBase". Hlahloba mela: RCT12.h:570, RCT12.h:259. libopenrct2 RCT12.h 570

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

Ha e le hantle, ho sebelisa phetoho e nang le lebitso le tšoanang sehlopheng sa motheo le ho setloholo hase kamehla phoso. Leha ho le joalo, theknoloji ea lefa ka boeona e nka hore likarolo tsohle tsa sehlopha sa motsoali li teng sehlopheng sa bana. Ka ho phatlalatsa masimo a nang le lebitso le le leng ho mojalefa, re hlahisa pherekano.

Tlhokomeliso N4

V793 Hoa makatsa hore sephetho sa polelo ea 'imageDirection / 8' ke karolo ea boemo. Mohlomong, polelo ena e ne e lokela ho bapisoa le ntho e 'ngoe. libopenrct2 ObservationTower.cpp 38

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

A re hlahlobeng ka hloko. Polelo ImageDirection/8 e tla ba leshano haeba setšoantšoDirection e maemong a ho tloha ho -7 ho isa ho 7. Karolo ea bobeli: (ImageDirection / 8) != 3 licheke setšoantšoDirection bakeng sa ho ba ka ntle ho moeli: ho tloha ho -31 ho ea ho -24 le ho tloha 24 ho ea ho 31, ka ho latellana. Ho bonahala ho makatsa ho 'na ho hlahloba linomoro bakeng sa ho kenyeletsoa mofuteng o itseng ka tsela ena, le haeba ho se na phoso karolong ena ea khoutu, ke tla khothaletsa ho ngola maemo ana hape hore a hlake haholoanyane. Sena se ne se tla nolofatsa bophelo ho batho ba neng ba tla bala le ho boloka khoutu ena.

Tlhokomeliso N5

V587 Tatelano e sa tlwaelehang ya dikabelo tsa mofuta ona: A = B; B = A;. Sheba mela: 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;
      ....
  }
  ....
}

Sekhechana sena sa khoutu ho ka etsahala hore ebe se fumanoe ka ho arohana. Joale, ho ahlola ka maikutlo a setseng, karolo ea khoutu e sa sebetseng e ile ea tlosoa. Leha ho le joalo, ho ntse ho na le ts'ebetso e 'maloa e setseng cursorId, eo le eona e sa utloahaleng haholo.

Tlhokomeliso N6

V1004 [CWE-476] Sesupa sa 'player' se sebelisitsoe ka mokhoa o sa sireletsehang ka mor'a hore se netefatsoe khahlanong le nullptr. Sheba mela: 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);                    // <=
  }
  ....
}

Khoutu ena e bonolo haholo ho e lokisa; o hloka feela ho e hlahloba khetlo la boraro sebapala ho pontshi e se nang thuso, kapa o e kenye mmeleng wa polelo e nang le maemo. Ke khothaletsa khetho ea bobeli:

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

Tlhokomeliso N7

V547 [CWE-570] Polelo ea 'lebitso == nullptr' e lula e le leshano. 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));
    ....
  }
  ....
}

U ka tlosa mohala o thata ho bala oa khoutu ka nako e le 'ngoe ebe u rarolla bothata ka ho hlahloba nullptr. Ke khothaletsa ho fetola khoutu ka tsela e latelang:

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

Tlhokomeliso N8

V1048 [CWE-1164] Phapang ea 'ColumnHeaderPressedCurrentState' e fuoe boleng bo tšoanang. libopenrct2ui CustomListView.cpp 510

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

Khoutu e shebahala e makatsa haholo. Ho 'na ho bonahala eka ho ne ho e-na le bothata ba ho thaepa boemong boo kapa ha ho ne ho abeloa phetoho ColumnHeaderPressedCurrentState boleng bohata.

fihlela qeto e

Joalo ka ha re bona, ho kopanya analyzer ea PVS-Studio static projeke ea hau ea TeamCity ho bonolo haholo. Ho etsa sena, ho lekane ho ngola faele e le 'ngoe feela e nyane ea tlhophiso. Ho hlahloba khoutu ho tla u lumella ho khetholla mathata hang ka mor'a kopano, e leng ho tla thusa ho a felisa ha ho rarahana le litšenyehelo tsa liphetoho li ntse li le tlaase.

PVS-Studio le Kopano e Tsoelang Pele: TeamCity. Tlhahlobo ea morero oa Open RollerCoaster Tycoon 2
Haeba u batla ho arolelana sehlooho sena le bamameli ba buang Senyesemane, ka kopo sebelisa sehokelo sa phetolelo: Vladislav Stolyarov. PVS-Studio le Kopano e Tsoelang Pele: TeamCity. Tlhahlobo ea morero oa Open RollerCoaster Tycoon 2.

Source: www.habr.com

Eketsa ka tlhaloso