PVS-Studia et Continua Integratio: TeamCity. Analysis Open RollerCoaster Tycoon 2 project

PVS-Studia et Continua Integratio: TeamCity. Analysis Open RollerCoaster Tycoon 2 project
Una ex probatissimis missionibus in usu PVS-Studii analysris est eius integratio cum systematis CI. Et licet analysis PVS-Studii propositi ex quavis fere continua integratione systematis in paucis tantum praeceptis edificari possit, pergimus ad hunc processum etiam commodiorem reddere. PVS-Studium nunc habet subsidium convertendi analysris output in forma pro TeamCity - TeamCity Inspectionum Type. Videamus quomodo operatur.

Information about the software used

PVS Studio, - stabilis analysris C, C++, C# et Javae Codicis, ad faciliorem munus inveniendi et corrigendi varias errores disponebat. Analysris in Windows, Linux et macOS adhiberi potest. In hoc articulo non solum ipsum analystorem, sed etiam aliquas utilitates ex eius distributione active utemur.

CLMonitor - Servator vigilantis est qui monitores compilator immittit. Immediate currere debet antequam ad propositum tuum aedificandum. In adipiscing leo in modum, server intercipiet fugit omnium compilariorum sustentatorum. Notatu dignum est hanc utilitatem nonnisi ad C/C++ incepta resolvere adhiberi posse.

PlogConverter - utilitas ad relationes analyser convertendi in diversas formas.

Information about the project under study

Conemur hanc functionem in exemplo practico - in explicatione openRCT2 ineamus.

OpenRCT2 - aperta exsecutio ludi RollerCoaster Tycoon 2 (RCT2), eam expandens novis muneribus et cimices figens. Ludus volvitur circa aedificium et conservans oblectamentum parcum continens equitationes, tabernas et facultates. Lusor conetur lucrum facere et bonam famam parcum conservare dum convivae felices servant. OpenRCT2 sinit te ludere in utroque missione et sandbox. Scenarios scaenicos requirit ut munus specificum intra tempus statutum perficiat, dum Sandbox ludio ludius permittit ut parcum flexibile sine ullis restrictionibus vel oeconomicis aedificet.

tionibus

Ut tempus conserves, probabiliter processum institutionis omittitur et ab momento incipiam cum TeamCity server currentem in computatrum meum habebo. Necesse est nos ire ad: localhost: {portum specificatorum per processum institutionem} (me in casu, localhost:9090) et data licentia inire. Post introitum salutati erimus;

PVS-Studia et Continua Integratio: TeamCity. Analysis Open RollerCoaster Tycoon 2 project
Click in deprimendo crea Project. Deinde, elige Manually et agris imple.

PVS-Studia et Continua Integratio: TeamCity. Analysis Open RollerCoaster Tycoon 2 project
Post premere puga Createsalutamur per fenestram uncinis.

PVS-Studia et Continua Integratio: TeamCity. Analysis Open RollerCoaster Tycoon 2 project
Sit scriptor click Configuratione crea constructum.

PVS-Studia et Continua Integratio: TeamCity. Analysis Open RollerCoaster Tycoon 2 project
Imple in agris et click Create. Videmus fenestram quaerentem te ut versionis systematis imperium deligeres. Cum fontes iam localiter siti sunt, preme Skip.

PVS-Studia et Continua Integratio: TeamCity. Analysis Open RollerCoaster Tycoon 2 project
Denique ad propositum proficiscamur occasus.

PVS-Studia et Continua Integratio: TeamCity. Analysis Open RollerCoaster Tycoon 2 project
Gradus addamus coetui, ut hoc cliccum feceris: Aedificare gradus -> addere gradum constructum.

PVS-Studia et Continua Integratio: TeamCity. Analysis Open RollerCoaster Tycoon 2 project
Hic eligimus:

  • Cursor type -> Imperii Versus
  • Run -> Custom Script

Cum analysin in compilatione project, conventus et analysis unus sit gradus, sic imple in campo Scriptor Custom:

PVS-Studia et Continua Integratio: TeamCity. Analysis Open RollerCoaster Tycoon 2 project
Singula vestigia postea videbimus. Aliquam sit amet quam analysrem onerantem, consilium congregans, analysing, relatum et formatting quod tantum undecim lineas codicis capit.

Extremum illud, quod faciendum est, variabiles ambitus constituitur, quas aliquos modos delineavi ad eorum promptitudinem emendandam. Ad hoc pergamus; Parametri -> addere novam parametri et tres variabiles adde:

PVS-Studia et Continua Integratio: TeamCity. Analysis Open RollerCoaster Tycoon 2 project
Omnes facere vos have ut premere puga Curre in angulo dextro. Dum consilium convenitur et resolvitur, de scripto dicam.

directe scriptum

Primum, necesse est ut novissimam PVS-Studii distributionem accipiamus. Hac utimur in sarcina Chocolatey procurator. Qui enim plura de hoc scire volunt, ibi respondet articulus:

choco install pvs-studio -y

Deinceps in CLMonitor project utilitates persequendas deducamus.

%CLmon% monitor –-attach

Tunc aedificabimus project in environment variabilis Mas est iter ad versionem MSBuild opus facere

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

Ingrediamur login et licentia clavem pro PVS-Studio:

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

Postquam constructum completum est, CLMonitor iterum currite ad fasciculos praeprocessionales et analysin staticos generandos;

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

Deinde alia utilitate ex nostra distributione utemur. PlogConverter relationem a forma vexillum ad formam TeamCity-specificam convertit. Propter hoc, eam directe in fenestra aedificare poterimus.

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

Ultimus gradus est referre quae formatae sint in stdoutubi a parser TeamCity delecta erit.

type "C:tempptest.plog_TeamCity.txt"

Scriptum codice plena:

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"

Interim consilio et analysis rei feliciter peractae ad tab projects et fac ex eo.

PVS-Studia et Continua Integratio: TeamCity. Analysis Open RollerCoaster Tycoon 2 project
Nunc lets click in Summa inspectionesire inspicere analyser fama:

PVS-Studia et Continua Integratio: TeamCity. Analysis Open RollerCoaster Tycoon 2 project
Monitiones numerorum regulae diagnosticae glomerantur. Per codicem navigare, debes strepere in linea numerorum monitu. Clicking in signum interrogationis in angulo dextro dextro tibi novam tab cum documentis aperiet. Navigare etiam potes per codicem strepitando in linea numero cum analysi admonitione. Navigation a remotis computatrum potest cum usura SourceTreeRoot titulum. Omnis qui hunc modum operationis analystoris quaerit, se cum sectione respondente consuescere potest documentum.

Videre analyser scriptor eventus

Nunc quod fabricamus instruimus et configuramus, inspice aliquas interesting admonitiones quae in proposito inspicimus.

Monitum N1

V773 Exceptio coniecta est sine dimissione monstratorem. A memoria effluo potest. libopenrct401 ObjectFactory.cpp 2

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

Animadvertit analyser errorem quod post memoriam in dynamically collocans CreateObjectcum exceptio fit, non purgatur memoria, et fit memoria perpluo.

Monitum N2

V501 Sunt identicae sub-dictiones' (1ULL << WIDX_MONTH_BOX) ad sinistram et ad dextram '|' operator. 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),
  ....
};

Pauci homines praeter static analysrem hanc diligentiam experiendi possent transire. Hoc exemplum crustulum bonum hac ratione caret.

Admonitiones N3

V703 Impar est quod "vexae" in genere derivato "RCT12BannerElement" inscribit campum in basi classi "RCT12TileElementBase". Perscriptio lineas: RCT12.h:570, RCT12.h:259. libopenrct2 RCT12.h 570

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

Utique variabilis cum eodem nomine in basi classe et abneptis non semper est error. Attamen ipsa technica hereditas ponit omnes agros ordinis parentis in infantis genere adesse. Agros eodem nomine in heredem declarando confusionem facimus.

Monitum N4

V793 Impar est quod effectus "imageDirection/8" est pars conditionis. Fortasse haec sententia cum alio comparari debuit. libopenrct2 ObservationTower.cpp 38

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

Propius inspiciamus. Expressio imageDirection/8 erit falsum, si imageDirection est in latitudine ab -7 ad 7. Secundae; (imageDirection / 8) != 3 checks imageDirection extra ordinem esse: a -31 ad -24 et a 24 ad 31 respective. Mihi admodum mirum videtur numeros pro inclusione quodam modo hoc modo cohibere et, etiamsi error in hoc codice non sit, has condiciones explicandas magis rescribendas commendem. Hoc multo facilius vitam faceret hominibus qui hunc codicem legerent et conservarent.

Monitum N5

V587 Impar ordo assignationum huiusmodi: A = B; B = A;. Perscriptio lines: 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;
      ....
  }
  ....
}

Hoc fragmentum codicis verisimillimum est per compilationem. Deinde, relicta commento diiudicando, pars codicis non operantis sublata est. Sed adhuc duae operationes supersunt cursorIdquod etiam non multum sensum faciunt.

Monitum N6

V1004 [CWE-476] Monstrator lusori usus est securus postquam contra nullptr comprobatum est. Perscriptio lines: 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);                    // <=
  }
  ....
}

Ex hoc codice satis facile est ad emendandum: vos iustus tertio tempore reprehendo ludius nulli monstratori, vel conditionali corpori add. Secundam optionem suggero;

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

Monitum N7

V547 [CWE-570] elocutio 'nomen= nullptr' semper falsum est. 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));
    ....
  }
  ....
}

Potes depellere durum-ad-read lineam codicis in uno lapsu decidit et problema solvendi pro reprimendo nullptr. Mutanda in codice hoc suadeant sic:

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

Monitum N8

V1048 [CWE-1164] The 'ColumnHeaderPressedCurrentState' variabilis eiusdem valoris assignata est. libopenrct2ui CustomListView.cpp 510

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

Codicem satis mirum viderit. Mihi videtur typo vel in conditione vel cum re- variabili assignando ColumnHeaderPressedCurrentState idest falsum,.

conclusio,

Ut perspicimus, integrationem PVS-Studii static analysris in TeamCity vestram project admodum simplex est. Ad hoc faciendum, satis est unum fasciculum parvam configurationem scribere. Reperiens codicem sinet te cognoscere problemata statim post conventum, quae adiuvabit eas tollere, cum multiplicitas et sumptus mutationum adhuc iacent.

PVS-Studia et Continua Integratio: TeamCity. Analysis Open RollerCoaster Tycoon 2 project
Si hunc articulum communicare cum auditorio Anglico loquentem vis, sis utere nexus translationis: Vladislav Stolyarov. PVS-Studia et Continua Integratio: TeamCity. Analysis Open RollerCoaster Tycoon 2 project.

Source: www.habr.com

Add a comment