PVS-рд╕реНрдЯреБрдбрд┐рдпреЛ рд░ рдирд┐рд░рдиреНрддрд░ рдПрдХреАрдХрд░рдг: TeamCityред рдУрдкрди рд░реЛрд▓рд░рдХреЛрд╕реНрдЯрд░ рдЯрд╛рдЗрдХреБрди реи рдкрд░рд┐рдпреЛрдЬрдирд╛рдХреЛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг

PVS-рд╕реНрдЯреБрдбрд┐рдпреЛ рд░ рдирд┐рд░рдиреНрддрд░ рдПрдХреАрдХрд░рдг: TeamCityред рдУрдкрди рд░реЛрд▓рд░рдХреЛрд╕реНрдЯрд░ рдЯрд╛рдЗрдХреБрди реи рдкрд░рд┐рдпреЛрдЬрдирд╛рдХреЛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг
PVS-рд╕реНрдЯреБрдбрд┐рдпреЛ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдкреНрд░рдпреЛрдЧрдХреЛ рд▓рд╛рдЧрд┐ рд╕рдмреИрднрдиреНрджрд╛ рд╣рд╛рд▓рдХреЛ рдкрд░рд┐рджреГрд╢реНрдпрд╣рд░реВ рдордзреНрдпреЗ рдПрдХ CI рдкреНрд░рдгрд╛рд▓реАрд╣рд░реВрд╕рдБрдЧ рдпрд╕рдХреЛ рдПрдХреАрдХрд░рдг рд╣реЛред рд░ рдпрджреНрдпрдкрд┐ рд▓рдЧрднрдЧ рдХреБрдиреИ рдкрдирд┐ рдирд┐рд░рдиреНрддрд░ рдПрдХреАрдХрд░рдг рдкреНрд░рдгрд╛рд▓реАрдмрд╛рдЯ PVS-рд╕реНрдЯреБрдбрд┐рдпреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛рдХреЛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗрд╣реА рдЖрджреЗрд╢рд╣рд░реВрдорд╛ рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ, рд╣рд╛рдореА рдпреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛рд▓рд╛рдИ рдЕрдЭ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛рдЙрди рдЬрд╛рд░реА рд░рд╛рдЦреНрдЫреМрдВред PVS-рд╕реНрдЯреБрдбрд┐рдпреЛрд╕рдБрдЧ рдЕрдм рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдЖрдЙрдЯрдкреБрдЯрд▓рд╛рдИ TeamCity - TeamCity Inspections Type рдХреЛ рдврд╛рдБрдЪрд╛рдорд╛ рд░реВрдкрд╛рдиреНрддрд░рдг рдЧрд░реНрди рд╕рдорд░реНрдерди рдЫред рдпреЛ рдХрд╕рд░реА рдХрд╛рдо рдЧрд░реНрдЫ рд╣реЗрд░реМрдВред

рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдПрдХреЛ рд╕рдлреНрдЯрд╡реЗрдпрд░ рдмрд╛рд░реЗ рдЬрд╛рдирдХрд╛рд░реА

PVS- рд╕реНрдЯреВрдбрд┐рдпреЛ тАФ C, C++, C# рд░ Java рдХреЛрдбрдХреЛ рд╕реНрдерд┐рд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ, рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░рдХрд╛ рддреНрд░реБрдЯрд┐рд╣рд░реВ рдлреЗрд▓рд╛ рдкрд╛рд░реНрди рд░ рд╕реБрдзрд╛рд░ рдЧрд░реНрдиреЗ рдХрд╛рд░реНрдпрд▓рд╛рдИ рд╕рд╣рдЬ рдмрдирд╛рдЙрди рдбрд┐рдЬрд╛рдЗрди рдЧрд░рд┐рдПрдХреЛред рд╡рд┐рд╢реНрд▓реЗрд╖рдХ Windows, Linux рд░ macOS рдорд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫред рдпрд╕ рд▓реЗрдЦрдорд╛ рд╣рд╛рдореА рд╕рдХреНрд░рд┐рдп рд░реВрдкрдорд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдорд╛рддреНрд░ рд╣реЛрдЗрди, рддрд░ рдпрд╕рдХреЛ рд╡рд┐рддрд░рдгрдмрд╛рдЯ рдХреЗрд╣реА рдЙрдкрдпреЛрдЧрд┐рддрд╛рд╣рд░реВ рдкрдирд┐ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗрдЫреМрдВред

CLMonitor - рдПрдХ рдирд┐рдЧрд░рд╛рдиреА рд╕рд░реНрднрд░ рд╣реЛ рдЬрд╕рд▓реЗ рдХрдореНрдкрд╛рдЗрд▓рд░ рд▓рдиреНрдЪрд╣рд░реВ рдирд┐рдЧрд░рд╛рдиреА рдЧрд░реНрджрдЫред рдпреЛ рддрдкрд╛рдЗрдБрдХреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрди рд╕реБрд░реБ рдЧрд░реНрдиреБ рдЕрдШрд┐ рддреБрд░реБрдиреНрддреИ рдЪрд▓рд╛рдЙрдиреБ рдкрд░реНрдЫред рд╕реНрдиреБрдкрд┐рдЩ рдореЛрдбрдорд╛, рд╕рд░реНрднрд░рд▓реЗ рд╕рдмреИ рд╕рдорд░реНрдерд┐рдд рдХрдореНрдкрд╛рдЗрд▓рд░рд╣рд░реВрдХреЛ рд░рдирд╣рд░реВ рдЕрд╡рд░реЛрдз рдЧрд░реНрдиреЗрдЫред рдпреЛ рдзреНрдпрд╛рди рджрд┐рди рд▓рд╛рдпрдХ рдЫ рдХрд┐ рдпреЛ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреЗрд╡рд▓ C/C++ рдкрд░рд┐рдпреЛрдЬрдирд╛рд╣рд░реВ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЧрд░реНрди рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫред

PlogConverter - рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рд░рд┐рдкреЛрд░реНрдЯрд╣рд░реВ рд╡рд┐рднрд┐рдиреНрди рдврд╛рдБрдЪрд╛рд╣рд░реВрдорд╛ рд░реВрдкрд╛рдиреНрддрд░рдг рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ рдЙрдкрдпреЛрдЧрд┐рддрд╛ред

рдЕрдзреНрдпрдпрди рдЕрдиреНрддрд░реНрдЧрдд рдкрд░рд┐рдпреЛрдЬрдирд╛ рдмрд╛рд░реЗ рдЬрд╛рдирдХрд╛рд░реА

рдпреЛ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛рд▓рд╛рдИ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЙрджрд╛рд╣рд░рдгрдорд╛ рдкреНрд░рдпрд╛рд╕ рдЧрд░реМрдВ - OpenRCT2 рдкрд░рд┐рдпреЛрдЬрдирд╛рдХреЛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЧрд░реМрдВред

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

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

рд╕рдордп рдмрдЪрдд рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐, рдо рд╕рдореНрднрд╡рддрдГ рд╕реНрдерд╛рдкрдирд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЫреЛрдбреНрдиреЗрдЫреБ рд░ рдореЗрд░реЛ рдХрдореНрдкреНрдпреБрдЯрд░рдорд╛ TeamCity рд╕рд░реНрднрд░ рдЪрд▓рд┐рд░рд╣реЗрдХреЛ рдХреНрд╖рдгрдмрд╛рдЯ рд╕реБрд░реБ рдЧрд░реНрдиреЗрдЫреБред рд╣рд╛рдореАрд▓реЗ рдорд╛ рдЬрд╛рдиреБ рдкрд░реНрдЫ: localhost:{port specified while installation process} (рдореЗрд░реЛ рдХреЗрд╕рдорд╛, localhost:9090) рд░ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдбреЗрдЯрд╛ рдкреНрд░рд╡рд┐рд╖реНрдЯ рдЧрд░реНрдиреБрд╣реЛрд╕реНред рдкреНрд░рд╡реЗрд╢ рдЧрд░реЗрдкрдЫрд┐ рд╣рд╛рдореАрд▓рд╛рдИ рд╕реНрд╡рд╛рдЧрдд рдЧрд░рд┐рдиреЗрдЫ:

PVS-рд╕реНрдЯреБрдбрд┐рдпреЛ рд░ рдирд┐рд░рдиреНрддрд░ рдПрдХреАрдХрд░рдг: TeamCityред рдУрдкрди рд░реЛрд▓рд░рдХреЛрд╕реНрдЯрд░ рдЯрд╛рдЗрдХреБрди реи рдкрд░рд┐рдпреЛрдЬрдирд╛рдХреЛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг
Create Project рдмрдЯрдирдорд╛ рдХреНрд▓рд┐рдХ рдЧрд░реНрдиреБрд╣реЛрд╕реНред рдЕрд░реНрдХреЛ, рдореНрдпрд╛рдиреБрдЕрд▓ рд░реВрдкрдорд╛ рдЪрдпрди рдЧрд░реНрдиреБрд╣реЛрд╕реН рд░ рдХреНрд╖реЗрддреНрд░рд╣рд░реВ рднрд░реНрдиреБрд╣реЛрд╕реНред

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

PVS-рд╕реНрдЯреБрдбрд┐рдпреЛ рд░ рдирд┐рд░рдиреНрддрд░ рдПрдХреАрдХрд░рдг: TeamCityред рдУрдкрди рд░реЛрд▓рд░рдХреЛрд╕реНрдЯрд░ рдЯрд╛рдЗрдХреБрди реи рдкрд░рд┐рдпреЛрдЬрдирд╛рдХреЛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг
рдХреНрд▓рд┐рдХ рдЧрд░реМрдВ рдирд┐рд░реНрдорд╛рдг рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН.

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

PVS-рд╕реНрдЯреБрдбрд┐рдпреЛ рд░ рдирд┐рд░рдиреНрддрд░ рдПрдХреАрдХрд░рдг: TeamCityред рдУрдкрди рд░реЛрд▓рд░рдХреЛрд╕реНрдЯрд░ рдЯрд╛рдЗрдХреБрди реи рдкрд░рд┐рдпреЛрдЬрдирд╛рдХреЛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг
рдЕрдиреНрддрдорд╛, рд╣рд╛рдореА рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реЗрдЯрд┐рдЩрд╣рд░реВрдорд╛ рдЬрд╛рдиреНрдЫреМрдВред

PVS-рд╕реНрдЯреБрдбрд┐рдпреЛ рд░ рдирд┐рд░рдиреНрддрд░ рдПрдХреАрдХрд░рдг: TeamCityред рдУрдкрди рд░реЛрд▓рд░рдХреЛрд╕реНрдЯрд░ рдЯрд╛рдЗрдХреБрди реи рдкрд░рд┐рдпреЛрдЬрдирд╛рдХреЛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг
рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдЪрд░рдгрд╣рд░реВ рдердкреМрдВ, рдпреЛ рдЧрд░реНрди рдХреНрд▓рд┐рдХ рдЧрд░реНрдиреБрд╣реЛрд╕реН: рдирд┐рд░реНрдорд╛рдг рдЪрд░рдгрд╣рд░реВ -> рдирд┐рд░реНрдорд╛рдг рдЪрд░рдг рдердкреНрдиреБрд╣реЛрд╕реН.

PVS-рд╕реНрдЯреБрдбрд┐рдпреЛ рд░ рдирд┐рд░рдиреНрддрд░ рдПрдХреАрдХрд░рдг: TeamCityред рдУрдкрди рд░реЛрд▓рд░рдХреЛрд╕реНрдЯрд░ рдЯрд╛рдЗрдХреБрди реи рдкрд░рд┐рдпреЛрдЬрдирд╛рдХреЛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг
рдпрд╣рд╛рдБ рд╣рд╛рдореА рдЫрдиреМрдЯ рдЧрд░реНрдЫреМрдВ:

  • рдзрд╛рд╡рдХ рдкреНрд░рдХрд╛рд░ -> рдХрдорд╛рдгреНрдб рд▓рд╛рдЗрди
  • рдЪрд▓рд╛рдЙрдиреБрд╣реЛрд╕реН -> рдЕрдиреБрдХреВрд▓рди рд▓рд┐рдкрд┐

рд╣рд╛рдореАрд▓реЗ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕рдВрдХрд▓рдирдХреЛ рдХреНрд░рдордорд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЧрд░реНрдиреЗ рднрдПрдХрд╛рд▓реЗ, рд╡рд┐рдзрд╛рдирд╕рднрд╛ рд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдПрдХ рдЪрд░рдг рд╣реБрдиреБрдкрд░реНрдЫ, рддреНрдпрд╕реИрд▓реЗ рдлрд┐рд▓реНрдб рднрд░реНрдиреБрд╣реЛрд╕реНред рдЕрдиреБрдХреВрд▓ рд╕реНрдХреНрд░рд┐рдкреНрдЯ:

PVS-рд╕реНрдЯреБрдбрд┐рдпреЛ рд░ рдирд┐рд░рдиреНрддрд░ рдПрдХреАрдХрд░рдг: TeamCityред рдУрдкрди рд░реЛрд▓рд░рдХреЛрд╕реНрдЯрд░ рдЯрд╛рдЗрдХреБрди реи рдкрд░рд┐рдпреЛрдЬрдирд╛рдХреЛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг
рд╣рд╛рдореА рд╡реНрдпрдХреНрддрд┐рдЧрдд рдЪрд░рдгрд╣рд░реВ рдкрдЫрд┐ рд╣реЗрд░реНрдиреЗрдЫреМрдВред рдпреЛ рдорд╣рддреНрддреНрд╡рдкреВрд░реНрдг рдЫ рдХрд┐ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рд▓реЛрдб рдЧрд░реНрди, рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕рдВрдпреЛрдЬрди рдЧрд░реНрди, рдпрд╕рдХреЛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЧрд░реНрди, рд░рд┐рдкреЛрд░реНрдЯ рдЖрдЙрдЯрдкреБрдЯ рдЧрд░реНрди рд░ рдпрд╕рд▓рд╛рдИ рдврд╛рдБрдЪрд╛рдорд╛ рдХреЛрдбрдХреЛ рдПрдШрд╛рд░ рд▓рд╛рдЗрдирд╣рд░реВ рдорд╛рддреНрд░ рд▓рд┐рдиреНрдЫред

рд╣рд╛рдореАрд▓реЗ рдЧрд░реНрдиреБрдкрд░реНрдиреЗ рдЕрдиреНрддрд┐рдо рдХреБрд░рд╛ рднрдиреЗрдХреЛ рд╡рд╛рддрд╛рд╡рд░рдг рдЪрд░рд╣рд░реВ рд╕реЗрдЯ рдЧрд░реНрдиреБ рд╣реЛ, рдЬреБрди рдореИрд▓реЗ рддрд┐рдиреАрд╣рд░реВрдХреЛ рдкрдардиреАрдпрддрд╛ рд╕реБрдзрд╛рд░ рдЧрд░реНрдиреЗ рдХреЗрд╣реА рддрд░рд┐рдХрд╛рд╣рд░реВ рд░реЗрдЦрд╛рдВрдХрд┐рдд рдЧрд░реЗрдХреЛ рдЫреБред рдпреЛ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐, рдЕрдЧрд╛рдбрд┐ рдмрдвреМрдВ: рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░рд╣рд░реВ -> рдирдпрд╛рдБ рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░ рдердкреНрдиреБрд╣реЛрд╕реН рд░ рддреАрди рдЪрд░ рдердкреНрдиреБрд╣реЛрд╕реН:

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

рдкреНрд░рддреНрдпрдХреНрд╖ рд╕реНрдХреНрд░рд┐рдкреНрдЯ

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

choco install pvs-studio -y

рдЕрд░реНрдХреЛ, CLMonitor рдкрд░рд┐рдпреЛрдЬрдирд╛ рдирд┐рд░реНрдорд╛рдг рдЯреНрд░реНрдпрд╛рдХрд┐рдЩ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рд╕реБрд░реБ рдЧрд░реМрдВред

%CLmon% monitor тАУ-attach

рддреНрдпрд╕рдкрдЫрд┐ рд╣рд╛рдореА рдкрд░рд┐рдпреЛрдЬрдирд╛рд▓рд╛рдИ рд╡рд╛рддрд╛рд╡рд░рдгреАрдп рдЪрд░рдХреЛ рд░реВрдкрдорд╛ рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрдиреЗрдЫреМрдВ MSB рдореИрд▓реЗ рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ 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 рд▓реЗ рдПрдЙрдЯрд╛ рд░рд┐рдкреЛрд░реНрдЯрд▓рд╛рдИ рдорд╛рдирдХ рдврд╛рдБрдЪрд╛рдмрд╛рдЯ TeamCity-рд╡рд┐рд╢реЗрд╖ рдврд╛рдБрдЪрд╛рдорд╛ рд░реВрдкрд╛рдиреНрддрд░рдг рдЧрд░реНрдЫред рдпрд╕рдХрд╛ рд▓рд╛рдЧрд┐ рдзрдиреНрдпрд╡рд╛рдж, рд╣рд╛рдореА рдпрд╕рд▓рд╛рдИ рд╕рд┐рдзреИ рдирд┐рд░реНрдорд╛рдг рд╡рд┐рдиреНрдбреЛрдорд╛ рд╣реЗрд░реНрди рд╕рдХреНрд╖рдо рд╣реБрдиреЗрдЫреМрдВред

