рдкреАрд╡реНрд╣реАрдПрд╕-рд╕реНрдЯреБрдбрд┐рдУ рдЖрдгрд┐ рд╕рддрдд рдПрдХрддреНрд░реАрдХрд░рдг: рдЯреАрдорд╕рд┐рдЯреА. рдУрдкрди рд░реЛрд▓рд░рдХреЛрд╕реНрдЯрд░ рдЯрд╛рдпрдХреВрди 2 рдкреНрд░рдХрд▓реНрдкрд╛рдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг

рдкреАрд╡реНрд╣реАрдПрд╕-рд╕реНрдЯреБрдбрд┐рдУ рдЖрдгрд┐ рд╕рддрдд рдПрдХрддреНрд░реАрдХрд░рдг: рдЯреАрдорд╕рд┐рдЯреА. рдУрдкрди рд░реЛрд▓рд░рдХреЛрд╕реНрдЯрд░ рдЯрд╛рдпрдХреВрди 2 рдкреНрд░рдХрд▓реНрдкрд╛рдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг
рдкреАрд╡реНрд╣реАрдПрд╕-рд╕реНрдЯреБрдбрд┐рдУ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рд╡рд╛рдкрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╕рд░реНрд╡рд╛рдд рд╡рд░реНрддрдорд╛рди рдкрд░рд┐рд╕реНрдерд┐рддреАрдВрдкреИрдХреА рдПрдХ рдореНрд╣рдгрдЬреЗ рддреНрдпрд╛рдЪреЗ рд╕реАрдЖрдп рд╕рд┐рд╕реНрдЯрдорд╕рд╣ рдПрдХрддреНрд░реАрдХрд░рдг. рдЖрдгрд┐ рдЬрд░реА PVS-рд╕реНрдЯреБрдбрд┐рдУ рдкреНрд░рдХрд▓реНрдкрд╛рдЪреЗ рдЬрд╡рд│рдЬрд╡рд│ рдХреЛрдгрддреНрдпрд╛рд╣реА рд╕рддрдд рдПрдХреАрдХрд░рдг рдкреНрд░рдгрд╛рд▓реАрдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдлрдХреНрдд рдХрд╛рд╣реА рдХрдорд╛рдВрдбреНрд╕рдордзреНрдпреЗ рддрдпрд╛рд░ рдХреЗрд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ, рддрд░реАрд╣реА рдЖрдореНрд╣реА рд╣реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЖрдгрдЦреА рд╕реЛрдпреАрд╕реНрдХрд░ рдмрдирд╡рдгреЗ рд╕реБрд░реВ рдареЗрд╡рддреЛ. рдкреАрд╡реНрд╣реАрдПрд╕-рд╕реНрдЯреБрдбрд┐рдУрд▓рд╛ рдЖрддрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдЖрдЙрдЯрдкреБрдЯ рдЯреАрдорд╕рд┐рдЯреА - рдЯреАрдорд╕рд┐рдЯреА рдЗрдиреНрд╕реНрдкреЗрдХреНрд╢рди рдкреНрд░рдХрд╛рд░рд╛рд╕рд╛рдареА рдлреЙрд░рдореЕрдЯрдордзреНрдпреЗ рд░реВрдкрд╛рдВрддрд░рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╕рдорд░реНрдерди рдЖрд╣реЗ. рддреЗ рдХрд╕реЗ рдХрд╛рд░реНрдп рдХрд░рддреЗ рддреЗ рдкрд╛рд╣реВрдпрд╛.

рд╡рд╛рдкрд░рд▓реЗрд▓реНрдпрд╛ рд╕реЙрдлреНрдЯрд╡реЗрдЕрд░рдЪреА рдорд╛рд╣рд┐рддреА

рдкреАрд╡реНрд╣реАрдПрд╕-рд╕реНрдЯреБрдбрд┐рдУ тАФ C, C++, C# рдЖрдгрд┐ Java рдХреЛрдбрдЪреЗ рд╕реНрдерд┐рд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ, рд╡рд┐рд╡рд┐рдз рдкреНрд░рдХрд╛рд░рдЪреНрдпрд╛ рддреНрд░реБрдЯреА рд╢реЛрдзрдгреЗ рдЖрдгрд┐ рджреБрд░реБрд╕реНрдд рдХрд░рдгреНрдпрд╛рдЪреЗ рдХрд╛рд░реНрдп рд╕реБрд▓рдн рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдбрд┐рдЭрд╛рдЗрди рдХреЗрд▓реЗрд▓реЗ. рд╡рд┐рд╢реНрд▓реЗрд╖рдХ Windows, Linux рдЖрдгрд┐ macOS рд╡рд░ рд╡рд╛рдкрд░рд▓рд╛ рдЬрд╛рдК рд╢рдХрддреЛ. рдпрд╛ рд▓реЗрдЦрд╛рдд рдЖрдореНрд╣реА рдХреЗрд╡рд│ рд╡рд┐рд╢реНрд▓реЗрд╖рдХрдЪ рдирд╡реНрд╣реЗ рддрд░ рддреНрдпрд╛рдЪреНрдпрд╛ рд╡рд┐рддрд░рдгрд╛рддреАрд▓ рдХрд╛рд╣реА рдЙрдкрдпреБрдХреНрддрддрд╛ рджреЗрдЦреАрд▓ рд╕рдХреНрд░рд┐рдпрдкрдгреЗ рд╡рд╛рдкрд░реВ.

рд╕реАрдПрд▓рдореЙрдирд┐рдЯрд░ тАФ рдПрдХ рдореЙрдирд┐рдЯрд░рд┐рдВрдЧ рд╕рд░реНрд╡реНрд╣рд░ рдЖрд╣реЗ рдЬреЛ рдХрдВрдкрд╛рдЗрд▓рд░ рд▓рд╛рдБрдЪрдЪреЗ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рддреЛ. рддреБрдордЪрд╛ рдкреНрд░рдХрд▓реНрдк рддрдпрд╛рд░ рдХрд░рдгреЗ рд╕реБрд░реВ рдХрд░рдгреНрдпрд╛рдкреВрд░реНрд╡реА рддреЗ рддрд╛рдмрдбрддреЛрдм рдЪрд╛рд▓рд╡рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рд╕реНрдиреВрдкрд┐рдВрдЧ рдореЛрдбрдордзреНрдпреЗ, рд╕рд░реНрд╡реНрд╣рд░ рд╕рд░реНрд╡ рд╕рдорд░реНрдерд┐рдд рдХрдВрдкрд╛рдЗрд▓рд░реНрд╕рдЪреНрдпрд╛ рдзрд╛рд╡рд╛ рд░реЛрдЦреЗрд▓. рд╣реЗ рд▓рдХреНрд╖рд╛рдд рдШреЗрдгреНрдпрд╛рд╕рд╛рд░рдЦреЗ рдЖрд╣реЗ рдХреА рд╣реА рдЙрдкрдпреБрдХреНрддрддрд╛ рдХреЗрд╡рд│ C/C++ рдкреНрд░рдХрд▓реНрдкрд╛рдВрдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╡рд╛рдкрд░рд▓реА рдЬрд╛рдК рд╢рдХрддреЗ.

