PVS-Studio sy Fampidirana mitohy: TeamCity. Famakafakana ny tetikasa Open RollerCoaster Tycoon 2

PVS-Studio sy Fampidirana mitohy: TeamCity. Famakafakana ny tetikasa Open RollerCoaster Tycoon 2
Ny iray amin'ireo toe-javatra ankehitriny indrindra amin'ny fampiasana ny PVS-Studio analyzer dia ny fampidirana azy amin'ny rafitra CI. Ary na dia azo amboarina amin'ny baiko vitsivitsy monja aza ny famakafakana ny tetikasa PVS-Studio avy amin'ny rafitra fampidirana mitohy rehetra, dia manohy manao izany fomba izany ho mora kokoa izahay. PVS-Studio izao dia manana fanohanana amin'ny famadihana ny vokatra analyse ho endrika ho an'ny TeamCity - TeamCity Inspections Type. Andeha hojerentsika ny fomba fiasa.

Fampahafantarana momba ny rindrambaiko ampiasaina

PVS Studio β€” mpanadihady static amin'ny C, C ++, C# ary Java code, natao hanamora ny asa fitadiavana sy fanitsiana ireo karazana lesoka. Ny mpandinika dia azo ampiasaina amin'ny Windows, Linux ary macOS. Ato amin'ity lahatsoratra ity isika dia hampiasa mavitrika tsy ny analyzer ihany, fa koa ny fitaovana sasany avy amin'ny fizarana.

CLMonitor β€” dia mpizara mpanara-maso izay manara-maso ny fandefasana compiler. Tsy maintsy mandeha avy hatrany izy io alohan'ny hanombohan'ny fananganana ny tetikasanao. Amin'ny fomba fanaraha-maso, ny mpizara dia hisakana ny fandehan'ny compiler tohanana rehetra. Tsara ny manamarika fa ity fitaovana ity dia tsy azo ampiasaina handinihana ny tetikasa C/C++ ihany.

PlogConverter - fitaovana ahafahana mamadika ny tatitra analyse ho endrika samihafa.

Fampahafantarana momba ny tetikasa ianarana

Andao andramana ity fampiasa ity amin'ny ohatra azo ampiharina - andao hamakafaka ny tetikasa OpenRCT2.

OpenRCT2 - fampiharana misokatra amin'ny lalao RollerCoaster Tycoon 2 (RCT2), manitatra azy amin'ny fiasa vaovao sy fanamboarana ny bibikely. Ny lalao dia mihodina manodidina ny fananganana sy fikojakojana zaridaina fialamboly misy fiara, fivarotana ary trano. Ny mpilalao dia tsy maintsy miezaka mahazo tombony sy mitazona ny lazan'ny valan-javaboary ary mitazona ny vahiny ho faly. OpenRCT2 dia ahafahanao milalao amin'ny scenario sy sandbox. Ny scenario dia mitaky ny mpilalao hamita asa manokana ao anatin'ny fotoana voatondro, raha toa kosa ny Sandbox dia mamela ny mpilalao hanangana zaridaina mora kokoa tsy misy fameperana na ara-bola.

fanitsiana

Mba hitsitsiana fotoana dia mety handalo ny fizotran'ny fametrahana aho ary manomboka amin'ny fotoana ananako ny mpizara TeamCity mandeha amin'ny solosainako. Mila mandeha any amin'ny: localhost:{serana voatondro nandritra ny dingana fametrahana} (raha ny ahy, localhost:9090) ary ampidiro ny angon-drakitra fahazoan-dΓ lana. Aorian'ny fidirana dia hiarahaba antsika:

PVS-Studio sy Fampidirana mitohy: TeamCity. Famakafakana ny tetikasa Open RollerCoaster Tycoon 2
Tsindrio ny bokotra Create Project. Manaraka, mifidiana Manually ary fenoy ny saha.