%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"

рдпрд╕ рдмреАрдЪрдорд╛, рдкрд░рд┐рдпреЛрдЬрдирд╛рдХреЛ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд╕рдореНрдкрдиреНрди рднрдПрдХреЛ рдЫ, рд╣рд╛рдореА рдЯреНрдпрд╛рдмрдорд╛ рдЬрд╛рди рд╕рдХреНрдЫреМрдВ рдкрд░рд┐рдпреЛрдЬрдирд╛рд╣рд░реБ ╨╕ ╤Г╨▒╨╡╨┤╨╕╤В╤М╤Б╤П ╨▓ ╤Н╤В╨╛╨╝ред

PVS-рд╕реНрдЯреБрдбрд┐рдпреЛ рд░ рдирд┐рд░рдиреНрддрд░ рдПрдХреАрдХрд░рдг: TeamCityред рдУрдкрди рд░реЛрд▓рд░рдХреЛрд╕реНрдЯрд░ рдЯрд╛рдЗрдХреБрди реи рдкрд░рд┐рдпреЛрдЬрдирд╛рдХреЛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг
рдЕрдм рдХреНрд▓рд┐рдХ рдЧрд░реМрдВ рдирд┐рд░реАрдХреНрд╖рдг рдХреБрд▓рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рд░рд┐рдкреЛрд░реНрдЯ рд╣реЗрд░реНрди рдЬрд╛рдиреБрд╣реЛрд╕реН:

PVS-рд╕реНрдЯреБрдбрд┐рдпреЛ рд░ рдирд┐рд░рдиреНрддрд░ рдПрдХреАрдХрд░рдг: TeamCityред рдУрдкрди рд░реЛрд▓рд░рдХреЛрд╕реНрдЯрд░ рдЯрд╛рдЗрдХреБрди реи рдкрд░рд┐рдпреЛрдЬрдирд╛рдХреЛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг
рдЪреЗрддрд╛рд╡рдиреАрд╣рд░реВ рдбрд╛рдпрдЧреНрдиреЛрд╕реНрдЯрд┐рдХ рдирд┐рдпрдо рд╕рдВрдЦреНрдпрд╛рд╣рд░реВрджреНрд╡рд╛рд░рд╛ рд╕рдореВрд╣рдмрджреНрдз рдЧрд░рд┐рдПрдХрд╛ рдЫрдиреНред рдХреЛрдб рдорд╛рд░реНрдлрдд рдиреЗрднрд┐рдЧреЗрдЯ рдЧрд░реНрди, рддрдкрд╛рдИрдВрд▓реЗ рдЪреЗрддрд╛рд╡рдиреАрдХреЛ рд╕рд╛рде рд▓рд╛рдЗрди рдирдореНрдмрд░рдорд╛ рдХреНрд▓рд┐рдХ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред рдорд╛рдерд┐рд▓реНрд▓реЛ рджрд╛рдпрд╛рдБ рдХреБрдирд╛рдорд╛ рд░рд╣реЗрдХреЛ рдкреНрд░рд╢реНрди рдЪрд┐рдиреНрд╣рдорд╛ рдХреНрд▓рд┐рдХ рдЧрд░реНрдирд╛рд▓реЗ рддрдкрд╛рдИрдВрд▓рд╛рдИ рдХрд╛рдЧрдЬрд╛рддрд╕рд╣рд┐рддрдХреЛ рдирдпрд╛рдБ рдЯреНрдпрд╛рдм рдЦреЛрд▓реНрдиреЗрдЫред рддрдкрд╛рдИрдВ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдЪреЗрддрд╛рд╡рдиреАрдХреЛ рд╕рд╛рде рд▓рд╛рдЗрди рдирдореНрдмрд░рдорд╛ рдХреНрд▓рд┐рдХ рдЧрд░реЗрд░ рдХреЛрдб рдорд╛рд░реНрдлрдд рдиреЗрднрд┐рдЧреЗрдЯ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджрд╛ рд░рд┐рдореЛрдЯ рдХрдореНрдкреНрдпреБрдЯрд░рдмрд╛рдЯ рдиреЗрднрд┐рдЧреЗрд╕рди рд╕рдореНрднрд╡ рдЫ 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)
  {
    ....
  }
  ....
}

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

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