PlogConverter - рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдЕрд╣рд╡рд╛рд▓ рд╡реЗрдЧрд╡реЗрдЧрд│реНрдпрд╛ рд╕реНрд╡рд░реВрдкрд╛рдВрдордзреНрдпреЗ рд░реВрдкрд╛рдВрддрд░рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЙрдкрдпреБрдХреНрддрддрд╛.

рдЕрднреНрдпрд╛рд╕рд╛рдзреАрди рдкреНрд░рдХрд▓реНрдкрд╛рдЪреА рдорд╛рд╣рд┐рддреА

рдЪрд▓рд╛ рд╣реА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдПрдХрд╛ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЙрджрд╛рд╣рд░рдгрд╛рд╡рд░ рд╡рд╛рдкрд░реВрди рдкрд╛рд╣реВ - OpenRCT2 рдкреНрд░рдХрд▓реНрдкрд╛рдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реВрдпрд╛.

рдУрдкрдирдЖрд░рд╕реАрдЯреА 2 - RollerCoaster Tycoon 2 (RCT2) рдпрд╛ рдЧреЗрдордЪреА рдЦреБрд▓реА рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА, рдирд╡реАрди рдлрдВрдХреНрд╢рдиреНрд╕рд╕рд╣ рддреНрдпрд╛рдЪрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдгреЗ рдЖрдгрд┐ рдмрдЧрдЪреЗ рдирд┐рд░рд╛рдХрд░рдг рдХрд░рдгреЗ. рдЧреЗрдордкреНрд▓реЗ рд░рд╛рдЗрдб, рджреБрдХрд╛рдиреЗ рдЖрдгрд┐ рд╕реБрд╡рд┐рдзрд╛ рдЕрд╕рд▓реЗрд▓реЗ рдордиреЛрд░рдВрдЬрди рдкрд╛рд░реНрдХ рддрдпрд╛рд░ рдХрд░рдгреЗ рдЖрдгрд┐ рддреНрдпрд╛рдЪреА рджреЗрдЦрднрд╛рд▓ рдХрд░рдгреЗ рдпрд╛рднреЛрд╡рддреА рдлрд┐рд░рддреЗ. рдЦреЗрд│рд╛рдбреВрдиреЗ рдирдлрд╛ рдХрдорд╛рд╡рдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХреЗрд▓рд╛ рдкрд╛рд╣рд┐рдЬреЗ рдЖрдгрд┐ рдЕрддрд┐рдереАрдВрдирд╛ рдЖрдирдВрджреА рдареЗрд╡рддрд╛рдирд╛ рдЙрджреНрдпрд╛рдирд╛рдЪреА рдЪрд╛рдВрдЧрд▓реА рдкреНрд░рддрд┐рд╖реНрдард╛ рд░рд╛рдЦрд▓реА рдкрд╛рд╣рд┐рдЬреЗ. OpenRCT2 рддреБрдореНрд╣рд╛рд▓рд╛ рдкрд░рд┐рд╕реНрдерд┐рддреА рдЖрдгрд┐ рд╕рдБрдбрдмреЙрдХреНрд╕ рджреЛрдиреНрд╣реАрдордзреНрдпреЗ рдЦреЗрд│рдгреНрдпрд╛рдЪреА рдкрд░рд╡рд╛рдирдЧреА рджреЗрддреЗ. рдкрд░рд┐рд╕реНрдерд┐рддреАрдВрдордзреНрдпреЗ рдЦреЗрд│рд╛рдбреВрдиреЗ рдард░рд╛рд╡рд┐рдХ рд╡реЗрд│реЗрдд рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдп рдкреВрд░реНрдг рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЕрд╕рддреЗ, рддрд░ рд╕рдБрдбрдмреЙрдХреНрд╕ рдЦреЗрд│рд╛рдбреВрд▓рд╛ рдХреЛрдгрддреНрдпрд╛рд╣реА рдирд┐рд░реНрдмрдВрдз рдХрд┐рдВрд╡рд╛ рд╡рд┐рддреНрддрд╡рд┐рдирд╛ рдЕрдзрд┐рдХ рд▓рд╡рдЪрд┐рдХ рдкрд╛рд░реНрдХ рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рдЪреА рдкрд░рд╡рд╛рдирдЧреА рджреЗрддреЛ.

рд╕рдорд╛рдпреЛрдЬрди

рд╡реЗрд│ рд╡рд╛рдЪрд╡рдгреНрдпрд╛рд╕рд╛рдареА, рдореА рдХрджрд╛рдЪрд┐рдд рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╡рдЧрд│реЗрди рдЖрдгрд┐ рдорд╛рдЭреНрдпрд╛ рд╕рдВрдЧрдгрдХрд╛рд╡рд░ рдЯреАрдорд╕рд┐рдЯреА рд╕рд░реНрд╡реНрд╣рд░ рдЪрд╛рд▓реВ рдЕрд╕рд▓реНрдпрд╛рдкрд╛рд╕реВрди рд╕реБрд░реВ рдХрд░реЗрди. рдЖрдореНрд╣рд╛рд▓рд╛ рдпреЗрдереЗ рдЬрд╛рд╡реЗ рд▓рд╛рдЧреЗрд▓: рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯ:{рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рди рдкреНрд░рдХреНрд░рд┐рдпреЗрджрд░рдореНрдпрд╛рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреЗрд▓реЗрд▓реЗ рдкреЛрд░реНрдЯ} (рдорд╛рдЭреНрдпрд╛ рдмрд╛рдмрддреАрдд, рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯ:9090) рдЖрдгрд┐ рдЕрдзрд┐рдХреГрддрддрд╛ рдбреЗрдЯрд╛ рдкреНрд░рд╡рд┐рд╖реНрдЯ рдХрд░рд╛. рдЖрдд рдЧреЗрд▓реНрдпрд╛рдирдВрддрд░ рдЖрдордЪреЗ рд╕реНрд╡рд╛рдЧрдд рд╣реЛрдИрд▓:

