PVS-Stiúideo agus Comhtháthú Leanúnach: TeamCity. Anailís ar thionscadal Open RollerCoaster Tycoon 2

PVS-Stiúideo agus Comhtháthú Leanúnach: TeamCity. Anailís ar thionscadal Open RollerCoaster Tycoon 2
Ceann de na cásanna is reatha maidir le húsáid an anailísí PVS-Studio is ea é a chomhtháthú le córais CI. Agus cé gur féidir an anailís ar thionscadal PVS-Studio ó beagnach aon chóras comhtháthaithe leanúnach a chur san áireamh i roinnt orduithe, leanaimid ar aghaidh ag déanamh an phróisis seo níos áisiúla fós. Tá tacaíocht ag PVS-Studio anois chun aschur anailíseora a thiontú go formáid do TeamCity - Cineál Iniúchtaí TeamCity. A ligean ar a fheiceáil conas a oibríonn sé.

Eolas faoi na bogearraí a úsáidtear

Stiúideo PVS — anailísí statach ar chód C, C++, C# agus Java, atá deartha chun an tasc a éascú maidir le cineálacha éagsúla earráidí a aimsiú agus a cheartú. Is féidir an anailíseoir a úsáid ar Windows, Linux agus macOS. San Airteagal seo úsáidfimid go gníomhach ní hamháin an anailíseoir féin, ach freisin roinnt fóntais óna dáileadh.

CLMonatóir - is freastalaí monatóireachta é a dhéanann monatóireacht ar sheoltaí tiomsaitheoirí. Ní mór é a rith díreach sula dtosaíonn tú ag tógáil do thionscadal. I mód suanála, idircheapfaidh an freastalaí ritheanna na dtiomsaitheoirí go léir a dtacaítear leo. Is fiú a thabhairt faoi deara nach féidir an áirgiúlacht seo a úsáid ach amháin chun anailís a dhéanamh ar thionscadail C/C++.

PlogConverter – fóntais chun tuarascálacha anailíseora a thiontú go formáidí éagsúla.

Eolas faoin tionscadal atá á staidéar

Déanaimis iarracht an fheidhmiúlacht seo ar shampla praiticiúil - déanaimis anailís ar an tionscadal OpenRCT2.

Oscail RCT2 - cur i bhfeidhm oscailte an chluiche RollerCoaster Tycoon 2 (RCT2), é a leathnú le feidhmeanna nua agus fabhtanna a shocrú. Baineann gameplay le tógáil agus cothabháil páirc siamsa ina bhfuil turais, siopaí agus áiseanna. Caithfidh an t-imreoir iarracht a dhéanamh brabús a dhéanamh agus dea-cháil na páirce a chothabháil agus aíonna a choinneáil sásta. Ligeann OpenRCT2 duit imirt sa chás agus sa bhosca gainimh. Éilíonn Cásanna go ndéanfadh an t-imreoir tasc ar leith laistigh d'am socraithe, agus ligeann Bosca Gainimh don imreoir páirc níos solúbtha a thógáil gan aon srianta nó airgeadas.

coigeartú

Chun am a shábháil, is dócha go scipfidh mé an próiseas suiteála agus go dtosóidh mé ón nóiméad a mbeidh an freastalaí TeamCity agam ag rith ar mo ríomhaire. Ní mór dúinn dul go: localhost: {port sonraithe le linn an phróisis suiteála} (i mo chás, localhost: 9090) agus sonraí údaraithe a chur isteach. Tar éis dul isteach cuirfimid fáilte roimh:

PVS-Stiúideo agus Comhtháthú Leanúnach: TeamCity. Anailís ar thionscadal Open RollerCoaster Tycoon 2
Cliceáil ar an gcnaipe Cruthaigh Tionscadal. Ansin, roghnaigh de láimh agus líon isteach na réimsí.

