PVS-Studio thiab Kev Sib Txuas Ntxiv: TeamCity. Kev tshuaj xyuas ntawm Txoj Haujlwm Qhib RollerCoaster Tycoon 2

PVS-Studio thiab Kev Sib Txuas Ntxiv: TeamCity. Kev tshuaj xyuas ntawm Txoj Haujlwm Qhib RollerCoaster Tycoon 2
Ib qho ntawm cov xwm txheej tam sim no rau kev siv PVS-Studio analyzer yog nws kev koom ua ke nrog CI systems. Thiab txawm hais tias kev tshuaj xyuas ntawm PVS-Studio qhov project los ntawm yuav luag txhua qhov kev sib koom ua ke txuas ntxiv tuaj yeem ua rau hauv ob peb cov lus txib, peb txuas ntxiv ua cov txheej txheem no yooj yim dua. PVS-Studio tam sim no muaj kev txhawb nqa rau kev hloov pauv cov zis tso tawm rau hauv ib hom ntawv rau TeamCity - TeamCity Inspections Hom. Cia peb saib seb nws ua haujlwm li cas.

Cov ntaub ntawv hais txog software siv

PVS Studio - tus ntsuas zoo li qub ntawm C, C ++, C # thiab Java code, tsim los pab txhawb txoj haujlwm ntawm kev nrhiav thiab kho ntau yam yuam kev. Lub ntsuas ntsuas tuaj yeem siv rau ntawm Windows, Linux thiab macOS. Nyob rau hauv tsab xov xwm no peb yuav nquag siv tsis tau tsuas yog lub analyzer nws tus kheej, tab sis kuj ib co kev pab cuam los ntawm nws tis.

CLMonitor - yog ib tug saib xyuas neeg rau zaub mov uas saib xyuas compiler launches. Nws yuav tsum tau khiav tam sim ua ntej pib tsim koj qhov project. Hauv hom snooping, tus neeg rau zaub mov yuav cuam tshuam kev khiav ntawm txhua qhov kev txhawb nqa compilers. Nws yog ib qho tsim nyog sau cia tias qhov khoom siv no tsuas yog siv los txheeb xyuas C / C ++ cov haujlwm.

PlogConverter - Cov khoom siv hluav taws xob hloov pauv cov ntaub ntawv txheeb xyuas rau hauv ntau hom.

Cov ntaub ntawv hais txog qhov project tab tom kawm

Cia peb sim ua qhov haujlwm no ntawm qhov piv txwv zoo - cia peb txheeb xyuas qhov project OpenRCT2.

OpenRCT2 - qhib kev siv ntawm RollerCoaster Tycoon 2 (RCT2), nthuav nws nrog cov haujlwm tshiab thiab kho cov kab. Gameplay revolves nyob ib ncig ntawm lub tsev thiab tuav ib qho kev lom zem ua si uas muaj caij, khw, thiab chaw. Tus neeg ua si yuav tsum sim ua kom tau nyiaj thiab tswj lub tiaj ua si lub koob npe nrov thaum ua kom cov qhua zoo siab. OpenRCT2 tso cai rau koj ua si hauv ob qho xwm txheej thiab sandbox. Cov xwm txheej xav kom tus neeg ua si ua tiav ib txoj haujlwm tshwj xeeb hauv lub sijhawm teem tseg, thaum Sandbox tso cai rau tus neeg ua si tsim lub tiaj ua si hloov tau yooj yim dua yam tsis muaj kev txwv lossis nyiaj txiag.

hloov

Txhawm rau txuag sijhawm, Kuv yuav zaum hla txoj kev teeb tsa thiab pib txij lub sijhawm thaum kuv muaj TeamCity server khiav hauv kuv lub computer. Peb yuav tsum tau mus rau: localhost:{chaw nres nkoj teev thaum lub sijhawm teeb tsa} (hauv kuv rooj plaub, localhost: 9090) thiab nkag mus rau cov ntaub ntawv tso cai. Tom qab nkag mus, peb yuav tau txais tos los ntawm:

PVS-Studio thiab Kev Sib Txuas Ntxiv: TeamCity. Kev tshuaj xyuas ntawm Txoj Haujlwm Qhib RollerCoaster Tycoon 2
Nyem rau ntawm pob Tsim Project. Tom ntej no, xaiv Manually thiab sau rau hauv cov teb.