рдкреАрд╡реНрд╣реАрдПрд╕-рд╕реНрдЯреБрдбрд┐рдУ рдЖрдгрд┐ рд╕рддрдд рдПрдХрддреНрд░реАрдХрд░рдг: рдЯреАрдорд╕рд┐рдЯреА. рдУрдкрди рд░реЛрд▓рд░рдХреЛрд╕реНрдЯрд░ рдЯрд╛рдпрдХреВрди 2 рдкреНрд░рдХрд▓реНрдкрд╛рдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг
рдкреНрд░реЛрдЬреЗрдХреНрдЯ рддрдпрд╛рд░ рдХрд░рд╛ рдмрдЯрдгрд╛рд╡рд░ рдХреНрд▓рд┐рдХ рдХрд░рд╛. рдкреБрдвреЗ, рд╡реНрдпрдХреНрддрд┐рдЪрд▓рд┐рддрдкрдгреЗ рдирд┐рд╡рдбрд╛ рдЖрдгрд┐ рдлреАрд▓реНрдб рднрд░рд╛.

рдкреАрд╡реНрд╣реАрдПрд╕-рд╕реНрдЯреБрдбрд┐рдУ рдЖрдгрд┐ рд╕рддрдд рдПрдХрддреНрд░реАрдХрд░рдг: рдЯреАрдорд╕рд┐рдЯреА. рдУрдкрди рд░реЛрд▓рд░рдХреЛрд╕реНрдЯрд░ рдЯрд╛рдпрдХреВрди 2 рдкреНрд░рдХрд▓реНрдкрд╛рдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг
рдмрдЯрдг рджрд╛рдмрд▓реНрдпрд╛рдирдВрддрд░ рддрдпрд╛рд░ рдХрд░рд╛, рдЖрдореНрд╣рд╛рд▓рд╛ рд╕реЗрдЯрд┐рдВрдЧреНрдЬрд╕рд╣ рд╡рд┐рдВрдбреЛрджреНрд╡рд╛рд░реЗ рд╕реНрд╡рд╛рдЧрдд рдХреЗрд▓реЗ рдЬрд╛рддреЗ.

рдкреАрд╡реНрд╣реАрдПрд╕-рд╕реНрдЯреБрдбрд┐рдУ рдЖрдгрд┐ рд╕рддрдд рдПрдХрддреНрд░реАрдХрд░рдг: рдЯреАрдорд╕рд┐рдЯреА. рдУрдкрди рд░реЛрд▓рд░рдХреЛрд╕реНрдЯрд░ рдЯрд╛рдпрдХреВрди 2 рдкреНрд░рдХрд▓реНрдкрд╛рдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг
рдЪрд▓рд╛ рдХреНрд▓рд┐рдХ рдХрд░реВрдпрд╛ рдмрд┐рд▓реНрдб рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рддрдпрд╛рд░ рдХрд░рд╛.

рдкреАрд╡реНрд╣реАрдПрд╕-рд╕реНрдЯреБрдбрд┐рдУ рдЖрдгрд┐ рд╕рддрдд рдПрдХрддреНрд░реАрдХрд░рдг: рдЯреАрдорд╕рд┐рдЯреА. рдУрдкрди рд░реЛрд▓рд░рдХреЛрд╕реНрдЯрд░ рдЯрд╛рдпрдХреВрди 2 рдкреНрд░рдХрд▓реНрдкрд╛рдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг
рдлреАрд▓реНрдб рднрд░рд╛ рдЖрдгрд┐ рдХреНрд▓рд┐рдХ рдХрд░рд╛ рддрдпрд╛рд░ рдХрд░рд╛. рдЖрдореНрд╣реА рддреБрдореНрд╣рд╛рд▓рд╛ рдЖрд╡реГрддреНрддреА рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рдгрд╛рд▓реА рдирд┐рд╡рдбрдгреНрдпрд╛рд╕ рд╕рд╛рдВрдЧрдгрд╛рд░реА рд╡рд┐рдВрдбреЛ рдкрд╛рд╣рддреЛ. рд╕реНрд░реЛрдд рдЖрдзреАрдЪ рд╕реНрдерд╛рдирд┐рдХ рдкрд╛рддрд│реАрд╡рд░ рдЕрд╕рд▓реНрдпрд╛рдиреЗ, рдХреНрд▓рд┐рдХ рдХрд░рд╛ рд╡рдЧрд│рд╛.

рдкреАрд╡реНрд╣реАрдПрд╕-рд╕реНрдЯреБрдбрд┐рдУ рдЖрдгрд┐ рд╕рддрдд рдПрдХрддреНрд░реАрдХрд░рдг: рдЯреАрдорд╕рд┐рдЯреА. рдУрдкрди рд░реЛрд▓рд░рдХреЛрд╕реНрдЯрд░ рдЯрд╛рдпрдХреВрди 2 рдкреНрд░рдХрд▓реНрдкрд╛рдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг
рд╢реЗрд╡рдЯреА, рдЖрдореНрд╣реА рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗрдЯрд┐рдВрдЧреНрдЬрд╡рд░ рдЬрд╛рдК.

рдкреАрд╡реНрд╣реАрдПрд╕-рд╕реНрдЯреБрдбрд┐рдУ рдЖрдгрд┐ рд╕рддрдд рдПрдХрддреНрд░реАрдХрд░рдг: рдЯреАрдорд╕рд┐рдЯреА. рдУрдкрди рд░реЛрд▓рд░рдХреЛрд╕реНрдЯрд░ рдЯрд╛рдпрдХреВрди 2 рдкреНрд░рдХрд▓реНрдкрд╛рдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг
рдЕрд╕реЗрдВрдмреНрд▓реА рд╕реНрдЯреЗрдкреНрд╕ рдЬреЛрдбреВрдпрд╛, рд╣реЗ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдХреНрд▓рд┐рдХ рдХрд░рд╛: рдмрд┐рд▓реНрдб рд╕реНрдЯреЗрдкреНрд╕ -> рдмрд┐рд▓реНрдб рд╕реНрдЯреЗрдк рдЬреЛрдбрд╛.

рдкреАрд╡реНрд╣реАрдПрд╕-рд╕реНрдЯреБрдбрд┐рдУ рдЖрдгрд┐ рд╕рддрдд рдПрдХрддреНрд░реАрдХрд░рдг: рдЯреАрдорд╕рд┐рдЯреА. рдУрдкрди рд░реЛрд▓рд░рдХреЛрд╕реНрдЯрд░ рдЯрд╛рдпрдХреВрди 2 рдкреНрд░рдХрд▓реНрдкрд╛рдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг
рдпреЗрдереЗ рдЖрдореНрд╣реА рдирд┐рд╡рдбрддреЛ:

  • рд░рдирд░ рдкреНрд░рдХрд╛рд░ -> рдХрдорд╛рдВрдб рд▓рд╛рдЗрди
  • рдЪрд╛рд▓рд╡рд╛ -> рд╕рд╛рдиреБрдХреВрд▓ рд╕реНрдХреНрд░рд┐рдкреНрдЯ