PVS-Stiúideo agus Comhtháthú Leanúnach: TeamCity. Anailís ar thionscadal Open RollerCoaster Tycoon 2
Tar éis an cnaipe a bhrú Cruthaigh, cuirtear fáilte roimh fhuinneog le socruithe.

PVS-Stiúideo agus Comhtháthú Leanúnach: TeamCity. Anailís ar thionscadal Open RollerCoaster Tycoon 2
A ligean ar cliceáil Cruthaigh cumraíocht tógála.

PVS-Stiúideo agus Comhtháthú Leanúnach: TeamCity. Anailís ar thionscadal Open RollerCoaster Tycoon 2
Líon isteach na réimsí agus cliceáil Cruthaigh. Feicimid fuinneog ag iarraidh ort córas rialaithe leagan a roghnú. Ós rud é go bhfuil na foinsí lonnaithe go háitiúil cheana féin, cliceáil Skip to.

PVS-Stiúideo agus Comhtháthú Leanúnach: TeamCity. Anailís ar thionscadal Open RollerCoaster Tycoon 2
Ar deireadh, bogaimid ar aghaidh go dtí na socruithe tionscadail.

PVS-Stiúideo agus Comhtháthú Leanúnach: TeamCity. Anailís ar thionscadal Open RollerCoaster Tycoon 2
Cuirimis céimeanna tionóil leis, chun an cliceáil seo a dhéanamh: Céimeanna Tógáil -> Cuir céim thógála leis.

PVS-Stiúideo agus Comhtháthú Leanúnach: TeamCity. Anailís ar thionscadal Open RollerCoaster Tycoon 2
Anseo roghnaíonn muid:

  • Cineál rádala -> Líne Ceannais
  • Rith -> Script Chustaim

Ós rud é go ndéanfaimid anailís le linn tiomsú tionscadail, ba cheart go mbeadh cóimeáil agus anailís mar chéim amháin, mar sin líon isteach an réimse Script Chustaim:

PVS-Stiúideo agus Comhtháthú Leanúnach: TeamCity. Anailís ar thionscadal Open RollerCoaster Tycoon 2
Breathnóimid ar chéimeanna aonair níos déanaí. Tá sé tábhachtach nach dtógann sé ach aon líne déag de chód chun an anailísí a luchtú, an tionscadal a chur le chéile, é a anailísiú, an tuarascáil a aschur agus a fhormáidiú.

Is é an rud deireanach is gá dúinn a dhéanamh ná na hathróga timpeallachta a shocrú, a leag mé amach roinnt bealaí chun a n-inléiteacht a fheabhsú. Chun seo a dhéanamh, bogaimis ar aghaidh: Paraiméadair -> Cuir paraiméadar nua leis agus cuir trí athróg leis:

PVS-Stiúideo agus Comhtháthú Leanúnach: TeamCity. Anailís ar thionscadal Open RollerCoaster Tycoon 2
Níl le déanamh agat ach an cnaipe a bhrú Rith sa chúinne uachtarach ar dheis. Agus an tionscadal á chur le chéile agus á anailísiú, inseoidh mé duit faoin script.

Go díreach script

Ar dtús, ní mór dúinn an dáileadh PVS-Studio is déanaí a íoslódáil. Chun seo a úsáid againn an bainisteoir pacáiste Chocolatey. Dóibh siúd ar mian leo tuilleadh eolais a fháil faoi seo, tá comhfhreagrach ann airteagal:

choco install pvs-studio -y

Ar aghaidh, cuirfimid fóntais rianaithe tógála tionscadal CLMonitor ar aghaidh.

%CLmon% monitor –-attach

Ansin tógfaimid an tionscadal mar athróg timpeallachta MSB is é an cosán go dtí an leagan de MBuild is gá dom a thógáil

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

Cuirimis an logáil isteach agus an eochair cheadúnais le haghaidh PVS-Studio:

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

Tar éis an tógáil a bheith críochnaithe, reáchtáil CLMonitor arís chun comhaid réamhphróiseáilte agus anailís statach a ghiniúint:

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

