PVS-Studio agus Amalachadh Leantainneach: TeamCity. Mion-sgrùdadh air a’ phròiseact Open RollerCoaster Tycoon 2

PVS-Studio agus Amalachadh Leantainneach: TeamCity. Mion-sgrùdadh air a’ phròiseact Open RollerCoaster Tycoon 2
Is e aon de na suidheachaidhean as ùire airson a bhith a’ cleachdadh an anailisiche PVS-Studio a bhith ag amalachadh le siostaman CI. Agus ged a dh’ fhaodar mion-sgrùdadh a dhèanamh air pròiseact PVS-Studio bho cha mhòr siostam amalachaidh leantainneach sam bith a-steach do dìreach beagan òrdughan, tha sinn a’ leantainn air adhart a’ dèanamh a’ phròiseas seo eadhon nas goireasaiche. Tha taic aig PVS-Studio a-nis airson toradh anailis a thionndadh gu cruth airson TeamCity - Seòrsa Sgrùdaidhean TeamCity. Chì sinn mar a tha e ag obair.

Fiosrachadh mun bhathar-bog a chaidh a chleachdadh

PVS-Studio - anailisiche statach de chòd C, C ++, C # agus Java, air a dhealbhadh gus an obair a dhèanamh gus diofar sheòrsaichean de mhearachdan a lorg agus a cheartachadh. Faodar an anailisiche a chleachdadh air Windows, Linux agus macOS. Anns an aiste seo bidh sinn gu gnìomhach a 'cleachdadh chan ann a mhàin an analyzer fhèin, ach cuideachd cuid de ghoireasan bho a sgaoileadh.

CLMonadair - na fhrithealaiche sgrùdaidh a bhios a’ cumail sùil air cur air bhog cruinneachaidh. Feumar a ruith sa bhad mus tòisich thu air do phròiseact a thogail. Ann am modh snooping, cuiridh am frithealaiche stad air ruith de gach neach-cruinneachaidh le taic. Is fhiach a bhith mothachail nach urrainnear an goireas seo a chleachdadh ach airson mion-sgrùdadh a dhèanamh air pròiseactan C / C ++.

PlogConverter - goireas airson aithisgean anailisiche a thionndadh gu diofar chruthan.

Fiosrachadh mun phròiseact fo sgrùdadh

Feuch sinn an gnìomh seo air eisimpleir practaigeach - dèanamaid sgrùdadh air a’ phròiseact OpenRCT2.

FosgailRCT2 - buileachadh fosgailte den gheama RollerCoaster Tycoon 2 (RCT2), ga leudachadh le gnìomhan ùra agus a’ càradh bhiteagan. Bidh cluiche-cluiche a’ tionndadh timcheall air togail is cumail suas pàirce spòrs anns a bheil turasan, bùthan is goireasan. Feumaidh an cluicheadair feuchainn ri prothaid a dhèanamh agus deagh chliù na pàirce a chumail fhad ‘s a chumas e aoighean toilichte. Leigidh OpenRCT2 leat cluich an dà chuid ann an suidheachadh agus bogsa gainmhich. Bidh suidheachaidhean ag iarraidh air a’ chluicheadair gnìomh sònraichte a choileanadh taobh a-staigh ùine shònraichte, fhad ‘s a tha Sandbox a’ leigeil leis a ’chluicheadair pàirc nas sùbailte a thogail gun chuingealachaidhean no ionmhas sam bith.

adjustment

Gus ùine a shàbhaladh, is dòcha gun leum mi air a’ phròiseas stàlaidh agus tòisichidh mi bhon mhionaid a bhios am frithealaiche TeamCity agam a’ ruith air a’ choimpiutair agam. Feumaidh sinn a dhol gu: localhost: {port air a shònrachadh tron ​​​​phròiseas stàlaidh} (na mo chùis, localhost: 9090) agus cuir a-steach dàta ceadachaidh. Às deidh dhuinn a dhol a-steach gheibh sinn fàilte bho:

PVS-Studio agus Amalachadh Leantainneach: TeamCity. Mion-sgrùdadh air a’ phròiseact Open RollerCoaster Tycoon 2
Cliog air a’ phutan Cruthaich Pròiseact. An uairsin, tagh le làimh agus lìon a-steach na raointean.