PVS-Studio sy Fampidirana mitohy: TeamCity. Famakafakana ny tetikasa Open RollerCoaster Tycoon 2
Rehefa avy nanindry ny bokotra mamorona, miarahaba antsika amin'ny varavarankely misy filaharana.

PVS-Studio sy Fampidirana mitohy: TeamCity. Famakafakana ny tetikasa Open RollerCoaster Tycoon 2
Aleo tsindrio Mamorona fanamboarana fananganana.

PVS-Studio sy Fampidirana mitohy: TeamCity. Famakafakana ny tetikasa Open RollerCoaster Tycoon 2
Fenoy ny saha dia tsindrio mamorona. Mahita varavarankely mangataka anao hisafidy rafitra fanaraha-maso dikan-teny izahay. Satria efa hita eo an-toerana ny loharano, tsindrio Skip.

PVS-Studio sy Fampidirana mitohy: TeamCity. Famakafakana ny tetikasa Open RollerCoaster Tycoon 2
Farany, mandroso mankany amin'ny firafitry ny tetikasa isika.

PVS-Studio sy Fampidirana mitohy: TeamCity. Famakafakana ny tetikasa Open RollerCoaster Tycoon 2
Andeha isika hanampy dingana fivoriambe, hanaovana ity tsindrio ity: Dingana fananganana -> Ampio dingana fananganana.

PVS-Studio sy Fampidirana mitohy: TeamCity. Famakafakana ny tetikasa Open RollerCoaster Tycoon 2
Eto isika misafidy:

  • Karazana mpihazakazaka -> Command Line
  • Run -> Custom Script

Koa satria hanao famakafakana isika mandritra ny fanangonana tetikasa, ny fivoriambe sy ny fanadihadiana dia tokony ho dingana iray, ka fenoy ny saha Custom Script:

PVS-Studio sy Fampidirana mitohy: TeamCity. Famakafakana ny tetikasa Open RollerCoaster Tycoon 2
Hojerentsika ny dingana tsirairay avy. Zava-dehibe ny famenoana ny mpandinika, ny fanangonana ny tetikasa, ny famakafakana azy, ny famoahana ny tatitra ary ny fandrafetana azy dia tsy misy afa-tsy andalana iraika ambin'ny folo.

Ny zavatra farany tokony hataontsika dia ny mametraka ny fari-piainan'ny tontolo iainana, izay nosoratako ny fomba sasany hanatsarana ny fahaiza-mamaky azy ireo. Mba hanaovana izany, andao hiroso amin'ny: Parameter -> Manampia paramètre vaovao ary ampio variables telo:

PVS-Studio sy Fampidirana mitohy: TeamCity. Famakafakana ny tetikasa Open RollerCoaster Tycoon 2
Ny hany ataonao dia ny manindry ny bokotra Run eo amin'ny zoro ambony havanana. Raha angonina sy anadihadiana ny tetikasa dia holazaiko aminao ny momba ny script.

script mivantana

Voalohany, mila misintona ny fizarana PVS-Studio farany isika. Amin'izany dia mampiasa ny mpitantana fonosana Chocolatey izahay. Ho an'ireo izay te-hahafantatra bebe kokoa momba izany dia misy ny mifanandrify aminy lahatsoratra:

choco install pvs-studio -y

Manaraka, andao hanomboka ny tetikasa CLMonitor manorina fitaovana fanaraha-maso.

%CLmon% monitor –-attach

Avy eo dia hanangana ny tetikasa ho toy ny fiovan'ny tontolo iainana MSB dia ny lalana mankany amin'ny version of MSBuild izay ilaiko amboarina

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

Andao hiditra ny fidirana sy ny fanalahidin'ny fahazoan-dΓ lana ho an'ny PVS-Studio:

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

Rehefa vita ny fananganana dia avereno indray ny CLMonitor hamorona rakitra efa voaomana sy famakafakana static:

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