Ansin úsáidfimid áirgiúlacht eile ónár dáileadh. Tiontaíonn PlogConverter tuarascáil ó fhormáid chaighdeánach go formáid a bhaineann go sonrach le TeamCity. A bhuí leis seo, beimid in ann é a fheiceáil go díreach sa bhfuinneog tógála.

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

Is é an chéim dheireanach ná an tuarascáil formáidithe a thaispeáint i stdout, áit a bpiocfaidh parsálaí TeamCity é.

type "C:tempptest.plog_TeamCity.txt"

Cód iomlán scripte:

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"

Idir an dá linn, tá an tionól agus an anailís ar an tionscadal críochnaithe go rathúil, is féidir linn dul go dtí an cluaisín Tionscadail agus déan cinnte de.

PVS-Stiúideo agus Comhtháthú Leanúnach: TeamCity. Anailís ar thionscadal Open RollerCoaster Tycoon 2
Anois, a ligean ar cliceáil ar Cigireachtaí Iomlánchun féachaint ar thuarascáil an anailíseora:

PVS-Stiúideo agus Comhtháthú Leanúnach: TeamCity. Anailís ar thionscadal Open RollerCoaster Tycoon 2
Déantar rabhaidh a ghrúpáil de réir uimhreacha riail diagnóiseacha. Chun dul tríd an gcód, ní mór duit cliceáil ar an uimhir líne leis an rabhadh. Má chliceálann tú ar an comhartha ceiste sa chúinne uachtarach ar dheis osclófar cluaisín nua duit le doiciméadú. Is féidir leat nascleanúint a dhéanamh tríd an gcód freisin trí chliceáil ar an uimhir líne leis an rabhadh anailísí. Is féidir nascleanúint ó ríomhaire cianda nuair a bhíonn tú ag úsáid SourceTreeRoot marcóir. Is féidir le duine ar bith a bhfuil suim aige sa mhodh oibríochta seo den anailíseoir eolas a chur ar an rannán comhfhreagrach doiciméadú.

Ag féachaint ar thorthaí an anailíseora

Anois agus an tógáil críochnaithe á imscaradh agus á chumrú againn, déanaimis féachaint ar roinnt rabhaidh suimiúla a fuarthas sa tionscadal a bhfuilimid ag féachaint air.

Rabhadh N1

V773 [CWE-401] Caitheadh ​​an eisceacht gan an pointeoir ‘toraidh’ a scaoileadh. Is féidir le sceitheadh ​​cuimhne. 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;
}

Thug an anailíseoir earráid faoi deara tar éis dó an chuimhne a leithdháileadh go dinimiciúil CruthaighObject, nuair a tharlaíonn eisceacht, ní dhéantar an chuimhne a ghlanadh, agus tarlaíonn sceitheadh ​​cuimhne.

Rabhadh N2

V501 Tá fo-léirithe comhionanna '(1ULL << WIDX_MONTH_BOX)' ar chlé agus ar dheis den '|' oibreoir. Cheats libopenrct2ui.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),
  ....
};

Is beag duine seachas anailísí statach a d’fhéadfadh pas a fháil sa tástáil aireach seo. Tá an sampla cóip-ghreamú seo go maith ar an gcúis seo go beacht.

Rabhaidh N3

V703 Is aisteach an rud é go ndéanann an réimse ‘bratach’ in aicme díorthaithe ‘RCT12BannerElement’ an réimse a fhorscríobh sa bhunrang ‘RCT12TileElementBase’. Línte seiceála: RCT12.h:570, RCT12.h:259. libopenrct2 RCT12.h 570

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

Ar ndóigh, ní earráid i gcónaí é athróg leis an ainm céanna a úsáid sa bhunrang agus sa sliocht. Mar sin féin, glacann teicneolaíocht oidhreachta féin leis go bhfuil réimsí uile an ranga tuismitheora i láthair sa rang leanaí. Trí réimsí leis an ainm céanna san oidhre ​​a dhearbhú, cruthaímid mearbhall.