PVS-Studio agus Amalachadh Leantainneach: TeamCity. Mion-sgrùdadh air a’ phròiseact Open RollerCoaster Tycoon 2
An dèidh putadh air a 'phutan Cruthaich, tha uinneag le roghainnean a’ cur fàilte oirnn.

PVS-Studio agus Amalachadh Leantainneach: TeamCity. Mion-sgrùdadh air a’ phròiseact Open RollerCoaster Tycoon 2
Briogamaid Cruthaich rèiteachadh togail.

PVS-Studio agus Amalachadh Leantainneach: TeamCity. Mion-sgrùdadh air a’ phròiseact Open RollerCoaster Tycoon 2
Lìon a-steach na raointean agus cliog Cruthaich. Chì sinn uinneag ag iarraidh ort siostam smachd dreach a thaghadh. Leis gu bheil na stòran mar-thà suidhichte gu h-ionadail, cliog Air adhart.

PVS-Studio agus Amalachadh Leantainneach: TeamCity. Mion-sgrùdadh air a’ phròiseact Open RollerCoaster Tycoon 2
Mu dheireadh, gluaisidh sinn air adhart gu roghainnean a 'phròiseict.

PVS-Studio agus Amalachadh Leantainneach: TeamCity. Mion-sgrùdadh air a’ phròiseact Open RollerCoaster Tycoon 2
Nach cuir sinn ceumannan cruinneachaidh ris, gus seo a dhèanamh cliog: Tog ceumannan -> Cuir ceum togail ris.

PVS-Studio agus Amalachadh Leantainneach: TeamCity. Mion-sgrùdadh air a’ phròiseact Open RollerCoaster Tycoon 2
An seo tha sinn a 'taghadh:

  • Seòrsa ruitheadair -> Loidhne-àithne
  • Ruith -> Custom Script

Leis gun dèan sinn mion-sgrùdadh aig àm cur ri chèile pròiseict, bu chòir co-chruinneachadh agus mion-sgrùdadh a bhith mar aon cheum, mar sin lìon a-steach an raon Sgriobt gnàthach:

PVS-Studio agus Amalachadh Leantainneach: TeamCity. Mion-sgrùdadh air a’ phròiseact Open RollerCoaster Tycoon 2
Bheir sinn sùil air ceumannan fa leth nas fhaide air adhart. Tha e cudromach nach toir e ach aon loidhne deug de chòd a bhith a’ luchdachadh an anailisiche, a’ cruinneachadh a’ phròiseict, ga sgrùdadh, a’ cur a-mach na h-aithisge agus a’ cruth.

Is e an rud mu dheireadh a dh’ fheumas sinn a dhèanamh caochladairean na h-àrainneachd a shuidheachadh, a tha mi air cuid de dhòighean a mhìneachadh gus an leughadh a leasachadh. Gus seo a dhèanamh, gluaisidh sinn air adhart: Paramadairean -> Cuir paramadair ùr ris agus cuir trì caochladairean ris:

PVS-Studio agus Amalachadh Leantainneach: TeamCity. Mion-sgrùdadh air a’ phròiseact Open RollerCoaster Tycoon 2
Chan eil agad ach am putan a bhrùthadh Run anns an oisean gu h-àrd air an làimh dheis. Fhad ‘s a tha am pròiseact ga chur ri chèile agus ga sgrùdadh, innsidh mi dhut mun sgriobt.

Sgriobt gu dìreach

An toiseach, feumaidh sinn an sgaoileadh PVS-Studio as ùire a luchdachadh sìos. Airson seo bidh sinn a’ cleachdadh manaidsear pacaid Chocolatey. Dhaibhsan a tha airson barrachd fhaighinn a-mach mu dheidhinn seo, tha freagairt ann artaigil:

choco install pvs-studio -y

An uairsin, leig leinn goireas tracadh togail pròiseact CLMonitor a chuir air bhog.

%CLmon% monitor –-attach

An uairsin togaidh sinn am pròiseact mar chaochladair àrainneachd MSB an e an t-slighe chun dreach de MBuild a dh’ fheumas mi a thogail

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

Nach cuir sinn a-steach an iuchair logaidh a-steach agus cead airson PVS-Studio:

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

Às deidh an togail a bhith deiseil, ruith CLMonitor a-rithist gus faidhlichean ro-ullaichte agus mion-sgrùdadh statach a ghineadh:

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