PVS-Studio thiab Kev Sib Txuas Ntxiv: TeamCity. Kev tshuaj xyuas ntawm Txoj Haujlwm Qhib RollerCoaster Tycoon 2
Tom qab nias lub pob tsim, peb txais tos los ntawm lub qhov rais nrog kev teeb tsa.

PVS-Studio thiab Kev Sib Txuas Ntxiv: TeamCity. Kev tshuaj xyuas ntawm Txoj Haujlwm Qhib RollerCoaster Tycoon 2
Wb nias Tsim tsim configuration.

PVS-Studio thiab Kev Sib Txuas Ntxiv: TeamCity. Kev tshuaj xyuas ntawm Txoj Haujlwm Qhib RollerCoaster Tycoon 2
Sau rau hauv cov teb thiab nyem tsim. Peb pom ib lub qhov rais hais kom koj xaiv ib tug version tswj system. Txij li thaum cov peev txheej twb nyob hauv zos, nyem Hla.

PVS-Studio thiab Kev Sib Txuas Ntxiv: TeamCity. Kev tshuaj xyuas ntawm Txoj Haujlwm Qhib RollerCoaster Tycoon 2
Thaum kawg, peb txav mus rau qhov project nqis.

PVS-Studio thiab Kev Sib Txuas Ntxiv: TeamCity. Kev tshuaj xyuas ntawm Txoj Haujlwm Qhib RollerCoaster Tycoon 2
Cia peb ntxiv cov kauj ruam sib dhos, ua qhov nyem no: Tsim cov kauj ruam -> Ntxiv cov kauj ruam tsim.

PVS-Studio thiab Kev Sib Txuas Ntxiv: TeamCity. Kev tshuaj xyuas ntawm Txoj Haujlwm Qhib RollerCoaster Tycoon 2
Ntawm no peb xaiv:

  • Khiav hom -> Kab hais kom ua
  • Khiav -> Custom Script

Txij li thaum peb yuav ua qhov kev soj ntsuam thaum lub sijhawm ua tiav qhov project, kev sib dhos thiab kev soj ntsuam yuav tsum yog ib kauj ruam, yog li sau rau hauv daim teb Cov Tsab Ntawv Kev Cai:

PVS-Studio thiab Kev Sib Txuas Ntxiv: TeamCity. Kev tshuaj xyuas ntawm Txoj Haujlwm Qhib RollerCoaster Tycoon 2
Peb yuav saib tus kheej cov kauj ruam tom qab. Nws yog ib qho tseem ceeb uas thauj cov khoom ntsuas, sib sau ua ke qhov project, txheeb xyuas nws, tso cov ntawv tshaj tawm thiab formatting nws tsuas yog kaum ib kab ntawm cov lej.

Qhov kawg uas peb yuav tsum tau ua yog teeb tsa ib puag ncig hloov pauv, uas kuv tau piav qhia qee txoj hauv kev los txhim kho lawv cov kev nyeem ntawv. Txhawm rau ua qhov no, cia peb mus rau: Parameters -> Ntxiv qhov tshiab thiab ntxiv peb qhov sib txawv:

PVS-Studio thiab Kev Sib Txuas Ntxiv: TeamCity. Kev tshuaj xyuas ntawm Txoj Haujlwm Qhib RollerCoaster Tycoon 2
Txhua yam koj tau ua yog nias lub pob khiav nyob rau sab xis sab xis. Thaum qhov project tab tom sib sau ua ke thiab txheeb xyuas, kuv yuav qhia koj txog tsab ntawv.

Tsab ntawv ncaj qha

Ua ntej, peb yuav tsum rub tawm qhov tseeb PVS-Studio faib. Rau qhov no peb siv Chocolatey pob tus thawj tswj. Rau cov neeg uas xav paub ntau ntxiv txog qhov no, muaj qhov sib xws ib tsab xov xwm:

choco install pvs-studio -y

Tom ntej no, cia peb tso tawm CLMonitor qhov project tsim cov khoom siv taug qab.

%CLmon% monitor –-attach

Tom qab ntawd peb yuav tsim qhov project raws li ib puag ncig hloov pauv MSB yog txoj kev mus rau lub version ntawm MSBuild kuv xav tau los tsim

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

Cia peb nkag mus rau tus ID nkag mus thiab daim ntawv tso cai yuam sij rau PVS-Studio:

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

Tom qab tsim tiav, khiav CLMonitor dua los tsim cov ntaub ntawv ua ntej thiab kev tshuaj xyuas zoo li qub:

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