Rabhadh N4

V793 Is aisteach an rud é gur cuid den riocht é toradh an ráitis ‘imageDirection/8’. B'fhéidir gur cheart an ráiteas seo a chur i gcomparáid le rud éigin eile. libopenrct2 ObservationTower.cpp 38

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

A ligean ar ghlacadh le breathnú níos dlúithe. Léiriú íomháTreoir/8 beidh sé bréagach má treoshuíomh íomhá atá sa raon ó -7 go 7. An dara cuid: (imageDirection/8) !=3 seiceálacha treoshuíomh íomhá as a bheith lasmuigh den raon: ó -31 go -24 agus ó 24 go 31, faoi seach. Is cosúil go bhfuil sé aisteach go leor dom uimhreacha a sheiceáil lena gcuimsiú i raon áirithe ar an mbealach seo agus, fiú mura bhfuil aon earráid sa phíosa cód seo, mholfainn na coinníollacha seo a athscríobh le bheith níos soiléire. Dhéanfadh sé seo an saol i bhfad níos éasca do na daoine a léifeadh agus a choimeádfadh an cód seo.

Rabhadh N5

V587 Seicheamh corr tascanna den chineál seo: A = B; B = A;. Línte seiceála: 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;
      ....
  }
  ....
}

Is dócha gur trí dhí-thiomsú a fuarthas an blúire cód seo. Ansin, de réir an nóta tráchta a fágadh, baineadh cuid den chód neamhoibríoch. Mar sin féin, tá cúpla oibríocht fágtha fós Id cúrsóra, rud nach bhfuil mórán ciall leo freisin.

Rabhadh N6

V1004 [CWE-476] Úsáideadh an pointeoir ‘imreoir’ go neamhshábháilte tar éis é a fhíorú i gcoinne nullptr. Línte seiceála: 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);                    // <=
  }
  ....
}

Is furasta an cód seo a cheartú; ní gá duit ach é a sheiceáil an tríú huair imreoir chuig pointeoir nialasach, nó cuir le corp an ráitis choinníollaigh é. Mholfainn an dara rogha:

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

Rabhadh N7

V547 [CWE-570] Bíonn an abairt ‘name == nullptr’ i gcónaí bréagach. 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));
    ....
  }
  ....
}

Is féidir leat fáil réidh le líne chóid atá deacair le léamh i gceann amháin swoop agus an fhadhb a réiteach le seiceáil le haghaidh nullptr. Molaim an cód a athrú mar seo a leanas:

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

Rabhadh N8

V1048 [CWE-1164] Sannadh an luach céanna don athróg ‘ColumnHeaderPressedCurrentState’. libopenrct2ui CustomListView.cpp 510

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

Breathnaíonn an cód aisteach go leor. Feictear dom go raibh typo sa riocht nó nuair a bhí an athróg á athshannadh ColumnHeaderPressedCurrentState luachanna bréagach.

Aschur

Mar is féidir linn a fheiceáil, tá comhtháthú an anailísí statach PVS-Studio isteach i do thionscadal TeamCity simplí go leor. Chun seo a dhéanamh, is leor comhad cumraíochta beag amháin a scríobh. Tabharfaidh seiceáil an chóid deis duit fadhbanna a aithint díreach tar éis an tionóil, rud a chabhróidh leat iad a dhíchur nuair a bhíonn castacht agus costas na n-athruithe fós íseal.

PVS-Stiúideo agus Comhtháthú Leanúnach: TeamCity. Anailís ar thionscadal Open RollerCoaster Tycoon 2
Más mian leat an t-alt seo a roinnt le lucht féachana Béarla, bain úsáid as an nasc aistriúcháin: Vladislav Stolyarov. PVS-Stiúideo agus Comhtháthú Leanúnach: TeamCity. Anailís ar thionscadal Open RollerCoaster Tycoon 2.

Foinse: will.com

Add a comment