An uairsin cleachdaidh sinn goireas eile bhon sgaoileadh againn. Bidh PlogConverter ag atharrachadh aithisg bho chruth àbhaisteach gu cruth a tha sònraichte do TeamCity. Taing dha seo, bidh e comasach dhuinn fhaicinn gu dìreach san uinneag togail.

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

Is e an ceum mu dheireadh an aithisg cruth a thaisbeanadh a-steach stdout, far am bi am parser TeamCity air a thogail.

type "C:tempptest.plog_TeamCity.txt"

Còd an sgriobt slàn:

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"

Anns an eadar-ama, tha co-chruinneachadh agus mion-sgrùdadh a ’phròiseict air a chrìochnachadh gu soirbheachail, is urrainn dhuinn a dhol chun tab pròiseactan agus ubeditsya anns an etom.

PVS-Studio agus Amalachadh Leantainneach: TeamCity. Mion-sgrùdadh air a’ phròiseact Open RollerCoaster Tycoon 2
A-nis leig dhuinn briogadh air Sgrùdaidhean Iomlanairson a dhol gu aithisg an anailisiche fhaicinn:

PVS-Studio agus Amalachadh Leantainneach: TeamCity. Mion-sgrùdadh air a’ phròiseact Open RollerCoaster Tycoon 2
Tha rabhaidhean air an cruinneachadh a rèir àireamhan riaghailt breithneachaidh. Gus seòladh tron ​​​​chòd, feumaidh tu briogadh air an àireamh loidhne leis an rabhadh. Ma bhriogas tu air a’ chomharra ceist san oisean gu h-àrd air an làimh dheis, fosglaidh tu taba ùr le sgrìobhainnean. Faodaidh tu cuideachd seòladh tron ​​​​chòd le bhith a 'briogadh air an àireamh loidhne leis an rabhadh analyzer. Tha e comasach seòladh bho choimpiutair iomallach nuair a bhios tu a’ cleachdadh SourceTreeRoot comharraiche. Faodaidh neach sam bith aig a bheil ùidh anns a 'mhodh-obrachaidh seo den anailisiche eòlas a chur air an earrann iomchaidh sgrìobhainnean.

A’ coimhead air toraidhean an anailisiche

A-nis gu bheil sinn deiseil a’ cleachdadh agus a’ rèiteachadh an togalaich, leig dhuinn sùil a thoirt air rabhaidhean inntinneach a lorgar sa phròiseact air a bheil sinn a’ coimhead.

Rabhadh N1

V773 [CWE-401] Chaidh an eisgeachd a thilgeil gun a bhith a’ leigeil a-mach am puing ‘toradh’. Tha aodion cuimhne comasach. 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;
}

Mhothaich an anailisiche mearachd às deidh dha cuimhne a chuir a-steach gu dinamach Cruthaich Rud, nuair a thachras eisgeachd, chan eil an cuimhne air a ghlanadh, agus bidh aodion cuimhne a’ tachairt.

Rabhadh N2

V501 Tha co-ionann fo-fhrithealaidhean '(1ULL << WIDX_MONTH_BOX)' air an taobh chlì agus air an taobh dheas den '|' gnìomhaiche. 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),
  ....
};

Is e glè bheag de dhaoine a bharrachd air anailisiche statach a b’ urrainn a dhol seachad air an deuchainn aire seo. Tha an eisimpleir leth-bhreac seo math airson an dearbh adhbhar seo.

Rabhaidhean N3

V703 Tha e neònach gu bheil an raon ‘bratach’ ann an clas stèidhichte ‘RCT12BannerElement’ a’ sgrìobhadh thairis air raon sa bhun-chlas ‘RCT12TileElementBase’. Loidhnichean sgrùdaidh: RCT12.h:570, RCT12.h:259. libopenrct2 RCT12.h 570

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

Gu dearbh, chan eil e an-còmhnaidh mearachd a bhith a’ cleachdadh caochladair leis an aon ainm sa chlas bhunaiteach agus san t-sliochd. Ach, tha teicneòlas oighreachd fhèin a 'gabhail ris gu bheil a h-uile raon den chlas phàrant an làthair anns a' chlas chloinne. Le bhith ag ainmeachadh raointean leis an aon ainm san oighre, bidh sinn a’ cruthachadh troimh-chèile.

Rabhadh N4

V793 Tha e neònach gu bheil toradh na h-aithris 'imageDirection/8' na phàirt den chumha. Is dòcha, bu chòir an aithris seo a bhith air a choimeas ri rudeigin eile. libopenrct2 ObservationTower.cpp 38

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

Bheir sinn sùil nas mionaidiche. Briseadh dealbh Stiùireadh/8 bidh e ceàrr ma tha dealbh-stiùiridh tha e anns an raon bho -7 gu 7. An dàrna pàirt: (imageDirection/8) !=3 seicichean dealbh-stiùiridh airson a bhith taobh a-muigh an raoin: bho -31 gu -24 agus bho 24 gu 31, fa leth. Tha e a’ coimhead car neònach dhomh àireamhan a sgrùdadh airson an toirt a-steach do raon sònraichte san dòigh seo agus, eadhon ged nach eil mearachd anns a’ phìos còd seo, bhithinn a’ moladh na cumhachan sin ath-sgrìobhadh airson a bhith nas soilleire. Dhèanadh seo beatha mòran na b’ fhasa dha na daoine a bhiodh a’ leughadh agus a’ cumail a’ chòd seo.

Rabhadh N5

V587 Sreath neònach de shònrachaidhean den t-seòrsa seo: A = B; B = A;. Loidhnichean sgrùdaidh: 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;
      ....
  }
  ....
}

Tha e coltach gun d’ fhuaireadh a’ chriomag còd seo le dì-chruinneachadh. An uairsin, a 'breithneachadh leis a' bheachd a chaidh fhàgail, chaidh pàirt den chòd neo-obrachail a thoirt air falbh. Ach, tha obair no dhà air fhàgail fhathast Id cùrsair, rud nach eil a’ dèanamh mòran ciall cuideachd.

Rabhadh N6

V1004 [CWE-476] Chaidh am puing ‘cluicheadair’ a chleachdadh gu mì-shàbhailte às deidh dha a bhith air a dhearbhadh an aghaidh nullptr. Loidhnichean sgrùdaidh: 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);                    // <=
  }
  ....
}

Tha an còd seo gu math furasta a cheartachadh; cha leig thu leas ach sgrùdadh a dhèanamh air an treas uair cluicheadair gu puing null, no cuir ri corp na h-aithris chumha. Tha mi a’ moladh an dàrna roghainn:

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] Tha an abairt ‘name == nullptr’ an-còmhnaidh meallta. 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));
    ....
  }
  ....
}

Gheibh thu cuidhteas loidhne còd a tha doirbh a leughadh ann an aon thuit swoop agus fuasgladh fhaighinn air an duilgheadas le sgrùdadh airson nullptr. Tha mi a’ moladh an còd atharrachadh mar 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] Chaidh an aon luach a thoirt don chaochladair 'ColumnHeaderPressedCurrentState'. libopenrct2ui CustomListView.cpp 510

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

Tha an còd a 'coimhead gu math neònach. Tha e coltach riumsa gun robh typo an dàrna cuid san t-suidheachadh no nuair a bha mi ag ath-shònrachadh an caochladair ColumnHeaderPressedStateCurrent ciall ceàrr.

co-dhùnadh

Mar a chì sinn, tha e gu math sìmplidh an anailisiche statach PVS-Studio a thoirt a-steach don phròiseact TeamCity agad. Gus seo a dhèanamh, tha e gu leòr dìreach aon fhaidhle rèiteachaidh beag a sgrìobhadh. Le bhith a 'sgrùdadh a' chòd leigidh sin dhut duilgheadasan a chomharrachadh dìreach às deidh co-chruinneachadh, a chuidicheas le bhith gan cur às nuair a tha iom-fhillteachd agus cosgais nan atharrachaidhean fhathast ìosal.

PVS-Studio agus Amalachadh Leantainneach: TeamCity. Mion-sgrùdadh air a’ phròiseact Open RollerCoaster Tycoon 2
Ma tha thu airson an artaigil seo a cho-roinn le luchd-èisteachd Beurla, cleachd an ceangal eadar-theangachaidh: Vladislav Stolyarov. PVS-Studio agus Amalachadh Leantainneach: TeamCity. Mion-sgrùdadh air a’ phròiseact Open RollerCoaster Tycoon 2.

Source: www.habr.com

Cuir beachd ann