рдкреАрд╡реНрд╣реАрдПрд╕-рд╕реНрдЯреБрдбрд┐рдУ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рд╡рд╛рдкрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╕рд░реНрд╡рд╛рдд рд╡рд░реНрддрдорд╛рди рдкрд░рд┐рд╕реНрдерд┐рддреАрдВрдкреИрдХреА рдПрдХ рдореНрд╣рдгрдЬреЗ рддреНрдпрд╛рдЪреЗ рд╕реАрдЖрдп рд╕рд┐рд╕реНрдЯрдорд╕рд╣ рдПрдХрддреНрд░реАрдХрд░рдг. рдЖрдгрд┐ рдЬрд░реА PVS-рд╕реНрдЯреБрдбрд┐рдУ рдкреНрд░рдХрд▓реНрдкрд╛рдЪреЗ рдЬрд╡рд│рдЬрд╡рд│ рдХреЛрдгрддреНрдпрд╛рд╣реА рд╕рддрдд рдПрдХреАрдХрд░рдг рдкреНрд░рдгрд╛рд▓реАрдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдлрдХреНрдд рдХрд╛рд╣реА рдХрдорд╛рдВрдбреНрд╕рдордзреНрдпреЗ рддрдпрд╛рд░ рдХреЗрд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ, рддрд░реАрд╣реА рдЖрдореНрд╣реА рд╣реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЖрдгрдЦреА рд╕реЛрдпреАрд╕реНрдХрд░ рдмрдирд╡рдгреЗ рд╕реБрд░реВ рдареЗрд╡рддреЛ. рдкреАрд╡реНрд╣реАрдПрд╕-рд╕реНрдЯреБрдбрд┐рдУрд▓рд╛ рдЖрддрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдЖрдЙрдЯрдкреБрдЯ рдЯреАрдорд╕рд┐рдЯреА - рдЯреАрдорд╕рд┐рдЯреА рдЗрдиреНрд╕реНрдкреЗрдХреНрд╢рди рдкреНрд░рдХрд╛рд░рд╛рд╕рд╛рдареА рдлреЙрд░рдореЕрдЯрдордзреНрдпреЗ рд░реВрдкрд╛рдВрддрд░рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╕рдорд░реНрдерди рдЖрд╣реЗ. рддреЗ рдХрд╕реЗ рдХрд╛рд░реНрдп рдХрд░рддреЗ рддреЗ рдкрд╛рд╣реВрдпрд╛.
рд╡рд╛рдкрд░рд▓реЗрд▓реНрдпрд╛ рд╕реЙрдлреНрдЯрд╡реЗрдЕрд░рдЪреА рдорд╛рд╣рд┐рддреА
рдЕрднреНрдпрд╛рд╕рд╛рдзреАрди рдкреНрд░рдХрд▓реНрдкрд╛рдЪреА рдорд╛рд╣рд┐рддреА
рдЪрд▓рд╛ рд╣реА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдПрдХрд╛ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЙрджрд╛рд╣рд░рдгрд╛рд╡рд░ рд╡рд╛рдкрд░реВрди рдкрд╛рд╣реВ - OpenRCT2 рдкреНрд░рдХрд▓реНрдкрд╛рдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реВрдпрд╛.
рд╕рдорд╛рдпреЛрдЬрди
рд╡реЗрд│ рд╡рд╛рдЪрд╡рдгреНрдпрд╛рд╕рд╛рдареА, рдореА рдХрджрд╛рдЪрд┐рдд рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╡рдЧрд│реЗрди рдЖрдгрд┐ рдорд╛рдЭреНрдпрд╛ рд╕рдВрдЧрдгрдХрд╛рд╡рд░ рдЯреАрдорд╕рд┐рдЯреА рд╕рд░реНрд╡реНрд╣рд░ рдЪрд╛рд▓реВ рдЕрд╕рд▓реНрдпрд╛рдкрд╛рд╕реВрди рд╕реБрд░реВ рдХрд░реЗрди. рдЖрдореНрд╣рд╛рд▓рд╛ рдпреЗрдереЗ рдЬрд╛рд╡реЗ рд▓рд╛рдЧреЗрд▓: рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯ:{рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рди рдкреНрд░рдХреНрд░рд┐рдпреЗрджрд░рдореНрдпрд╛рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреЗрд▓реЗрд▓реЗ рдкреЛрд░реНрдЯ} (рдорд╛рдЭреНрдпрд╛ рдмрд╛рдмрддреАрдд, рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯ:9090) рдЖрдгрд┐ рдЕрдзрд┐рдХреГрддрддрд╛ рдбреЗрдЯрд╛ рдкреНрд░рд╡рд┐рд╖реНрдЯ рдХрд░рд╛. рдЖрдд рдЧреЗрд▓реНрдпрд╛рдирдВрддрд░ рдЖрдордЪреЗ рд╕реНрд╡рд╛рдЧрдд рд╣реЛрдИрд▓:
рдкреНрд░реЛрдЬреЗрдХреНрдЯ рддрдпрд╛рд░ рдХрд░рд╛ рдмрдЯрдгрд╛рд╡рд░ рдХреНрд▓рд┐рдХ рдХрд░рд╛. рдкреБрдвреЗ, рд╡реНрдпрдХреНрддрд┐рдЪрд▓рд┐рддрдкрдгреЗ рдирд┐рд╡рдбрд╛ рдЖрдгрд┐ рдлреАрд▓реНрдб рднрд░рд╛.
рдмрдЯрдг рджрд╛рдмрд▓реНрдпрд╛рдирдВрддрд░ рддрдпрд╛рд░ рдХрд░рд╛, рдЖрдореНрд╣рд╛рд▓рд╛ рд╕реЗрдЯрд┐рдВрдЧреНрдЬрд╕рд╣ рд╡рд┐рдВрдбреЛрджреНрд╡рд╛рд░реЗ рд╕реНрд╡рд╛рдЧрдд рдХреЗрд▓реЗ рдЬрд╛рддреЗ.
рдЪрд▓рд╛ рдХреНрд▓рд┐рдХ рдХрд░реВрдпрд╛ рдмрд┐рд▓реНрдб рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рддрдпрд╛рд░ рдХрд░рд╛.
рдлреАрд▓реНрдб рднрд░рд╛ рдЖрдгрд┐ рдХреНрд▓рд┐рдХ рдХрд░рд╛ рддрдпрд╛рд░ рдХрд░рд╛. рдЖрдореНрд╣реА рддреБрдореНрд╣рд╛рд▓рд╛ рдЖрд╡реГрддреНрддреА рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рдгрд╛рд▓реА рдирд┐рд╡рдбрдгреНрдпрд╛рд╕ рд╕рд╛рдВрдЧрдгрд╛рд░реА рд╡рд┐рдВрдбреЛ рдкрд╛рд╣рддреЛ. рд╕реНрд░реЛрдд рдЖрдзреАрдЪ рд╕реНрдерд╛рдирд┐рдХ рдкрд╛рддрд│реАрд╡рд░ рдЕрд╕рд▓реНрдпрд╛рдиреЗ, рдХреНрд▓рд┐рдХ рдХрд░рд╛ рд╡рдЧрд│рд╛.
рд╢реЗрд╡рдЯреА, рдЖрдореНрд╣реА рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗрдЯрд┐рдВрдЧреНрдЬрд╡рд░ рдЬрд╛рдК.
рдЕрд╕реЗрдВрдмреНрд▓реА рд╕реНрдЯреЗрдкреНрд╕ рдЬреЛрдбреВрдпрд╛, рд╣реЗ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдХреНрд▓рд┐рдХ рдХрд░рд╛: рдмрд┐рд▓реНрдб рд╕реНрдЯреЗрдкреНрд╕ -> рдмрд┐рд▓реНрдб рд╕реНрдЯреЗрдк рдЬреЛрдбрд╛.
рдпреЗрдереЗ рдЖрдореНрд╣реА рдирд┐рд╡рдбрддреЛ:
- рд░рдирд░ рдкреНрд░рдХрд╛рд░ -> рдХрдорд╛рдВрдб рд▓рд╛рдЗрди
- рдЪрд╛рд▓рд╡рд╛ -> рд╕рд╛рдиреБрдХреВрд▓ рд╕реНрдХреНрд░рд┐рдкреНрдЯ
рдЖрдореНрд╣реА рдкреНрд░рдХрд▓реНрдк рд╕рдВрдХрд▓рдирд╛рджрд░рдореНрдпрд╛рди рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдгрд╛рд░ рдЕрд╕рд▓реНрдпрд╛рдиреЗ, рдЕрд╕реЗрдВрдмрд▓реА рдЖрдгрд┐ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдПрдХ рдкрд╛рдКрд▓ рдЕрд╕рд▓реЗ рдкрд╛рд╣рд┐рдЬреЗ, рдореНрд╣рдгреВрди рдлреАрд▓реНрдб рднрд░рд╛ рд╕рд╛рдиреБрдХреВрд▓ рд╕реНрдХреНрд░рд┐рдкреНрдЯ:
рдЖрдореНрд╣реА рдирдВрддрд░ рд╡реИрдпрдХреНрддрд┐рдХ рдЪрд░рдг рдкрд╛рд╣реВ. рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рд▓реЛрдб рдХрд░рдгреЗ, рдкреНрд░рдХрд▓реНрдк рдПрдХрддреНрд░ рдХрд░рдгреЗ, рддреНрдпрд╛рдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдгреЗ, рдЕрд╣рд╡рд╛рд▓ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рдгреЗ рдЖрдгрд┐ рддреНрдпрд╛рдЪреЗ рд╕реНрд╡рд░реВрдкрди рдХрд░рдгреЗ рдпрд╛рд╕рд╛рдареА рдХреЛрдбрдЪреНрдпрд╛ рдлрдХреНрдд рдЕрдХрд░рд╛ рдУрд│реА рд▓рд╛рдЧрддрд╛рдд рд╣реЗ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ рдЖрд╣реЗ.
рд╢реЗрд╡рдЯрдЪреА рдЧреЛрд╖реНрдЯ рдореНрд╣рдгрдЬреЗ рдкрд░реНрдпрд╛рд╡рд░рдг рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓реНрд╕ рд╕реЗрдЯ рдХрд░рдгреЗ, рдЬреЗ рдореА рддреНрдпрд╛рдВрдЪреА рд╡рд╛рдЪрдиреАрдпрддрд╛ рд╕реБрдзрд╛рд░рдгреНрдпрд╛рдЪреЗ рдХрд╛рд╣реА рдорд╛рд░реНрдЧ рд╕рд╛рдВрдЧрд┐рддрд▓реЗ рдЖрд╣реЗрдд. рд╣реЗ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдЪрд▓рд╛ рдкреБрдвреЗ рдЬрд╛рдКрдпрд╛: рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕ -> рдирд╡реАрди рдкреЕрд░рд╛рдореАрдЯрд░ рдЬреЛрдбрд╛ рдЖрдгрд┐ рддреАрди рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓реНрд╕ рдЬреЛрдбрд╛:
рддреБрдореНрд╣рд╛рд▓рд╛ рдлрдХреНрдд рдмрдЯрдг рджрд╛рдмрд╛рдпрдЪреЗ рдЖрд╣реЗ рдЪрд╛рд▓рд╡рд╛ рд╡рд░рдЪреНрдпрд╛ рдЙрдЬрд╡реНрдпрд╛ рдХреЛрдкрд░реНрдпрд╛рдд. рдкреНрд░рдХрд▓реНрдк рдПрдХрддреНрд░ рдЖрдгрд┐ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗрд▓реЗ рдЬрд╛рдд рдЕрд╕рддрд╛рдирд╛, рдореА рддреБрдореНрд╣рд╛рд▓рд╛ рд╕реНрдХреНрд░рд┐рдкреНрдЯрдмрджреНрджрд▓ рд╕рд╛рдВрдЧреЗрди.
рдереЗрдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯ
рдкреНрд░рдердо, рдЖрдореНрд╣рд╛рд▓рд╛ рдирд╡реАрдирддрдо 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"
рджрд░рдореНрдпрд╛рди, рдкреНрд░рдХрд▓реНрдкрд╛рдЪреЗ рдЕрд╕реЗрдВрдмреНрд▓реА рдЖрдгрд┐ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдпрд╢рд╕реНрд╡реАрд░рд┐рддреНрдпрд╛ рдкреВрд░реНрдг рдЭрд╛рд▓реЗ рдЖрд╣реЗ, рдЖрдореНрд╣реА рдЯреЕрдмрд╡рд░ рдЬрд╛рдК рд╢рдХрддреЛ рдкреНрд░рдХрд▓реНрдк рдЖрдгрд┐ рдпрд╛рдЪреА рдЦрд╛рддреНрд░реА рдХрд░рд╛.
рдЖрддрд╛ рд╡рд░ рдХреНрд▓рд┐рдХ рдХрд░реВрдпрд╛ рдПрдХреВрдг рддрдкрд╛рд╕рдгреАрд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдЕрд╣рд╡рд╛рд▓ рдкрд╛рд╣рдгреНрдпрд╛рд╕рд╛рдареА рдЬрд╛:
рдЪреЗрддрд╛рд╡рдгреА рдбрд╛рдпрдЧреНрдиреЛрд╕реНрдЯрд┐рдХ рдирд┐рдпрдо рдХреНрд░рдорд╛рдВрдХрд╛рдВрдиреБрд╕рд╛рд░ рдЧрдЯрдмрджреНрдз рдХреЗрд▓реНрдпрд╛ рдЖрд╣реЗрдд. рдХреЛрдбрдордзреВрди рдиреЗрд╡реНрд╣рд┐рдЧреЗрдЯ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рддреБрдореНрд╣рд╛рд▓рд╛ рдЪреЗрддрд╛рд╡рдгреАрд╕рд╣ рд▓рд╛рдЗрди рдирдВрдмрд░рд╡рд░ рдХреНрд▓рд┐рдХ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рд╡рд░рдЪреНрдпрд╛ рдЙрдЬрд╡реНрдпрд╛ рдХреЛрдкрд░реНтАНрдпрд╛рддреАрд▓ рдкреНрд░рд╢реНрдирдЪрд┐рдиреНрд╣рд╛рд╡рд░ рдХреНрд▓рд┐рдХ рдХреЗрд▓реНрдпрд╛рдиреЗ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдЧрджрдкрддреНрд░рд╛рдВрд╕рд╣ рдПрдХ рдирд╡реАрди рдЯреЕрдм рдЙрдШрдбреЗрд▓. рддреБрдореНрд╣реА рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдЪреЗрддрд╛рд╡рдгреАрд╕рд╣ рд▓рд╛рдЗрди рдХреНрд░рдорд╛рдВрдХрд╛рд╡рд░ рдХреНрд▓рд┐рдХ рдХрд░реВрди рдХреЛрдбрджреНрд╡рд╛рд░реЗ рджреЗрдЦреАрд▓ рдиреЗрд╡реНрд╣рд┐рдЧреЗрдЯ рдХрд░реВ рд╢рдХрддрд╛. рд╡рд╛рдкрд░рддрд╛рдирд╛ рд░рд┐рдореЛрдЯ рд╕рдВрдЧрдгрдХрд╛рд╡рд░реВрди рдиреЗрд╡реНрд╣рд┐рдЧреЗрд╢рди рд╢рдХреНрдп рдЖрд╣реЗ 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)
{
....
}
....
}
рдЪрд▓рд╛ рдЬрд╡рд│реВрди рдмрдШреВрдпрд╛. рдЕрднрд┐рд╡реНрдпрдХреНрддреА рдкреНрд░рддрд┐рдорд╛рджрд┐рд╢рд╛/8 рдЕрд╕рддреНрдп рдЕрд╕реЗрд▓ рддрд░ рдкреНрд░рддрд┐рдорд╛ рджрд┐рд╢рд╛ -7 рддреЗ 7 рдЪреНрдпрд╛ рд╢реНрд░реЗрдгреАрдд рдЖрд╣реЗ. рджреБрд╕рд░рд╛ рднрд╛рдЧ: (imageDirection / 8) != 3 рдЪреЗрдХ рдкреНрд░рддрд┐рдорд╛ рджрд┐рд╢рд╛ рд╢реНрд░реЗрдгреАрдмрд╛рд╣реЗрд░ рдЕрд╕рд▓реНрдпрд╛рдмрджреНрджрд▓: рдЕрдиреБрдХреНрд░рдореЗ -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;
....
}
....
}
рд╣рд╛ рдХреЛрдб рддреБрдХрдбрд╛ рдмрд╣реБрдзрд╛ рд╡рд┐рдШрдЯрди рдХрд░реВрди рдкреНрд░рд╛рдкреНрдд рдЭрд╛рд▓рд╛ рд╣реЛрддрд╛. рдордЧ, рдмрд╛рдХреАрдЪреНрдпрд╛ рдЯрд┐рдкреНрдкрдгреАрдиреБрд╕рд╛рд░, рдиреЙрди-рд╡рд░реНрдХрд┐рдВрдЧ рдХреЛрдбрдЪрд╛ рднрд╛рдЧ рдХрд╛рдвреВрди рдЯрд╛рдХрд▓рд╛ рдЧреЗрд▓рд╛. рдорд╛рддреНрд░, рдЕрдЬреВрди рдХрд╛рд╣реА рдСрдкрд░реЗрд╢рдиреНрд╕ рдмрд╛рдХреА рдЖрд╣реЗрдд 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();
}
}
рдХреЛрдб рдЕрдЧрджреА рд╡рд┐рдЪрд┐рддреНрд░ рджрд┐рд╕рдд рдЖрд╣реЗ. рдорд▓рд╛ рдЕрд╕реЗ рджрд┐рд╕рддреЗ рдХреА рдПрдХрддрд░ рдХрдВрдбрд┐рд╢рдирдордзреНрдпреЗ рдХрд┐рдВрд╡рд╛ рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓ рдкреБрдиреНрд╣рд╛ рдирд┐рдпреБрдХреНрдд рдХрд░рддрд╛рдирд╛ рдЯрд╛рдпрдкрд┐рдВрдЧ рдЭрд╛рд▓реА рд╣реЛрддреА рдХреЙрд▓рдорд╣реЗрдбрд░ рдкреНрд░реЗрд╕реНрдб рдХрд░рдВрдЯ рд╕реНрдЯреЗрдЯ рдореВрд▓реНрдпреЗ рдЦреЛрдЯреЗ.
рдирд┐рд╖реНрдХрд░реНрд╖
рдЬрд╕реЗ рдЖрдкрдг рдкрд╛рд╣реВ рд╢рдХрддреЛ, рдЖрдкрд▓реНрдпрд╛ рдЯреАрдорд╕рд┐рдЯреА рдкреНрд░реЛрдЬреЗрдХреНрдЯрдордзреНрдпреЗ PVS-Studio рд╕реНрдЯреЕрдЯрд┐рдХ рдЕреЕрдирд╛рд▓рд╛рдпрдЭрд░ рд╕рдорд╛рдХрд▓рд┐рдд рдХрд░рдгреЗ рдЕрдЧрджреА рд╕реЛрдкреЗ рдЖрд╣реЗ. рд╣реЗ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдлрдХреНрдд рдПрдХ рд▓рд╣рд╛рди рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдлрд╛рдЗрд▓ рд▓рд┐рд╣рд┐рдгреЗ рдкреБрд░реЗрд╕реЗ рдЖрд╣реЗ. рдХреЛрдб рддрдкрд╛рд╕рдгреЗ рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдЕрд╕реЗрдВрдмреНрд▓реАрдирдВрддрд░ рд▓рдЧреЗрдЪ рд╕рдорд╕реНрдпрд╛ рдУрд│рдЦрдгреНрдпрд╛рд╕ рдЕрдиреБрдорддреА рджреЗрдИрд▓, рдЬреЗ рдЬрдЯрд┐рд▓рддрд╛ рдЖрдгрд┐ рдмрджрд▓рд╛рдВрдЪреА рдХрд┐рдВрдордд рдЕрджреНрдпрд╛рдк рдХрдореА рдЕрд╕рддрд╛рдирд╛ рддреНрдпрд╛рдВрдирд╛ рджреВрд░ рдХрд░рдгреНрдпрд╛рдд рдорджрдд рдХрд░реЗрд▓.
рдЖрдкрдг рд╣рд╛ рд▓реЗрдЦ рдЗрдВрдЧреНрд░рдЬреА рднрд╛рд╖рд┐рдХ рдкреНрд░реЗрдХреНрд╖рдХрд╛рдВрд╕рд╣ рд╕рд╛рдорд╛рдпрд┐рдХ рдХрд░реВ рдЗрдЪреНрдЫрд┐рдд рдЕрд╕рд▓реНрдпрд╛рд╕, рдХреГрдкрдпрд╛ рднрд╛рд╖рд╛рдВрддрд░ рджреБрд╡рд╛ рд╡рд╛рдкрд░рд╛: рд╡реНрд▓рд╛рджрд┐рд╕реНрд▓рд╛рд╡ рд╕реНрдЯреЛрд▓реНрдпрд╛рд░реЛрд╡реНрд╣.
рд╕реНрддреНрд░реЛрдд: www.habr.com