рдЖрдореНрд╣реА рдкреНрд░рдХрд▓реНрдк рд╕рдВрдХрд▓рдирд╛рджрд░рдореНрдпрд╛рди рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдгрд╛рд░ рдЕрд╕рд▓реНрдпрд╛рдиреЗ, рдЕрд╕реЗрдВрдмрд▓реА рдЖрдгрд┐ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдПрдХ рдкрд╛рдКрд▓ рдЕрд╕рд▓реЗ рдкрд╛рд╣рд┐рдЬреЗ, рдореНрд╣рдгреВрди рдлреАрд▓реНрдб рднрд░рд╛ рд╕рд╛рдиреБрдХреВрд▓ рд╕реНрдХреНрд░рд┐рдкреНрдЯ:

рдкреАрд╡реНрд╣реАрдПрд╕-рд╕реНрдЯреБрдбрд┐рдУ рдЖрдгрд┐ рд╕рддрдд рдПрдХрддреНрд░реАрдХрд░рдг: рдЯреАрдорд╕рд┐рдЯреА. рдУрдкрди рд░реЛрд▓рд░рдХреЛрд╕реНрдЯрд░ рдЯрд╛рдпрдХреВрди 2 рдкреНрд░рдХрд▓реНрдкрд╛рдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг
рдЖрдореНрд╣реА рдирдВрддрд░ рд╡реИрдпрдХреНрддрд┐рдХ рдЪрд░рдг рдкрд╛рд╣реВ. рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рд▓реЛрдб рдХрд░рдгреЗ, рдкреНрд░рдХрд▓реНрдк рдПрдХрддреНрд░ рдХрд░рдгреЗ, рддреНрдпрд╛рдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдгреЗ, рдЕрд╣рд╡рд╛рд▓ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рдгреЗ рдЖрдгрд┐ рддреНрдпрд╛рдЪреЗ рд╕реНрд╡рд░реВрдкрди рдХрд░рдгреЗ рдпрд╛рд╕рд╛рдареА рдХреЛрдбрдЪреНрдпрд╛ рдлрдХреНрдд рдЕрдХрд░рд╛ рдУрд│реА рд▓рд╛рдЧрддрд╛рдд рд╣реЗ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ рдЖрд╣реЗ.

рд╢реЗрд╡рдЯрдЪреА рдЧреЛрд╖реНрдЯ рдореНрд╣рдгрдЬреЗ рдкрд░реНрдпрд╛рд╡рд░рдг рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓реНрд╕ рд╕реЗрдЯ рдХрд░рдгреЗ, рдЬреЗ рдореА рддреНрдпрд╛рдВрдЪреА рд╡рд╛рдЪрдиреАрдпрддрд╛ рд╕реБрдзрд╛рд░рдгреНрдпрд╛рдЪреЗ рдХрд╛рд╣реА рдорд╛рд░реНрдЧ рд╕рд╛рдВрдЧрд┐рддрд▓реЗ рдЖрд╣реЗрдд. рд╣реЗ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдЪрд▓рд╛ рдкреБрдвреЗ рдЬрд╛рдКрдпрд╛: рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕ -> рдирд╡реАрди рдкреЕрд░рд╛рдореАрдЯрд░ рдЬреЛрдбрд╛ рдЖрдгрд┐ рддреАрди рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓реНрд╕ рдЬреЛрдбрд╛:

рдкреАрд╡реНрд╣реАрдПрд╕-рд╕реНрдЯреБрдбрд┐рдУ рдЖрдгрд┐ рд╕рддрдд рдПрдХрддреНрд░реАрдХрд░рдг: рдЯреАрдорд╕рд┐рдЯреА. рдУрдкрди рд░реЛрд▓рд░рдХреЛрд╕реНрдЯрд░ рдЯрд╛рдпрдХреВрди 2 рдкреНрд░рдХрд▓реНрдкрд╛рдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг
рддреБрдореНрд╣рд╛рд▓рд╛ рдлрдХреНрдд рдмрдЯрдг рджрд╛рдмрд╛рдпрдЪреЗ рдЖрд╣реЗ рдЪрд╛рд▓рд╡рд╛ рд╡рд░рдЪреНрдпрд╛ рдЙрдЬрд╡реНрдпрд╛ рдХреЛрдкрд░реНрдпрд╛рдд. рдкреНрд░рдХрд▓реНрдк рдПрдХрддреНрд░ рдЖрдгрд┐ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗрд▓реЗ рдЬрд╛рдд рдЕрд╕рддрд╛рдирд╛, рдореА рддреБрдореНрд╣рд╛рд▓рд╛ рд╕реНрдХреНрд░рд┐рдкреНрдЯрдмрджреНрджрд▓ рд╕рд╛рдВрдЧреЗрди.

рдереЗрдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯ

рдкреНрд░рдердо, рдЖрдореНрд╣рд╛рд▓рд╛ рдирд╡реАрдирддрдо PVS-рд╕реНрдЯреБрдбрд┐рдУ рд╡рд┐рддрд░рдг рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рдпрд╛рд╕рд╛рдареА рдЖрдореНрд╣реА Chocolatey рдкреЕрдХреЗрдЬ рдореЕрдиреЗрдЬрд░ рд╡рд╛рдкрд░рддреЛ. рдЬреНрдпрд╛рдВрдирд╛ рдпрд╛рдмрджреНрджрд▓ рдЕрдзрд┐рдХ рдЬрд╛рдгреВрди рдШреНрдпрд╛рдпрдЪреЗ рдЖрд╣реЗ рддреНрдпрд╛рдВрдЪреНрдпрд╛рд╕рд╛рдареА рдПрдХ рд╕рдВрдмрдВрдзрд┐рдд рдЖрд╣реЗ рд▓реЗрдЦ:

choco install pvs-studio -y

рдкреБрдвреЗ, CLMonitor рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрд┐рд▓реНрдб рдЯреНрд░реЕрдХрд┐рдВрдЧ рдпреБрдЯрд┐рд▓рд┐рдЯреА рд▓рд╛рдБрдЪ рдХрд░реВ.

%CLmon% monitor тАУ-attach

рдордЧ рдЖрдкрдг рдкрд░реНрдпрд╛рд╡рд░рдг рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рдореНрд╣рдгреВрди рдкреНрд░рдХрд▓реНрдк рддрдпрд╛рд░ рдХрд░реВ рдПрдордПрд╕рдмреА MSBuild рдЪреНрдпрд╛ рдЖрд╡реГрддреНрддреАрдЪрд╛ рдорд╛рд░реНрдЧ рдорд▓рд╛ рддрдпрд╛рд░ рдХрд░рд╛рдпрдЪрд╛ рдЖрд╣реЗ

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

PVS-Studio рд╕рд╛рдареА рд▓реЙрдЧрд┐рди рдЖрдгрд┐ рдкрд░рд╡рд╛рдирд╛ рдХреА рдкреНрд░рд╡рд┐рд╖реНрдЯ рдХрд░реВрдпрд╛:

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

рдмрд┐рд▓реНрдб рдкреВрд░реНрдг рдЭрд╛рд▓реНрдпрд╛рдирдВрддрд░, рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕реНрдб рдлрд╛рдЗрд▓реНрд╕ рдЖрдгрд┐ рд╕реНрдЯреЕрдЯрд┐рдХ рдЕреЕрдирд╛рд▓рд┐рд╕рд┐рд╕ рд╡реНрдпреБрддреНрдкрдиреНрди рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА CLMonitor рдкреБрдиреНрд╣рд╛ рдЪрд╛рд▓рд╡рд╛:

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

рдордЧ рдЖрдореНрд╣реА рдЖрдордЪреНрдпрд╛ рд╡рд┐рддрд░рдгрд╛рддреВрди рджреБрд╕рд░реА рдЙрдкрдпреБрдХреНрддрддрд╛ рд╡рд╛рдкрд░реВ. PlogConverter рдЕрд╣рд╡рд╛рд▓рд╛рд▓рд╛ рдорд╛рдирдХ рд╕реНрд╡рд░реВрдкрд╛рддреВрди рдЯреАрдорд╕рд┐рдЯреА-рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реНрд╡рд░реВрдкрд╛рдордзреНрдпреЗ рд░реВрдкрд╛рдВрддрд░рд┐рдд рдХрд░рддреЛ. рдпрд╛рдмрджреНрджрд▓ рдзрдиреНрдпрд╡рд╛рдж, рдЖрдореНрд╣реА рддреЗ рдереЗрдЯ рдмрд┐рд▓реНрдб рд╡рд┐рдВрдбреЛрдордзреНрдпреЗ рдкрд╛рд╣реВ рд╢рдХреВ.

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

рдордзреНрдпреЗ рд╕реНрд╡рд░реВрдкрд┐рдд рдЕрд╣рд╡рд╛рд▓ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдгреЗ рд╣реА рд╢реЗрд╡рдЯрдЪреА рдкрд╛рдпрд░реА рдЖрд╣реЗ stdout, рдЬрд┐рдереЗ рддреЗ TeamCity рдкрд╛рд░реНрд╕рд░рджреНрд╡рд╛рд░реЗ рдЙрдЪрд▓рд▓реЗ рдЬрд╛рдИрд▓.

type "C:tempptest.plog_TeamCity.txt"

рдкреВрд░реНрдг рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб:

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"

рджрд░рдореНрдпрд╛рди, рдкреНрд░рдХрд▓реНрдкрд╛рдЪреЗ рдЕрд╕реЗрдВрдмреНрд▓реА рдЖрдгрд┐ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдпрд╢рд╕реНрд╡реАрд░рд┐рддреНрдпрд╛ рдкреВрд░реНрдг рдЭрд╛рд▓реЗ рдЖрд╣реЗ, рдЖрдореНрд╣реА рдЯреЕрдмрд╡рд░ рдЬрд╛рдК рд╢рдХрддреЛ рдкреНрд░рдХрд▓реНрдк рдЖрдгрд┐ рдпрд╛рдЪреА рдЦрд╛рддреНрд░реА рдХрд░рд╛.

рдкреАрд╡реНрд╣реАрдПрд╕-рд╕реНрдЯреБрдбрд┐рдУ рдЖрдгрд┐ рд╕рддрдд рдПрдХрддреНрд░реАрдХрд░рдг: рдЯреАрдорд╕рд┐рдЯреА. рдУрдкрди рд░реЛрд▓рд░рдХреЛрд╕реНрдЯрд░ рдЯрд╛рдпрдХреВрди 2 рдкреНрд░рдХрд▓реНрдкрд╛рдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг
рдЖрддрд╛ рд╡рд░ рдХреНрд▓рд┐рдХ рдХрд░реВрдпрд╛ рдПрдХреВрдг рддрдкрд╛рд╕рдгреАрд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдЕрд╣рд╡рд╛рд▓ рдкрд╛рд╣рдгреНрдпрд╛рд╕рд╛рдареА рдЬрд╛:

рдкреАрд╡реНрд╣реАрдПрд╕-рд╕реНрдЯреБрдбрд┐рдУ рдЖрдгрд┐ рд╕рддрдд рдПрдХрддреНрд░реАрдХрд░рдг: рдЯреАрдорд╕рд┐рдЯреА. рдУрдкрди рд░реЛрд▓рд░рдХреЛрд╕реНрдЯрд░ рдЯрд╛рдпрдХреВрди 2 рдкреНрд░рдХрд▓реНрдкрд╛рдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг
рдЪреЗрддрд╛рд╡рдгреА рдбрд╛рдпрдЧреНрдиреЛрд╕реНрдЯрд┐рдХ рдирд┐рдпрдо рдХреНрд░рдорд╛рдВрдХрд╛рдВрдиреБрд╕рд╛рд░ рдЧрдЯрдмрджреНрдз рдХреЗрд▓реНрдпрд╛ рдЖрд╣реЗрдд. рдХреЛрдбрдордзреВрди рдиреЗрд╡реНрд╣рд┐рдЧреЗрдЯ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рддреБрдореНрд╣рд╛рд▓рд╛ рдЪреЗрддрд╛рд╡рдгреАрд╕рд╣ рд▓рд╛рдЗрди рдирдВрдмрд░рд╡рд░ рдХреНрд▓рд┐рдХ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рд╡рд░рдЪреНрдпрд╛ рдЙрдЬрд╡реНрдпрд╛ рдХреЛрдкрд░реНтАНрдпрд╛рддреАрд▓ рдкреНрд░рд╢реНрдирдЪрд┐рдиреНрд╣рд╛рд╡рд░ рдХреНрд▓рд┐рдХ рдХреЗрд▓реНрдпрд╛рдиреЗ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдЧрджрдкрддреНрд░рд╛рдВрд╕рд╣ рдПрдХ рдирд╡реАрди рдЯреЕрдм рдЙрдШрдбреЗрд▓. рддреБрдореНрд╣реА рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдЪреЗрддрд╛рд╡рдгреАрд╕рд╣ рд▓рд╛рдЗрди рдХреНрд░рдорд╛рдВрдХрд╛рд╡рд░ рдХреНрд▓рд┐рдХ рдХрд░реВрди рдХреЛрдбрджреНрд╡рд╛рд░реЗ рджреЗрдЦреАрд▓ рдиреЗрд╡реНрд╣рд┐рдЧреЗрдЯ рдХрд░реВ рд╢рдХрддрд╛. рд╡рд╛рдкрд░рддрд╛рдирд╛ рд░рд┐рдореЛрдЯ рд╕рдВрдЧрдгрдХрд╛рд╡рд░реВрди рдиреЗрд╡реНрд╣рд┐рдЧреЗрд╢рди рд╢рдХреНрдп рдЖрд╣реЗ SourceTreeRoot рдорд╛рд░реНрдХрд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдХрд╛рдЪреНрдпрд╛ рдСрдкрд░реЗрд╢рдирдЪреНрдпрд╛ рдпрд╛ рдкрджреНрдзрддреАрдордзреНрдпреЗ рд╕реНрд╡рд╛рд░рд╕реНрдп рдЕрд╕рд▓реЗрд▓реЗ рдХреЛрдгреАрд╣реА рд╕рдВрдмрдВрдзрд┐рдд рд╡рд┐рднрд╛рдЧрд╛рд╢реА рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдК рд╢рдХрддрд╛рдд. рджрд╕реНрддрдРрд╡рдЬреАрдХрд░рдг.

рд╡рд┐рд╢реНрд▓реЗрд╖рдХрд╛рдЪреЗ рдирд┐рдХрд╛рд▓ рдкрд╣рд╛рдд рдЖрд╣реЗ

рдЖрддрд╛ рдЖрдореНрд╣реА рдмрд┐рд▓реНрдб рддреИрдирд╛рдд рдХрд░рдгреЗ рдЖрдгрд┐ рдХреЙрдиреНрдлрд┐рдЧрд░ рдХрд░рдгреЗ рдкреВрд░реНрдг рдХреЗрд▓реЗ рдЖрд╣реЗ, рдЖрдореНрд╣реА рдкрд╛рд╣рдд рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдкреНрд░рдХрд▓реНрдкрд╛рдд рд╕рд╛рдкрдбрд▓реЗрд▓реНрдпрд╛ рдХрд╛рд╣реА рдордиреЛрд░рдВрдЬрдХ рдЪреЗрддрд╛рд╡рдгреА рдкрд╛рд╣реВ.

рдЪреЗрддрд╛рд╡рдгреА N1

V773 [CWE-401] 'рдкрд░рд┐рдгрд╛рдо' рдкреЙрдЗрдВрдЯрд░ рд╕реЛрдбрд▓реНрдпрд╛рд╢рд┐рд╡рд╛рдп рдЕрдкрд╡рд╛рдж рдЯрд╛рдХрдгреНрдпрд╛рдд рдЖрд▓рд╛. рдореЗрдорд░реА рд▓реАрдХ рд╢рдХреНрдп рдЖрд╣реЗ. 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;
}

рдбрд╛рдпрдиреЕрдорд┐рдХрд▓реА рдореЗрдорд░реА рд╡рд╛рдЯрдк рдХреЗрд▓реНрдпрд╛рдирдВрддрд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдХрд╛рдиреЗ рдПрдХ рддреНрд░реБрдЯреА рд▓рдХреНрд╖рд╛рдд рдШреЗрддрд▓реА рдСрдмреНрдЬреЗрдХреНрдЯ рддрдпрд╛рд░ рдХрд░рд╛, рдЕрдкрд╡рд╛рдж рдЖрдврд│рд▓реНрдпрд╛рд╕, рдореЗрдорд░реА рд╕рд╛рдл рд╣реЛрдд рдирд╛рд╣реА рдЖрдгрд┐ рдореЗрдорд░реА рд▓реАрдХ рд╣реЛрддреЗ.

рдЪреЗрддрд╛рд╡рдгреА N2

V501 '|' рдЪреНрдпрд╛ рдбрд╛рд╡реАрдХрдбреЗ рдЖрдгрд┐ рдЙрдЬрд╡реАрдХрдбреЗ '(1ULL << WIDX_MONTH_BOX)' рд╕рдорд╛рди рдЙрдк-рдЕрднрд┐рд╡реНрдпрдХреНрддреА рдЖрд╣реЗрдд. рдСрдкрд░реЗрдЯрд░ 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),
  ....
};

рд╕реНрдерд┐рд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдХрд╛рд╢рд┐рд╡рд╛рдп рдЗрддрд░ рдХрд╛рд╣реА рд▓реЛрдХ рд╣реА рдЪреМрдХрд╕рддрд╛ рдЪрд╛рдЪрдгреА рдЙрддреНрддреАрд░реНрдг рдХрд░реВ рд╢рдХрддрд╛рдд. рддрдВрддреЛрддрдВрдд рдпрд╛ рдХрд╛рд░рдгрд╛рд╕рд╛рдареА рд╣реЗ рдХреЙрдкреА-рдкреЗрд╕реНрдЯ рдЙрджрд╛рд╣рд░рдг рдЪрд╛рдВрдЧрд▓реЗ рдЖрд╣реЗ.

рдЪреЗрддрд╛рд╡рдгреА N3

V703 рд╣реЗ рд╡рд┐рдЪрд┐рддреНрд░ рдЖрд╣реЗ рдХреА рд╡реНрдпреБрддреНрдкрдиреНрди рд╡рд░реНрдЧ 'RCT12BannerElement' рдордзреАрд▓ 'рдзреНрд╡рдЬ' рдлреАрд▓реНрдб рдмреЗрд╕ рдХреНрд▓рд╛рд╕ 'RCT12TileElementBase' рдордзреАрд▓ рдлреАрд▓реНрдб рдУрд╡реНрд╣рд░рд░рд╛рдЗрдЯ рдХрд░рддреЗ. рдУрд│реА рддрдкрд╛рд╕рд╛: RCT12.h:570, RCT12.h:259. libopenrct2 RCT12.h 570

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

рдЕрд░реНрдерд╛рдд, рдмреЗрд╕ рдХреНрд▓рд╛рд╕рдордзреНрдпреЗ рдЖрдгрд┐ рдбрд┐рд╕реЗрдВрдбрдВрдЯрдордзреНрдпреЗ рд╕рдорд╛рди рдирд╛рд╡ рдЕрд╕рд▓реЗрд▓реЗ рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓ рд╡рд╛рдкрд░рдгреЗ рдиреЗрд╣рдореАрдЪ рддреНрд░реБрдЯреА рдирд╕рддреЗ. рддрдерд╛рдкрд┐, рд╡рд╛рд░рд╕рд╛ рддрдВрддреНрд░рдЬреНрдЮрд╛рди рд╕реНрд╡рддрдГрдЪ рдЧреГрд╣реАрдд рдзрд░рддреЗ рдХреА рдкрд╛рд▓рдХ рд╡рд░реНрдЧрд╛рдЪреА рд╕рд░реНрд╡ рдлреАрд▓реНрдб рдмрд╛рд▓ рд╡рд░реНрдЧрд╛рдд рдЙрдкрд╕реНрдерд┐рдд рдЖрд╣реЗрдд. рд╡рд╛рд░рд╕рд╛рдордзреНрдпреЗ рд╕рдорд╛рди рдирд╛рд╡ рдЕрд╕рд▓реЗрд▓реА рдлреАрд▓реНрдб рдШреЛрд╖рд┐рдд рдХрд░реВрди, рдЖрдореНрд╣реА рдЧреЛрдВрдзрд│ рд╕реБрд░реВ рдХрд░рддреЛ.

рдЪреЗрддрд╛рд╡рдгреА N4

V793 рд╣реЗ рд╡рд┐рдЪрд┐рддреНрд░ рдЖрд╣реЗ рдХреА 'imageDirection/8' рд╡рд┐рдзрд╛рдирд╛рдЪрд╛ рдкрд░рд┐рдгрд╛рдо рд╣рд╛ рд╕реНрдерд┐рддреАрдЪрд╛ рдПрдХ рднрд╛рдЧ рдЖрд╣реЗ. рдХрджрд╛рдЪрд┐рдд, рдпрд╛ рд╡рд┐рдзрд╛рдирд╛рдЪреА рддреБрд▓рдирд╛ рджреБрд╕рд░реНтАНрдпрд╛ рдХрд╢рд╛рд╢реАрд╣реА рдХреЗрд▓реА рдЧреЗрд▓реА рдЕрд╕рд╛рд╡реА. libopenrct2 ObservationTower.cpp 38

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

рдЪрд▓рд╛ рдЬрд╡рд│реВрди рдмрдШреВрдпрд╛. рдЕрднрд┐рд╡реНрдпрдХреНрддреА рдкреНрд░рддрд┐рдорд╛рджрд┐рд╢рд╛/8 рдЕрд╕рддреНрдп рдЕрд╕реЗрд▓ рддрд░ рдкреНрд░рддрд┐рдорд╛ рджрд┐рд╢рд╛ -7 рддреЗ 7 рдЪреНрдпрд╛ рд╢реНрд░реЗрдгреАрдд рдЖрд╣реЗ. рджреБрд╕рд░рд╛ рднрд╛рдЧ: (imageDirection / 8) != 3 рдЪреЗрдХ рдкреНрд░рддрд┐рдорд╛ рджрд┐рд╢рд╛ рд╢реНрд░реЗрдгреАрдмрд╛рд╣реЗрд░ рдЕрд╕рд▓реНрдпрд╛рдмрджреНрджрд▓: рдЕрдиреБрдХреНрд░рдореЗ -31 рддреЗ -24 рдЖрдгрд┐ 24 рддреЗ 31 рдкрд░реНрдпрдВрдд. рдЕрд╢рд╛ рдкреНрд░рдХрд╛рд░реЗ рдПрдХрд╛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╢реНрд░реЗрдгреАрдордзреНрдпреЗ рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╕рдВрдЦреНрдпрд╛ рддрдкрд╛рд╕рдгреЗ рдорд▓рд╛ рдЦреВрдк рд╡рд┐рдЪрд┐рддреНрд░ рд╡рд╛рдЯрддреЗ рдЖрдгрд┐ рдХреЛрдбрдЪреНрдпрд╛ рдпрд╛ рднрд╛рдЧрд╛рдордзреНрдпреЗ рдХреЛрдгрддреАрд╣реА рддреНрд░реБрдЯреА рдирд╕рд▓реА рддрд░реАрд╣реА, рдореА рдпрд╛ рдЕрдЯреА рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдгреНрдпрд╛рд╕рд╛рдареА рдкреБрдиреНрд╣рд╛ рд▓рд┐рд╣рд┐рдгреНрдпрд╛рдЪреА рд╢рд┐рдлрд╛рд░рд╕ рдХрд░рддреЛ. рдЬреЗ рд▓реЛрдХ рд╣рд╛ рдХреЛрдб рд╡рд╛рдЪрддреАрд▓ рдЖрдгрд┐ рд╕рд╛рдВрднрд╛рд│рддреАрд▓ рддреНрдпрд╛рдВрдЪреНрдпрд╛рд╕рд╛рдареА рдпрд╛рдореБрд│реЗ рдЬреАрд╡рди рдЦреВрдк рд╕реЛрдкреЗ рд╣реЛрдИрд▓.

рдЪреЗрддрд╛рд╡рдгреА N5

V587 рдпрд╛ рдкреНрд░рдХрд╛рд░рдЪреНрдпрд╛ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯрдЪрд╛ рдПрдХ рд╡рд┐рдЪрд┐рддреНрд░ рдХреНрд░рдо: A = B; рдм = рдЕ;. рдУрд│реА рддрдкрд╛рд╕рд╛: 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;
      ....
  }
  ....
}

рд╣рд╛ рдХреЛрдб рддреБрдХрдбрд╛ рдмрд╣реБрдзрд╛ рд╡рд┐рдШрдЯрди рдХрд░реВрди рдкреНрд░рд╛рдкреНрдд рдЭрд╛рд▓рд╛ рд╣реЛрддрд╛. рдордЧ, рдмрд╛рдХреАрдЪреНрдпрд╛ рдЯрд┐рдкреНрдкрдгреАрдиреБрд╕рд╛рд░, рдиреЙрди-рд╡рд░реНрдХрд┐рдВрдЧ рдХреЛрдбрдЪрд╛ рднрд╛рдЧ рдХрд╛рдвреВрди рдЯрд╛рдХрд▓рд╛ рдЧреЗрд▓рд╛. рдорд╛рддреНрд░, рдЕрдЬреВрди рдХрд╛рд╣реА рдСрдкрд░реЗрд╢рдиреНрд╕ рдмрд╛рдХреА рдЖрд╣реЗрдд cursorId, рдЬреНрдпрд╛рдЪрд╛ рджреЗрдЦреАрд▓ рдлрд╛рд░рд╕рд╛ рдЕрд░реНрде рдирд╛рд╣реА.

рдЪреЗрддрд╛рд╡рдгреА N6

V1004 [CWE-476] 'рдкреНрд▓реЗрдЕрд░' рдкреЙрдЗрдВрдЯрд░ nullptr рд╡рд┐рд░реБрджреНрдз рд╕рддреНрдпрд╛рдкрд┐рдд рдХреЗрд▓реНрдпрд╛рдирдВрддрд░ рддреЛ рдЕрд╕реБрд░рдХреНрд╖рд┐рддрдкрдгреЗ рд╡рд╛рдкрд░рд▓рд╛ рдЧреЗрд▓рд╛. рдУрд│реА рддрдкрд╛рд╕рд╛: 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);                    // <=
  }
  ....
}

рд╣рд╛ рдХреЛрдб рджреБрд░реБрд╕реНрдд рдХрд░рдгреЗ рдЕрдЧрджреА рд╕реЛрдкреЗ рдЖрд╣реЗ; рддреБрдореНрд╣рд╛рд▓рд╛ рддреЗ рддрд┐рд╕рд▒реНрдпрд╛рдВрджрд╛ рддрдкрд╛рд╕рд╛рд╡реЗ рд▓рд╛рдЧреЗрд▓ рдЦреЗрд│рд╛рдбреВ рд╢реВрдиреНрдп рдкреЙрдЗрдВрдЯрд░рд╡рд░ рдХрд┐рдВрд╡рд╛ рдХрдВрдбрд┐рд╢рдирд▓ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯрдЪреНрдпрд╛ рдореБрдЦреНрдп рднрд╛рдЧрд╛рдордзреНрдпреЗ рдЬреЛрдбрд╛. рдореА рджреБрд╕рд░рд╛ рдкрд░реНрдпрд╛рдп рд╕реБрдЪрд╡рддреЛ:

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