Tom qab ntawd peb yuav siv lwm yam khoom siv los ntawm peb qhov kev faib tawm. PlogConverter converts ib daim ntawv qhia los ntawm ib tug qauv hom mus rau ib tug TeamCity tshwj xeeb hom. Ua tsaug rau qhov no, peb yuav tuaj yeem saib nws ncaj qha rau hauv lub qhov rais tsim.

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

Cov kauj ruam kawg yog los tso saib daim ntawv qhia formatted hauv stdout, qhov twg nws yuav raug khaws los ntawm TeamCity parser.

type "C:tempptest.plog_TeamCity.txt"

Cov ntawv sau tag nrho:

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"

Lub sijhawm no, kev sib dhos thiab kev tshuaj xyuas ntawm qhov project tau ua tiav tiav, peb tuaj yeem mus rau lub tab tej yaam num thiab ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ Π² этом.

PVS-Studio thiab Kev Sib Txuas Ntxiv: TeamCity. Kev tshuaj xyuas ntawm Txoj Haujlwm Qhib RollerCoaster Tycoon 2
Tam sim no cia peb nyem rau ntawm Kev tshuaj xyuas tag nrhomus saib daim ntawv qhia analyzer:

PVS-Studio thiab Kev Sib Txuas Ntxiv: TeamCity. Kev tshuaj xyuas ntawm Txoj Haujlwm Qhib RollerCoaster Tycoon 2
Cov lus ceeb toom tau muab ua pawg los ntawm cov lej ntsuas kev ntsuas. Txhawm rau taug qab cov lej, koj yuav tsum nyem rau ntawm kab xov tooj nrog cov lus ceeb toom. Nyem rau ntawm lo lus nug cim nyob rau sab xis sab xis yuav qhib koj lub tab tshiab nrog cov ntaub ntawv. Koj tuaj yeem taug kev los ntawm txoj cai los ntawm txhaj rau ntawm kab xov tooj nrog cov lus ceeb toom ntsuas. Kev taw qhia los ntawm lub computer tej thaj chaw deb yog ua tau thaum siv SourceTreeRoot tus cim. Txhua tus neeg uas txaus siab rau hom kev ua haujlwm ntawm lub ntsuas ntsuas no tuaj yeem paub txog lawv tus kheej nrog rau qhov sib thooj cov ntaub ntawv.

Saib cov ntsuas ntsuas

Tam sim no uas peb tau ua tiav kev xa tawm thiab teeb tsa kev tsim, cia peb saib qee cov lus ceeb toom nthuav dav pom hauv qhov project peb tab tom saib.

Ceeb toom N1

V773 [CWE-401] Qhov kev zam raug muab pov tseg yam tsis tso tawm 'qhov tshwm sim' tus taw tes. Kev nco tuaj yeem ua tau. 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;
}

Tus kws tshuaj ntsuam pom qhov yuam kev uas tom qab dynamically faib kev nco hauv CreateObject, thaum muaj kev zam tshwm sim, lub cim xeeb tsis raug tshem tawm, thiab lub cim xeeb xau tshwm sim.

Ceeb toom N2

V501 Muaj cov kab lus zoo sib xws '(1ULL << WIDX_MONTH_BOX)' rau sab laug thiab sab xis ntawm '|' tus neeg ua haujlwm. 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),
  ....
};

Ob peb tus neeg uas tsis yog tus kws tshuaj ntsuam xyuas zoo li qub tuaj yeem xeem dhau qhov kev ntsuam xyuas saib xyuas. Qhov piv txwv luam-paste no yog qhov zoo rau qhov tseeb vim li no.

Ceeb toom N3

V703 Nws yog qhov khib tias 'flags' teb nyob rau hauv derived chav kawm 'RCT12BannerElement' overwrites teb nyob rau hauv lub hauv paus chav kawm 'RCT12TileElementBase'. Kos kab: RCT12.h:570, RCT12.h:259. libopenrct2 RCT12.h 570

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

Tau kawg, siv qhov sib txawv nrog tib lub npe hauv chav kawm hauv paus thiab hauv cov xeeb leej xeeb ntxwv tsis yog ib qho yuam kev. Txawm li cas los xij, thev naus laus zis qub txeeg qub teg nws tus kheej xav tias txhua qhov chaw ntawm cov niam txiv hauv chav kawm muaj nyob hauv cov menyuam kawm ntawv. Los ntawm kev tshaj tawm cov teb nrog tib lub npe hauv cov qub txeeg qub teg, peb qhia tsis meej pem.

Ceeb toom N4

V793 Nws yog khib tias qhov tshwm sim ntawm 'imageDirection / 8' nqe lus yog ib feem ntawm qhov xwm txheej. Tej zaum, cov lus no yuav tsum tau muab piv nrog lwm yam. libopenrct2 ObservationTower.cpp 38

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

Cia wb mus saib ntxiv. Kev nthuav qhia ImageDirection/8 yuav cuav yog tias duabDirection yog nyob rau hauv qhov ntau ntawm -7 mus rau 7. Qhov thib ob: (imageDirection / 8) != 3 kuaj duabDirection rau sab nraum qhov ntau: los ntawm -31 txog -24 thiab los ntawm 24 mus rau 31, feem. Nws zoo nkaus li coj txawv txawv rau kuv txhawm rau txheeb xyuas cov lej rau kev suav nrog qee yam hauv txoj kev no thiab, txawm tias tsis muaj qhov yuam kev hauv daim ntawv no, kuv xav kom rov sau cov xwm txheej no kom meej meej. Qhov no yuav ua rau lub neej yooj yim dua rau cov neeg uas yuav nyeem thiab tuav txoj cai no.

Ceeb toom N5

V587 Ib qho txawv ntawm kev ua haujlwm ntawm hom no: A = B; IB = A;. Kos kab: 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;
      ....
  }
  ....
}

Cov kab lus no feem ntau yuav tau txais los ntawm decompilation. Tom qab ntawd, txiav txim los ntawm cov lus sab laug, ib feem ntawm cov cai tsis ua haujlwm raug tshem tawm. Txawm li cas los xij, tseem muaj ob peb txoj haujlwm tseem tshuav cursorId, uas kuj tsis muaj kev nkag siab ntau.

Ceeb toom N6

V1004 [CWE-476] Tus 'player' pointer tau siv tsis muaj kev nyab xeeb tom qab nws raug txheeb xyuas tawm tsam nullptr. Kos kab: 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);                    // <=
  }
  ....
}

Cov cai no yooj yim heev los kho; koj tsuas yog yuav tsum tau kuaj nws thib peb neeg uas ua ntawv mus rau ib tug null pointer, los yog ntxiv rau lub cev ntawm cov nqe lus conditional. Kuv xav qhia qhov kev xaiv thib ob:

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

Ceeb toom N7

V547 [CWE-570] Kev nthuav qhia 'lub npe == nullptr' yog ib txwm tsis tseeb. 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));
    ....
  }
  ....
}

Koj tuaj yeem tshem tawm ntawm txoj kab nyuaj-rau-nyeem ntawv ntawm cov lej hauv ib qho poob thiab daws qhov teeb meem nrog kev kuaj xyuas nullptr. Kuv xav kom hloov cov cai raws li hauv qab no:

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

Ceeb toom N8

V1048 [CWE-1164] Qhov sib txawv 'ColumnHeaderPressedCurrentState' tau muab tus nqi tib yam. libopenrct2ui CustomListView.cpp 510

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

Cov cai zoo li coj txawv txawv. Nws zoo nkaus li kuv tias muaj ib qho typo nyob rau hauv qhov xwm txheej lossis thaum rov muab qhov sib txawv ColumnHeaderPressedCurrentState qhov tseem ceeb cuav.

xaus

Raws li peb tuaj yeem pom, kev sib koom ua ke PVS-Studio static analyzer rau hauv koj qhov haujlwm TeamCity yog qhov yooj yim heev. Txhawm rau ua qhov no, nws txaus los sau ib daim ntawv me me xwb. Kev tshuaj xyuas cov cai yuav tso cai rau koj txheeb xyuas cov teeb meem tam sim ntawd tom qab kev sib dhos, uas yuav pab tshem tawm lawv thaum qhov nyuaj thiab cov nqi hloov pauv tseem tsawg.

PVS-Studio thiab Kev Sib Txuas Ntxiv: TeamCity. Kev tshuaj xyuas ntawm Txoj Haujlwm Qhib RollerCoaster Tycoon 2
Yog tias koj xav qhia cov kab lus no nrog cov neeg hais lus Askiv, thov siv qhov txuas txhais lus: Vladislav Stolyarov. PVS-Studio thiab Kev Sib Txuas Ntxiv: TeamCity. Kev tshuaj xyuas ntawm Txoj Haujlwm Qhib RollerCoaster Tycoon 2.

Tau qhov twg los: www.hab.com

Ntxiv ib saib