V587 рдпрд╕ рдкреНрд░рдХрд╛рд░рдХреЛ рдЕрд╕рд╛рдЗрдирдореЗрдиреНрдЯрд╣рд░реВрдХреЛ рдПрдХ рдЕрдЬреАрдм рдЕрдиреБрдХреНрд░рдо: A = B; B = A;ред рд▓рд╛рдЗрдирд╣рд░реВ рдЬрд╛рдБрдЪ рдЧрд░реНрдиреБрд╣реЛрд╕реН: 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;
      ....
  }
  ....
}

рдпреЛ рдХреЛрдб рдЯреБрдХреНрд░рд╛ рд╕рдореНрднрд╡рддрдГ decompilation рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╛рдкреНрдд рднрдПрдХреЛ рдерд┐рдпреЛред рддреНрдпрд╕рдкрдЫрд┐, рдЯрд┐рдкреНрдкрдгреА рдЫреЛрдбреЗрд░ рдиреНрдпрд╛рдп рдЧрд░реНрджреИ, рдЧреИрд░-рдХрд╛рд░реНрдпрдХрд╛рд░реА рдХреЛрдбрдХреЛ рдЕрдВрд╢ рд╣рдЯрд╛рдЗрдпреЛред рдпрджреНрдпрдкрд┐, рддреНрдпрд╣рд╛рдБ рдЕрдЭреИ рджреБрдИрд╡рдЯрд╛ рдЕрдкрд░реЗрд╢рдирд╣рд░реВ рдмрд╛рдБрдХреА рдЫрдиреН 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();
  }
}

рдХреЛрдб рдПрдХрджрдо рдЕрдиреМрдареЛ рджреЗрдЦрд┐рдиреНрдЫред рдпреЛ рдорд▓рд╛рдИ рд▓рд╛рдЧреНрджрдЫ рдХрд┐ рддреНрдпрд╣рд╛рдБ рдПрдХ рдЯрд╛рдЗрдкреЛ рдерд┐рдпреЛ рдХрд┐ рд╕рд░реНрддрдорд╛ рд╡рд╛ рдЪрд░ рдкреБрди: рдЕрд╕рд╛рдЗрди рдЧрд░реНрджрд╛ ColumnHeaderPressedCurrentState рдорд╛рдирд╣рд░реВ рдЭреВрдЯрд╛.

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

рд╣рд╛рдореАрд▓реЗ рджреЗрдЦреНрди рд╕рдХреНрдЫреМрдВ, PVS-Studio рд╕реНрдерд┐рд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдХрд▓рд╛рдИ рддрдкрд╛рдИрдВрдХреЛ TeamCity рдкрд░рд┐рдпреЛрдЬрдирд╛рдорд╛ тАЛтАЛрдПрдХреАрдХреГрдд рдЧрд░реНрди рдПрдХрджрдо рд╕рд░рд▓ рдЫред рдпреЛ рдЧрд░реНрди, рдпреЛ рдХреЗрд╡рд▓ рдПрдХ рд╕рд╛рдиреЛ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рдлрд╛рдЗрд▓ рд▓реЗрдЦреНрди рдкрд░реНрдпрд╛рдкреНрдд рдЫред рдХреЛрдб рдЬрд╛рдБрдЪ рдЧрд░реНрдирд╛рд▓реЗ рддрдкрд╛рдИрдВрд▓рд╛рдИ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдкрдЫрд┐ рддреБрд░реБрдиреНрддреИ рд╕рдорд╕реНрдпрд╛рд╣рд░реВ рдкрд╣рд┐рдЪрд╛рди рдЧрд░реНрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреЗрдЫ, рдЬрд╕рд▓реЗ рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рд╣рдЯрд╛рдЙрди рдорджреНрджрдд рдЧрд░реНрдиреЗрдЫ рдЬрдм рдкрд░рд┐рд╡рд░реНрддрдирд╣рд░реВрдХреЛ рдЬрдЯрд┐рд▓рддрд╛ рд░ рд▓рд╛рдЧрдд рдЕрдЭреИ рдХрдо рдЫред

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

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди