PVS-рд╕реНрдЯреБрдбрд┐рдпреЛ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдкреНрд░рдпреЛрдЧрдХреЛ рд▓рд╛рдЧрд┐ рд╕рдмреИрднрдиреНрджрд╛ рд╣рд╛рд▓рдХреЛ рдкрд░рд┐рджреГрд╢реНрдпрд╣рд░реВ рдордзреНрдпреЗ рдПрдХ CI рдкреНрд░рдгрд╛рд▓реАрд╣рд░реВрд╕рдБрдЧ рдпрд╕рдХреЛ рдПрдХреАрдХрд░рдг рд╣реЛред рд░ рдпрджреНрдпрдкрд┐ рд▓рдЧрднрдЧ рдХреБрдиреИ рдкрдирд┐ рдирд┐рд░рдиреНрддрд░ рдПрдХреАрдХрд░рдг рдкреНрд░рдгрд╛рд▓реАрдмрд╛рдЯ PVS-рд╕реНрдЯреБрдбрд┐рдпреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛рдХреЛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗрд╣реА рдЖрджреЗрд╢рд╣рд░реВрдорд╛ рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ, рд╣рд╛рдореА рдпреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛рд▓рд╛рдИ рдЕрдЭ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛рдЙрди рдЬрд╛рд░реА рд░рд╛рдЦреНрдЫреМрдВред PVS-рд╕реНрдЯреБрдбрд┐рдпреЛрд╕рдБрдЧ рдЕрдм рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдЖрдЙрдЯрдкреБрдЯрд▓рд╛рдИ TeamCity - TeamCity Inspections Type рдХреЛ рдврд╛рдБрдЪрд╛рдорд╛ рд░реВрдкрд╛рдиреНрддрд░рдг рдЧрд░реНрди рд╕рдорд░реНрдерди рдЫред рдпреЛ рдХрд╕рд░реА рдХрд╛рдо рдЧрд░реНрдЫ рд╣реЗрд░реМрдВред
рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдПрдХреЛ рд╕рдлреНрдЯрд╡реЗрдпрд░ рдмрд╛рд░реЗ рдЬрд╛рдирдХрд╛рд░реА
рдЕрдзреНрдпрдпрди рдЕрдиреНрддрд░реНрдЧрдд рдкрд░рд┐рдпреЛрдЬрдирд╛ рдмрд╛рд░реЗ рдЬрд╛рдирдХрд╛рд░реА
рдпреЛ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛рд▓рд╛рдИ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЙрджрд╛рд╣рд░рдгрдорд╛ рдкреНрд░рдпрд╛рд╕ рдЧрд░реМрдВ - OpenRCT2 рдкрд░рд┐рдпреЛрдЬрдирд╛рдХреЛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЧрд░реМрдВред
рд╕рдорд╛рдпреЛрдЬрди
рд╕рдордп рдмрдЪрдд рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐, рдо рд╕рдореНрднрд╡рддрдГ рд╕реНрдерд╛рдкрдирд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЫреЛрдбреНрдиреЗрдЫреБ рд░ рдореЗрд░реЛ рдХрдореНрдкреНрдпреБрдЯрд░рдорд╛ TeamCity рд╕рд░реНрднрд░ рдЪрд▓рд┐рд░рд╣реЗрдХреЛ рдХреНрд╖рдгрдмрд╛рдЯ рд╕реБрд░реБ рдЧрд░реНрдиреЗрдЫреБред рд╣рд╛рдореАрд▓реЗ рдорд╛ рдЬрд╛рдиреБ рдкрд░реНрдЫ: localhost:{port specified while installation process} (рдореЗрд░реЛ рдХреЗрд╕рдорд╛, localhost:9090) рд░ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдбреЗрдЯрд╛ рдкреНрд░рд╡рд┐рд╖реНрдЯ рдЧрд░реНрдиреБрд╣реЛрд╕реНред рдкреНрд░рд╡реЗрд╢ рдЧрд░реЗрдкрдЫрд┐ рд╣рд╛рдореАрд▓рд╛рдИ рд╕реНрд╡рд╛рдЧрдд рдЧрд░рд┐рдиреЗрдЫ:
Create Project рдмрдЯрдирдорд╛ рдХреНрд▓рд┐рдХ рдЧрд░реНрдиреБрд╣реЛрд╕реНред рдЕрд░реНрдХреЛ, рдореНрдпрд╛рдиреБрдЕрд▓ рд░реВрдкрдорд╛ рдЪрдпрди рдЧрд░реНрдиреБрд╣реЛрд╕реН рд░ рдХреНрд╖реЗрддреНрд░рд╣рд░реВ рднрд░реНрдиреБрд╣реЛрд╕реНред
рдмрдЯрди рдерд┐рдЪреЗ рдкрдЫрд┐ рд╕рд┐рд░реНрдЬрдирд╛, рд╣рд╛рдореАрд▓рд╛рдИ рд╕реЗрдЯрд┐рдЩреНрд╣рд░реВ рд╕рд╣рд┐рддрдХреЛ рд╡рд┐рдиреНрдбреЛрджреНрд╡рд╛рд░рд╛ рд╕реНрд╡рд╛рдЧрдд рдЧрд░рд┐рдиреНрдЫред
рдХреНрд▓рд┐рдХ рдЧрд░реМрдВ рдирд┐рд░реНрдорд╛рдг рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН.
рдлрд┐рд▓реНрдбрд╣рд░реВ рднрд░реНрдиреБрд╣реЛрд╕реН рд░ рдХреНрд▓рд┐рдХ рдЧрд░реНрдиреБрд╣реЛрд╕реН рд╕рд┐рд░реНрдЬрдирд╛ред рд╣рд╛рдореА рддрдкрд╛рдИрдВрд▓рд╛рдИ рдПрдЙрдЯрд╛ рд╕рдВрд╕реНрдХрд░рдг рдирд┐рдпрдиреНрддреНрд░рдг рдкреНрд░рдгрд╛рд▓реА рдЪрдпрди рдЧрд░реНрди рд╕реЛрдзреНрдиреЗ рд╡рд┐рдиреНрдбреЛ рджреЗрдЦреНрдЫреМрдВред рд╕реНрд░реЛрддрд╣рд░реВ рдкрд╣рд┐рд▓реЗ рдиреИ рд╕реНрдерд╛рдиреАрдп рд░реВрдкрдорд╛ рдЕрд╡рд╕реНрдерд┐рдд рднрдПрдХреЛрд▓реЗ, рдХреНрд▓рд┐рдХ рдЧрд░реНрдиреБрд╣реЛрд╕реН рдЫреЛрдбреНрдиреБрд╣реЛрд╕реН.
рдЕрдиреНрддрдорд╛, рд╣рд╛рдореА рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реЗрдЯрд┐рдЩрд╣рд░реВрдорд╛ рдЬрд╛рдиреНрдЫреМрдВред
рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдЪрд░рдгрд╣рд░реВ рдердкреМрдВ, рдпреЛ рдЧрд░реНрди рдХреНрд▓рд┐рдХ рдЧрд░реНрдиреБрд╣реЛрд╕реН: рдирд┐рд░реНрдорд╛рдг рдЪрд░рдгрд╣рд░реВ -> рдирд┐рд░реНрдорд╛рдг рдЪрд░рдг рдердкреНрдиреБрд╣реЛрд╕реН.
рдпрд╣рд╛рдБ рд╣рд╛рдореА рдЫрдиреМрдЯ рдЧрд░реНрдЫреМрдВ:
- рдзрд╛рд╡рдХ рдкреНрд░рдХрд╛рд░ -> рдХрдорд╛рдгреНрдб рд▓рд╛рдЗрди
- рдЪрд▓рд╛рдЙрдиреБрд╣реЛрд╕реН -> рдЕрдиреБрдХреВрд▓рди рд▓рд┐рдкрд┐
рд╣рд╛рдореАрд▓реЗ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕рдВрдХрд▓рдирдХреЛ рдХреНрд░рдордорд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЧрд░реНрдиреЗ рднрдПрдХрд╛рд▓реЗ, рд╡рд┐рдзрд╛рдирд╕рднрд╛ рд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдПрдХ рдЪрд░рдг рд╣реБрдиреБрдкрд░реНрдЫ, рддреНрдпрд╕реИрд▓реЗ рдлрд┐рд▓реНрдб рднрд░реНрдиреБрд╣реЛрд╕реНред рдЕрдиреБрдХреВрд▓ рд╕реНрдХреНрд░рд┐рдкреНрдЯ:
рд╣рд╛рдореА рд╡реНрдпрдХреНрддрд┐рдЧрдд рдЪрд░рдгрд╣рд░реВ рдкрдЫрд┐ рд╣реЗрд░реНрдиреЗрдЫреМрдВред рдпреЛ рдорд╣рддреНрддреНрд╡рдкреВрд░реНрдг рдЫ рдХрд┐ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рд▓реЛрдб рдЧрд░реНрди, рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕рдВрдпреЛрдЬрди рдЧрд░реНрди, рдпрд╕рдХреЛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЧрд░реНрди, рд░рд┐рдкреЛрд░реНрдЯ рдЖрдЙрдЯрдкреБрдЯ рдЧрд░реНрди рд░ рдпрд╕рд▓рд╛рдИ рдврд╛рдБрдЪрд╛рдорд╛ рдХреЛрдбрдХреЛ рдПрдШрд╛рд░ рд▓рд╛рдЗрдирд╣рд░реВ рдорд╛рддреНрд░ рд▓рд┐рдиреНрдЫред
рд╣рд╛рдореАрд▓реЗ рдЧрд░реНрдиреБрдкрд░реНрдиреЗ рдЕрдиреНрддрд┐рдо рдХреБрд░рд╛ рднрдиреЗрдХреЛ рд╡рд╛рддрд╛рд╡рд░рдг рдЪрд░рд╣рд░реВ рд╕реЗрдЯ рдЧрд░реНрдиреБ рд╣реЛ, рдЬреБрди рдореИрд▓реЗ рддрд┐рдиреАрд╣рд░реВрдХреЛ рдкрдардиреАрдпрддрд╛ рд╕реБрдзрд╛рд░ рдЧрд░реНрдиреЗ рдХреЗрд╣реА рддрд░рд┐рдХрд╛рд╣рд░реВ рд░реЗрдЦрд╛рдВрдХрд┐рдд рдЧрд░реЗрдХреЛ рдЫреБред рдпреЛ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐, рдЕрдЧрд╛рдбрд┐ рдмрдвреМрдВ: рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░рд╣рд░реВ -> рдирдпрд╛рдБ рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░ рдердкреНрдиреБрд╣реЛрд╕реН рд░ рддреАрди рдЪрд░ рдердкреНрдиреБрд╣реЛрд╕реН:
рддрдкрд╛рдИрд▓реЗ рдЧрд░реНрдиреБрдкрд░реНрдиреЗ рднрдиреЗрдХреЛ рдмрдЯрди рдерд┐рдЪреНрдиреБ рд╣реЛ рдЪрд▓рд╛рдЙрдиреБрд╣реЛрд╕реН рдорд╛рдерд┐рд▓реНрд▓реЛ рджрд╛рдпрд╛рдБ рдХреБрдирд╛рдорд╛ред рдЬрдм рдкрд░рд┐рдпреЛрдЬрдирд╛ рднреЗрд▓рд╛ рд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рднрдЗрд░рд╣реЗрдХреЛ рдЫ, рдо рддрдкрд╛рдИрдВрд▓рд╛рдИ рд╕реНрдХреНрд░рд┐рдкреНрдЯрдХреЛ рдмрд╛рд░реЗрдорд╛ рдмрддрд╛рдЙрдиреЗрдЫреБред
рдкреНрд░рддреНрдпрдХреНрд╖ рд╕реНрдХреНрд░рд┐рдкреНрдЯ
рдкрд╣рд┐рд▓реЗ, рд╣рд╛рдореАрд▓реЗ рдирд╡реАрдирддрдо 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"
рдпрд╕ рдмреАрдЪрдорд╛, рдкрд░рд┐рдпреЛрдЬрдирд╛рдХреЛ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд╕рдореНрдкрдиреНрди рднрдПрдХреЛ рдЫ, рд╣рд╛рдореА рдЯреНрдпрд╛рдмрдорд╛ рдЬрд╛рди рд╕рдХреНрдЫреМрдВ рдкрд░рд┐рдпреЛрдЬрдирд╛рд╣рд░реБ ╨╕ ╤Г╨▒╨╡╨┤╨╕╤В╤М╤Б╤П ╨▓ ╤Н╤В╨╛╨╝ред
рдЕрдм рдХреНрд▓рд┐рдХ рдЧрд░реМрдВ рдирд┐рд░реАрдХреНрд╖рдг рдХреБрд▓рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рд░рд┐рдкреЛрд░реНрдЯ рд╣реЗрд░реНрди рдЬрд╛рдиреБрд╣реЛрд╕реН:
рдЪреЗрддрд╛рд╡рдиреАрд╣рд░реВ рдбрд╛рдпрдЧреНрдиреЛрд╕реНрдЯрд┐рдХ рдирд┐рдпрдо рд╕рдВрдЦреНрдпрд╛рд╣рд░реВрджреНрд╡рд╛рд░рд╛ рд╕рдореВрд╣рдмрджреНрдз рдЧрд░рд┐рдПрдХрд╛ рдЫрдиреНред рдХреЛрдб рдорд╛рд░реНрдлрдд рдиреЗрднрд┐рдЧреЗрдЯ рдЧрд░реНрди, рддрдкрд╛рдИрдВрд▓реЗ рдЪреЗрддрд╛рд╡рдиреАрдХреЛ рд╕рд╛рде рд▓рд╛рдЗрди рдирдореНрдмрд░рдорд╛ рдХреНрд▓рд┐рдХ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред рдорд╛рдерд┐рд▓реНрд▓реЛ рджрд╛рдпрд╛рдБ рдХреБрдирд╛рдорд╛ рд░рд╣реЗрдХреЛ рдкреНрд░рд╢реНрди рдЪрд┐рдиреНрд╣рдорд╛ рдХреНрд▓рд┐рдХ рдЧрд░реНрдирд╛рд▓реЗ рддрдкрд╛рдИрдВрд▓рд╛рдИ рдХрд╛рдЧрдЬрд╛рддрд╕рд╣рд┐рддрдХреЛ рдирдпрд╛рдБ рдЯреНрдпрд╛рдм рдЦреЛрд▓реНрдиреЗрдЫред рддрдкрд╛рдИрдВ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдЪреЗрддрд╛рд╡рдиреАрдХреЛ рд╕рд╛рде рд▓рд╛рдЗрди рдирдореНрдмрд░рдорд╛ рдХреНрд▓рд┐рдХ рдЧрд░реЗрд░ рдХреЛрдб рдорд╛рд░реНрдлрдд рдиреЗрднрд┐рдЧреЗрдЯ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджрд╛ рд░рд┐рдореЛрдЯ рдХрдореНрдкреНрдпреБрдЯрд░рдмрд╛рдЯ рдиреЗрднрд┐рдЧреЗрд╕рди рд╕рдореНрднрд╡ рдЫ SourceTreeRoot рдорд╛рд░реНрдХрд░ред рд╡рд┐рд╢реНрд▓реЗрд╖рдХрдХреЛ рд╕рдЮреНрдЪрд╛рд▓рдирдХреЛ рдпрд╕ рдореЛрдбрдорд╛ рд░реБрдЪрд┐ рд░рд╛рдЦреНрдиреЗ рдЬреЛ рдХреЛрд╣реАрд▓реЗ рд╕рдореНрдмрдиреНрдзрд┐рдд рдЦрдгреНрдбрд╕рдБрдЧ рдЖрдлреВрд▓рд╛рдИ рдкрд░рд┐рдЪрд┐рдд рдЧрд░реНрди рд╕рдХреНрдЫрдиреНред
рд╡рд┐рд╢реНрд▓реЗрд╖рдХрдХреЛ рдирддрд┐рдЬрд╛ рд╣реЗрд░реНрджреИ
рдЕрдм рд╣рд╛рдореАрд▓реЗ рдирд┐рд░реНрдорд╛рдгрд▓рд╛рдИ рдбрд┐рдкреНрд▓реЛрдЗ рд░ рдХрдиреНрдлрд┐рдЧрд░ рдЧрд░рд┐рд╕рдХреЗрдХрд╛ рдЫреМрдВ, рд╣рд╛рдореАрд▓реЗ рд╣реЗрд░рд┐рд░рд╣реЗрдХрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯрдорд╛ рдлреЗрд▓рд╛ рдкрд░реЗрдХрд╛ рдХреЗрд╣реА рд░реЛрдЪрдХ рдЪреЗрддрд╛рд╡рдиреАрд╣рд░реВ рд╣реЗрд░реМрдВред
рдЪреЗрддрд╛рд╡рдиреА N1
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
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
struct RCT12SpriteBase
{
....
uint8_t flags;
....
};
struct rct1_peep : RCT12SpriteBase
{
....
uint8_t flags;
....
};
рдирд┐рд╕реНрд╕рдиреНрджреЗрд╣, рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рд░ рд╡рдВрд╢рдЬрдорд╛ рдЙрд╣реА рдирд╛рдордХреЛ рд╕рд╛рде рдЪрд▓ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджрд╛ рд╕рдзреИрдВ рддреНрд░реБрдЯрд┐ рд╣реБрдБрджреИрдиред рдпрджреНрдпрдкрд┐, рдЗрдирд╣реЗрд░рд┐рдЯреЗрдиреНрд╕ рдЯреЗрдХреНрдиреЛрд▓реЛрдЬреА рдЖрдлреИрд▓реЗ рдорд╛рдиреНрдЫ рдХрд┐ рдЕрднрд┐рднрд╛рд╡рдХ рд╡рд░реНрдЧрдХрд╛ рд╕рдмреИ рдХреНрд╖реЗрддреНрд░рд╣рд░реВ рдмрд╛рд▓ рд╡рд░реНрдЧрдорд╛ рдЕрд╡рд╕реНрдерд┐рдд рдЫрдиреНред рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░реАрдорд╛ рдПрдЙрдЯреИ рдирд╛рдордХреЛ рдХреНрд╖реЗрддреНрд░ рдШреЛрд╖рдгрд╛ рдЧрд░реЗрд░, рд╣рд╛рдореА рдЕрдиреНрдпреЛрд▓ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдЫреМрдВред
рдЪреЗрддрд╛рд╡рдиреА N4
void vehicle_visual_observation_tower(...., int32_t imageDirection, ....)
{
if ((imageDirection / 8) && (imageDirection / 8) != 3)
{
....
}
....
}
рдирдЬрд┐рдХрдмрд╛рдЯ рд╣реЗрд░реМрдВред рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ imageDirection/8 рдпрджрд┐ рдЧрд▓рдд рд╣реБрдиреЗрдЫ рдЫрд╡рд┐ рджрд┐рд╢рд╛ -рен рджреЗрдЦрд┐ рен рд╕рдореНрдордХреЛ рджрд╛рдпрд░рд╛рдорд╛ рдЫред рджреЛрд╕реНрд░реЛ рднрд╛рдЧ: (рдЫрд╡рд┐ рдирд┐рд░реНрджреЗрд╢рди / рео) != рей рдЪреЗрдХ рдЫрд╡рд┐ рджрд┐рд╢рд╛ рджрд╛рдпрд░рд╛ рдмрд╛рд╣рд┐рд░ рднрдПрдХреЛ рдХрд╛рд░рдг: -31 рджреЗрдЦрд┐ -24 рд░ 24 рджреЗрдЦрд┐ 31 рд╕рдореНрдо, рдХреНрд░рдорд╢рдГред рдпрд╕ рддрд░рд┐рдХрд╛рд▓реЗ рдирд┐рд╢реНрдЪрд┐рдд рджрд╛рдпрд░рд╛рдорд╛ рд╕рдорд╛рд╡реЗрд╢рдХреЛ рд▓рд╛рдЧрд┐ рдирдореНрдмрд░рд╣рд░реВ рдЬрд╛рдБрдЪ рдЧрд░реНрди рдорд▓рд╛рдИ рдПрдХрджрдореИ рдЕрдиреМрдареЛ рд▓рд╛рдЧреНрдЫ рд░, рдпрджрд┐ рдХреЛрдбрдХреЛ рдпреЛ рдЯреБрдХреНрд░рд╛рдорд╛ рдХреБрдиреИ рддреНрд░реБрдЯрд┐ рдЫреИрди рднрдиреЗ, рдо рдпреА рд╕рд░реНрддрд╣рд░реВрд▓рд╛рдИ рдердк рд╕реНрдкрд╖реНрдЯ рд╣реБрдирдХреЛ рд▓рд╛рдЧрд┐ рдкреБрди: рд▓реЗрдЦреНрди рд╕рд┐рдлрд╛рд░рд┐рд╕ рдЧрд░реНрджрдЫреБред рдпреЛ рд╕рдВрд╣рд┐рддрд╛ рдкрдвреНрди рд░ рдХрд╛рдпрдо рд░рд╛рдЦреНрдиреЗ рдорд╛рдирд┐рд╕рд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдпрд╕рд▓реЗ рдЬреАрд╡рдирд▓рд╛рдИ рдзреЗрд░реИ рд╕рдЬрд┐рд▓реЛ рдмрдирд╛рдЙрдБрдЫред
рдЪреЗрддрд╛рд╡рдиреА N5
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
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
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
void CustomListView::MouseUp(....)
{
....
if (!ColumnHeaderPressedCurrentState)
{
ColumnHeaderPressed = std::nullopt;
ColumnHeaderPressedCurrentState = false;
Invalidate();
}
}
рдХреЛрдб рдПрдХрджрдо рдЕрдиреМрдареЛ рджреЗрдЦрд┐рдиреНрдЫред рдпреЛ рдорд▓рд╛рдИ рд▓рд╛рдЧреНрджрдЫ рдХрд┐ рддреНрдпрд╣рд╛рдБ рдПрдХ рдЯрд╛рдЗрдкреЛ рдерд┐рдпреЛ рдХрд┐ рд╕рд░реНрддрдорд╛ рд╡рд╛ рдЪрд░ рдкреБрди: рдЕрд╕рд╛рдЗрди рдЧрд░реНрджрд╛ ColumnHeaderPressedCurrentState рдорд╛рдирд╣рд░реВ рдЭреВрдЯрд╛.
рдирд┐рд╖реНрдХрд░реНрд╖рдорд╛
рд╣рд╛рдореАрд▓реЗ рджреЗрдЦреНрди рд╕рдХреНрдЫреМрдВ, PVS-Studio рд╕реНрдерд┐рд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдХрд▓рд╛рдИ рддрдкрд╛рдИрдВрдХреЛ TeamCity рдкрд░рд┐рдпреЛрдЬрдирд╛рдорд╛ тАЛтАЛрдПрдХреАрдХреГрдд рдЧрд░реНрди рдПрдХрджрдо рд╕рд░рд▓ рдЫред рдпреЛ рдЧрд░реНрди, рдпреЛ рдХреЗрд╡рд▓ рдПрдХ рд╕рд╛рдиреЛ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рдлрд╛рдЗрд▓ рд▓реЗрдЦреНрди рдкрд░реНрдпрд╛рдкреНрдд рдЫред рдХреЛрдб рдЬрд╛рдБрдЪ рдЧрд░реНрдирд╛рд▓реЗ рддрдкрд╛рдИрдВрд▓рд╛рдИ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдкрдЫрд┐ рддреБрд░реБрдиреНрддреИ рд╕рдорд╕реНрдпрд╛рд╣рд░реВ рдкрд╣рд┐рдЪрд╛рди рдЧрд░реНрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреЗрдЫ, рдЬрд╕рд▓реЗ рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рд╣рдЯрд╛рдЙрди рдорджреНрджрдд рдЧрд░реНрдиреЗрдЫ рдЬрдм рдкрд░рд┐рд╡рд░реНрддрдирд╣рд░реВрдХреЛ рдЬрдЯрд┐рд▓рддрд╛ рд░ рд▓рд╛рдЧрдд рдЕрдЭреИ рдХрдо рдЫред
рдпрджрд┐ рддрдкрд╛рдЗрдБ рдпреЛ рд▓реЗрдЦ рдЕрдВрдЧреНрд░реЗрдЬреА рдмреЛрд▓реНрдиреЗ рджрд░реНрд╢рдХрд╣рд░реВрд╕рдБрдЧ рд╕рд╛рдЭрд╛ рдЧрд░реНрди рдЪрд╛рд╣рдиреБрд╣реБрдиреНрдЫ рднрдиреЗ, рдХреГрдкрдпрд╛ рдЕрдиреБрд╡рд╛рдж рд▓рд┐рдЩреНрдХ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБрд╣реЛрд╕реН: Vladislav Stolyarovред
рд╕реНрд░реЛрдд: www.habr.com