Avy eo dia hampiasa fitaovana hafa avy amin'ny fizaranay izahay. PlogConverter dia mamadika tatitra avy amin'ny endrika mahazatra ho endrika manokana TeamCity. Noho izany dia ho afaka hijery azy mivantana amin'ny varavarankely fananganana isika.

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

Ny dingana farany dia ny fampisehoana ny tatitra voalamina ao stdout, izay horaisin'ny mpizara TeamCity.

type "C:tempptest.plog_TeamCity.txt"

Kaody script feno:

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"

Mandritra izany fotoana izany dia vita soa aman-tsara ny fivoriambe sy ny famakafakana ny tetikasa, afaka mandeha any amin'ny tabilao isika Projects ary ataovy azo antoka izany.

PVS-Studio sy Fampidirana mitohy: TeamCity. Famakafakana ny tetikasa Open RollerCoaster Tycoon 2
Andeha isika tsindrio eo Fanaraha-maso Totalhandeha hijery ny tatitra analyzer:

PVS-Studio sy Fampidirana mitohy: TeamCity. Famakafakana ny tetikasa Open RollerCoaster Tycoon 2
Ny fampitandremana dia navondrona araka ny laharan'ny fitsipika momba ny diagnostika. Raha te hivezivezy amin'ny kaody ianao dia mila manindry ny laharan'ny tsipika miaraka amin'ny fampitandremana. Ny fipihana ny marika fanontaniana eo amin'ny zoro ambony havanana dia hanokatra tabilao vaovao misy antontan-taratasy ho anao. Azonao atao ihany koa ny mivezivezy amin'ny kaody amin'ny fipihana ny laharan'ny tsipika miaraka amin'ny fampitandremana analyzer. Ny fitetezana avy amin'ny solosaina lavitra dia azo atao rehefa mampiasa SourceTreeRoot marika. Na iza na iza liana amin'ity fomba fiasan'ny mpandinika ity dia afaka mahafantatra ny fizarana mifandraika amin'izany tahirin-kevitra.

Mijery ny valin'ny mpandinika

Ankehitriny rehefa vita ny fametrahana sy ny fanamboarana ny fananganana, andeha hojerentsika ireo fampitandremana mahaliana hita ao amin'ny tetikasa izay hojerentsika.

Fampitandremana N1

V773 [CWE-401] Natsipy tsy namoaka ny tondro 'vokatra' ny fanavahana. Mety hisy ny fitadidiana leak. 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;
}

Ny analyse dia nahatsikaritra lesoka izay taorian'ny nametrahana ny fitadidiana amin'ny fomba mavitrika CreateObject, rehefa misy maningana, dia tsy voafafa ny fitadidiana, ary misy fitadidiana mipoitra.

Fampitandremana N2

V501 Misy zana-teny mitovy '(1ULL << WIDX_MONTH_BOX)' eo ankavia sy eo ankavanan'ny '|' mpandraharaha. 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),
  ....
};

Vitsy ny olona afa-tsy ny mpanadihady static no afaka nandalo an'io fitsapana fitandremana io. Ity ohatra kopia-mametaka ity dia tsara noho io antony io indrindra.

Fampitandremana N3

V703 Mahagaga fa ny saha 'faneva' ao amin'ny kilasy avy amin'ny 'RCT12BannerElement' dia mandika ny saha ao amin'ny kilasy fototra 'RCT12TileElementBase'. Jereo ny tsipika: RCT12.h:570, RCT12.h:259. libopenrct2 RCT12.h 570

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

Mazava ho azy fa tsy fahadisoana foana ny fampiasana fari-piainana mitovy anarana amin'ny kilasy fototra sy amin'ny taranaka. Na izany aza, ny teknΓ΄lΓ΄jian'ny lova dia mihevitra fa ny sehatra rehetra amin'ny kilasin'ny ray aman-dreny dia misy ao amin'ny kilasin'ny ankizy. Amin'ny fanambarana saha misy anarana mitovy amin'ny mpandova dia miteraka fisafotofotoana izahay.