рдЪреЗрддрд╛рд╡рдгреА N7

V547 [CWE-570] рдЕрднрд┐рд╡реНрдпрдХреНрддреА '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));
    ....
  }
  ....
}

рддреБрдореНрд╣реА рдХреЛрдбрдЪреНрдпрд╛ рд╡рд╛рдЪрдгреНрдпрд╛рд╕ рдХрдареАрдг рдЬрд╛рдгрд╛рд░реНтАНрдпрд╛ рдУрд│реАрдкрд╛рд╕реВрди рдореБрдХреНрддрддрд╛ рдорд┐рд│рд╡реВ рд╢рдХрддрд╛ рдЖрдгрд┐ рддреЗ рддрдкрд╛рд╕реВрди рд╕рдорд╕реНрдпрд╛ рд╕реЛрдбрд╡реВ рд╢рдХрддрд╛ nullptr. рдореА рдЦрд╛рд▓реАрд▓рдкреНрд░рдорд╛рдгреЗ рдХреЛрдб рдмрджрд▓рдгреНрдпрд╛рдЪрд╛ рд╕рд▓реНрд▓рд╛ рджреЗрддреЛ:

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

рдЪреЗрддрд╛рд╡рдгреА N8

V1048 [CWE-1164] 'ColumnHeaderPressedCurrentState' рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓ рд╕рдорд╛рди рдореВрд▓реНрдп рдирд┐рдпреБрдХреНрдд рдХреЗрд▓реЗ рд╣реЛрддреЗ. libopenrct2ui CustomListView.cpp 510

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

рдХреЛрдб рдЕрдЧрджреА рд╡рд┐рдЪрд┐рддреНрд░ рджрд┐рд╕рдд рдЖрд╣реЗ. рдорд▓рд╛ рдЕрд╕реЗ рджрд┐рд╕рддреЗ рдХреА рдПрдХрддрд░ рдХрдВрдбрд┐рд╢рдирдордзреНрдпреЗ рдХрд┐рдВрд╡рд╛ рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓ рдкреБрдиреНрд╣рд╛ рдирд┐рдпреБрдХреНрдд рдХрд░рддрд╛рдирд╛ рдЯрд╛рдпрдкрд┐рдВрдЧ рдЭрд╛рд▓реА рд╣реЛрддреА рдХреЙрд▓рдорд╣реЗрдбрд░ рдкреНрд░реЗрд╕реНрдб рдХрд░рдВрдЯ рд╕реНрдЯреЗрдЯ рдореВрд▓реНрдпреЗ рдЦреЛрдЯреЗ.

рдирд┐рд╖реНрдХрд░реНрд╖

рдЬрд╕реЗ рдЖрдкрдг рдкрд╛рд╣реВ рд╢рдХрддреЛ, рдЖрдкрд▓реНрдпрд╛ рдЯреАрдорд╕рд┐рдЯреА рдкреНрд░реЛрдЬреЗрдХреНрдЯрдордзреНрдпреЗ PVS-Studio рд╕реНрдЯреЕрдЯрд┐рдХ рдЕреЕрдирд╛рд▓рд╛рдпрдЭрд░ рд╕рдорд╛рдХрд▓рд┐рдд рдХрд░рдгреЗ рдЕрдЧрджреА рд╕реЛрдкреЗ рдЖрд╣реЗ. рд╣реЗ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдлрдХреНрдд рдПрдХ рд▓рд╣рд╛рди рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдлрд╛рдЗрд▓ рд▓рд┐рд╣рд┐рдгреЗ рдкреБрд░реЗрд╕реЗ рдЖрд╣реЗ. рдХреЛрдб рддрдкрд╛рд╕рдгреЗ рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдЕрд╕реЗрдВрдмреНрд▓реАрдирдВрддрд░ рд▓рдЧреЗрдЪ рд╕рдорд╕реНрдпрд╛ рдУрд│рдЦрдгреНрдпрд╛рд╕ рдЕрдиреБрдорддреА рджреЗрдИрд▓, рдЬреЗ рдЬрдЯрд┐рд▓рддрд╛ рдЖрдгрд┐ рдмрджрд▓рд╛рдВрдЪреА рдХрд┐рдВрдордд рдЕрджреНрдпрд╛рдк рдХрдореА рдЕрд╕рддрд╛рдирд╛ рддреНрдпрд╛рдВрдирд╛ рджреВрд░ рдХрд░рдгреНрдпрд╛рдд рдорджрдд рдХрд░реЗрд▓.

рдкреАрд╡реНрд╣реАрдПрд╕-рд╕реНрдЯреБрдбрд┐рдУ рдЖрдгрд┐ рд╕рддрдд рдПрдХрддреНрд░реАрдХрд░рдг: рдЯреАрдорд╕рд┐рдЯреА. рдУрдкрди рд░реЛрд▓рд░рдХреЛрд╕реНрдЯрд░ рдЯрд╛рдпрдХреВрди 2 рдкреНрд░рдХрд▓реНрдкрд╛рдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг
рдЖрдкрдг рд╣рд╛ рд▓реЗрдЦ рдЗрдВрдЧреНрд░рдЬреА рднрд╛рд╖рд┐рдХ рдкреНрд░реЗрдХреНрд╖рдХрд╛рдВрд╕рд╣ рд╕рд╛рдорд╛рдпрд┐рдХ рдХрд░реВ рдЗрдЪреНрдЫрд┐рдд рдЕрд╕рд▓реНрдпрд╛рд╕, рдХреГрдкрдпрд╛ рднрд╛рд╖рд╛рдВрддрд░ рджреБрд╡рд╛ рд╡рд╛рдкрд░рд╛: рд╡реНрд▓рд╛рджрд┐рд╕реНрд▓рд╛рд╡ рд╕реНрдЯреЛрд▓реНрдпрд╛рд░реЛрд╡реНрд╣. рдкреАрд╡реНрд╣реАрдПрд╕-рд╕реНрдЯреБрдбрд┐рдУ рдЖрдгрд┐ рд╕рддрдд рдПрдХрддреНрд░реАрдХрд░рдг: рдЯреАрдорд╕рд┐рдЯреА. рдУрдкрди рд░реЛрд▓рд░рдХреЛрд╕реНрдЯрд░ рдЯрд╛рдпрдХреВрди 2 рдкреНрд░рдХрд▓реНрдкрд╛рдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг.

рд╕реНрддреНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