Fampitandremana N4

V793 Mahagaga fa ny vokatry ny fanambarana 'imageDirection / 8' dia ampahany amin'ny fepetra. Angamba, io fanambarana io dia tokony ho nampitahaina tamin'ny zavatra hafa. libopenrct2 ObservationTower.cpp 38

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

Andeha hojerentsika akaiky. maneho Hevitra saryDirection/8 ho diso raha imageDirection eo amin'ny -7 ka hatramin'ny 7. Fizarana faharoa: (saryDirection / 8) != 3 taratasim-bola imageDirection ho any ivelan'ny faritra: manomboka amin'ny -31 ka hatramin'ny -24 ary avy amin'ny 24 ka hatramin'ny 31. Toa hafahafa amiko ny manamarina ny isa ho fampidirana amin'ny sehatra iray amin'ity fomba ity ary, na dia tsy misy hadisoana aza amin'ity fehezan-dalΓ na ity, dia manoro hevitra aho ny hanoratra indray ireo fepetra ireo mba ho mazava kokoa. Izany dia hanamora kokoa ny fiainana ho an'ireo izay mamaky sy mitazona ity code ity.

Fampitandremana N5

V587 Filaharana hafahafa amin'ny asa toy izao: A = B; B = A;. Jereo ny tsipika: 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;
      ....
  }
  ....
}

Ity sombin-kaody ity dia azo inoana fa azo tamin'ny famongorana. Avy eo, raha jerena ny fanehoan-kevitra navela dia nesorina ny ampahany amin'ny code tsy miasa. Na izany aza, mbola misy hetsika roa tavela cursorId, izay tsy dia misy dikany loatra koa.

Fampitandremana N6

V1004 [CWE-476] Nampiasaina tsy azo antoka ny tondro 'mpilalao' rehefa voamarina tamin'ny nullptr. Jereo ny tsipika: 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);                    // <=
  }
  ....
}

Mora ny manitsy ity kaody ity; mila manamarina azy fanintelony fotsiny ianao mpilalao amin'ny tondro tsy misy dikany, na ampio amin'ny vatan'ny fanambarana misy fepetra. Manoro ny safidy faharoa aho:

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

Fampitandremana N7

V547 [CWE-570] Diso foana ny teny hoe '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));
    ....
  }
  ....
}

Azonao atao ny manala ny kaody sarotra vakiana amin'ny fotoana iray ary mamaha ny olana amin'ny fanamarinana nullptr. Manoro hevitra aho hanova ny kaody toy izao:

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

Fampitandremana N8

V1048 [CWE-1164] Ny variable 'ColumnHeaderPressedCurrentState' dia nomena sanda mitovy. libopenrct2ui CustomListView.cpp 510

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

Toa hafahafa ny kaody. Amiko dia nisy typo na teo amin'ny toe-javatra na tamin'ny fotoana namerenana ny fari-piainana ColumnHeaderPressedCurrentState hevitra diso.

famaranana

Araka ny hitantsika, ny fampidirana ny PVS-Studio static analyzer amin'ny tetikasa TeamCity dia tsotra. Mba hanaovana izany dia ampy ny manoratra rakitra fanamafisana kely fotsiny. Ny fanamarinana ny kaody dia ahafahanao mamantatra ny olana avy hatrany aorian'ny fivoriambe, izay hanampy amin'ny fanafoanana azy ireo raha mbola ambany ny fahasarotana sy ny vidin'ny fanovana.

PVS-Studio sy Fampidirana mitohy: TeamCity. Famakafakana ny tetikasa Open RollerCoaster Tycoon 2
Raha te hizara ity lahatsoratra ity amin'ny mpihaino miteny anglisy ianao dia ampiasao ny rohy fandikana: Vladislav Stolyarov. PVS-Studio sy Fampidirana mitohy: TeamCity. Famakafakana ny tetikasa Open RollerCoaster Tycoon 2.

Source: www.habr.com

Add a comment