ΠŸΠ’Π‘-Π‘Ρ‚ΡƒΠ΄ΠΈΠΎ ΠΈ ΠΊΠΎΠ½Ρ‚ΠΈΠ½ΡƒΠΈΡ€Π°Π½Π° ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ˜Π°: Π’Π΅Π°ΠΌΠ¦ΠΈΡ‚ΠΈ. Анализа ΠΏΡ€ΠΎΡ˜Π΅ΠΊΡ‚Π° ОпСн РоллСрЦоастСр Π’ΠΈΡ†ΠΎΠΎΠ½ 2

ΠŸΠ’Π‘-Π‘Ρ‚ΡƒΠ΄ΠΈΠΎ ΠΈ ΠΊΠΎΠ½Ρ‚ΠΈΠ½ΡƒΠΈΡ€Π°Π½Π° ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ˜Π°: Π’Π΅Π°ΠΌΠ¦ΠΈΡ‚ΠΈ. Анализа ΠΏΡ€ΠΎΡ˜Π΅ΠΊΡ‚Π° ОпСн РоллСрЦоастСр Π’ΠΈΡ†ΠΎΠΎΠ½ 2
ЈСдан ΠΎΠ΄ Π½Π°Ρ˜Π°ΠΊΡ‚ΡƒΠ΅Π»Π½ΠΈΡ˜ΠΈΡ… ΡΡ†Π΅Π½Π°Ρ€ΠΈΡ˜Π° Π·Π° ΠΊΠΎΡ€ΠΈΡˆΡ›Π΅ΡšΠ΅ ΠŸΠ’Π‘-Π‘Ρ‚ΡƒΠ΄ΠΈΠΎ Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° јС њСгова ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ˜Π° са ЦИ систСмима. И ΠΈΠ°ΠΊΠΎ сС Π°Π½Π°Π»ΠΈΠ·Π° ΠΏΡ€ΠΎΡ˜Π΅ΠΊΡ‚Π° ΠŸΠ’Π‘-Π‘Ρ‚ΡƒΠ΄ΠΈΠΎ ΠΈΠ· скоро сваког систСма ΠΊΠΎΠ½Ρ‚ΠΈΠ½ΡƒΠΈΡ€Π°Π½Π΅ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ˜Π΅ ΠΌΠΎΠΆΠ΅ ΡƒΠ³Ρ€Π°Π΄ΠΈΡ‚ΠΈ Ρƒ само Π½Π΅ΠΊΠΎΠ»ΠΈΠΊΠΎ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ, ΠΌΠΈ настављамо Π΄Π° овај процСс Ρ‡ΠΈΠ½ΠΈΠΌΠΎ још погоднијим. ΠŸΠ’Π‘-Π‘Ρ‚ΡƒΠ΄ΠΈΠΎ сада ΠΈΠΌΠ° ΠΏΠΎΠ΄Ρ€ΡˆΠΊΡƒ Π·Π° ΠΏΡ€Π΅Ρ‚Π²Π°Ρ€Π°ΡšΠ΅ ΠΈΠ·Π»Π°Π·Π° Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° Ρƒ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Π·Π° Π’Π΅Π°ΠΌΠ¦ΠΈΡ‚ΠΈ - Π’Π΅Π°ΠΌΠ¦ΠΈΡ‚ΠΈ Π˜Π½ΡΠΏΠ΅Ρ†Ρ‚ΠΈΠΎΠ½Ρ Π’ΠΈΠΏΠ΅. Π₯ајдС Π΄Π° Π²ΠΈΠ΄ΠΈΠΌΠΎ ΠΊΠ°ΠΊΠΎ Ρ‚ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½ΠΈΡˆΠ΅.

Π˜Π½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡ˜Π΅ ΠΎ ΠΊΠΎΡ€ΠΈΡˆΡ›Π΅Π½ΠΎΠΌ софтвСру

ΠŸΠ’Π‘-Π‘Ρ‚ΡƒΠ΄ΠΈΠΎ β€” статички Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ Π¦, Π¦++, Π¦# ΠΈ Јава ΠΊΠΎΠ΄Π°, Π΄ΠΈΠ·Π°Ρ˜Π½ΠΈΡ€Π°Π½ Π΄Π° олакша Π·Π°Π΄Π°Ρ‚Π°ΠΊ ΠΏΡ€ΠΎΠ½Π°Π»Π°ΠΆΠ΅ΡšΠ° ΠΈ ΠΈΡΠΏΡ€Π°Π²Ρ™Π°ΡšΠ° Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΡ‚ΠΈΡ… врста Π³Ρ€Π΅ΡˆΠ°ΠΊΠ°. Анализатор сС ΠΌΠΎΠΆΠ΅ користити Π½Π° Виндовс, Π›ΠΈΠ½ΡƒΠΊ ΠΈ ΠΌΠ°Ρ†ΠžΠ‘. Π£ ΠΎΠ²ΠΎΠΌ Ρ‡Π»Π°Π½ΠΊΡƒ Ρ›Π΅ΠΌΠΎ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ користити Π½Π΅ само сам Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€, Π²Π΅Ρ› ΠΈ Π½Π΅ΠΊΠ΅ услуТнС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ΅ ΠΈΠ· њСговС Π΄ΠΈΡΡ‚Ρ€ΠΈΠ±ΡƒΡ†ΠΈΡ˜Π΅.

Π¦Π›ΠœΠΎΠ½ΠΈΡ‚ΠΎΡ€ β€” јС сСрвСр Π·Π° надглСдањС који ΠΏΡ€Π°Ρ‚ΠΈ ΠΏΠΎΠΊΡ€Π΅Ρ‚Π°ΡšΠ΅ ΠΊΠΎΠΌΠΏΠ°Ρ˜Π»Π΅Ρ€Π°. ΠœΠΎΡ€Π° сС ΠΏΠΎΠΊΡ€Π΅Π½ΡƒΡ‚ΠΈ нСпосрСдно ΠΏΡ€Π΅ Π½Π΅Π³ΠΎ ΡˆΡ‚ΠΎ ΠΏΠΎΡ‡Π½Π΅Ρ‚Π΅ Π΄Π° Π³Ρ€Π°Π΄ΠΈΡ‚Π΅ свој ΠΏΡ€ΠΎΡ˜Π΅ΠΊΠ°Ρ‚. Π£ Ρ€Π΅ΠΆΠΈΠΌΡƒ ΡšΡƒΡˆΠΊΠ°ΡšΠ°, сСрвСр Ρ›Π΅ прСсрСсти ΠΏΠΎΠΊΡ€Π΅Ρ‚Π°ΡšΠ΅ свих ΠΏΠΎΠ΄Ρ€ΠΆΠ°Π½ΠΈΡ… ΠΊΠΎΠΌΠΏΠ°Ρ˜Π»Π΅Ρ€Π°. Π’Ρ€Π΅Π΄ΠΈ Π½Π°ΠΏΠΎΠΌΠ΅Π½ΡƒΡ‚ΠΈ Π΄Π° сС овај услуТни ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌ ΠΌΠΎΠΆΠ΅ користити само Π·Π° Π°Π½Π°Π»ΠΈΠ·Ρƒ Π¦/Π¦++ ΠΏΡ€ΠΎΡ˜Π΅ΠΊΠ°Ρ‚Π°.

ΠŸΠ»ΠΎΠ³Π¦ΠΎΠ½Π²Π΅Ρ€Ρ‚Π΅Ρ€ – ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π° для ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚Π°Ρ†ΠΈΠΈ ΠΎΡ‚Ρ‡Ρ‘Ρ‚Π° Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° Π² Ρ€Π°Π·Π½Ρ‹Π΅ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Ρ‹.

Π˜Π½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡ˜Π΅ ΠΎ ΠΏΡ€ΠΎΡ˜Π΅ΠΊΡ‚Ρƒ који сС ΠΏΡ€ΠΎΡƒΡ‡Π°Π²Π°

Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ Π΄Π°Π½Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π½Π° практичСском ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ – ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ OpenRCT2.

ОпСнРЦВ2 - ΠΎΡ‚Π²ΠΎΡ€Π΅Π½Π° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Π° ΠΈΠ³Ρ€Π΅ РоллСрЦоастСр Π’ΠΈΡ†ΠΎΠΎΠ½ 2 (Π Π¦Π’2), ΠΏΡ€ΠΎΡˆΠΈΡ€ΡƒΡ˜ΡƒΡ›ΠΈ јС Π½ΠΎΠ²ΠΈΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π°ΠΌΠ° ΠΈ ΠΈΡΠΏΡ€Π°Π²Ρ™Π°Ρ˜ΡƒΡ›ΠΈ Π³Ρ€Π΅ΡˆΠΊΠ΅. Π˜Π³Ρ€Π° сС Π²Ρ€Ρ‚ΠΈ ΠΎΠΊΠΎ ΠΈΠ·Π³Ρ€Π°Π΄ΡšΠ΅ ΠΈ ΠΎΠ΄Ρ€ΠΆΠ°Π²Π°ΡšΠ° Π·Π°Π±Π°Π²Π½ΠΎΠ³ ΠΏΠ°Ρ€ΠΊΠ° који садрТи воТњС, ΠΏΡ€ΠΎΠ΄Π°Π²Π½ΠΈΡ†Π΅ ΠΈ ΠΎΠ±Ρ˜Π΅ΠΊΡ‚Π΅. Π˜Π³Ρ€Π°Ρ‡ ΠΌΠΎΡ€Π° ΠΏΠΎΠΊΡƒΡˆΠ°Ρ‚ΠΈ Π΄Π° оствари ΠΏΡ€ΠΎΡ„ΠΈΡ‚ ΠΈ ΠΎΠ΄Ρ€ΠΆΠΈ Π΄ΠΎΠ±Ρ€Ρƒ Ρ€Π΅ΠΏΡƒΡ‚Π°Ρ†ΠΈΡ˜Ρƒ ΠΏΠ°Ρ€ΠΊΠ°, Π° Π΄Π° ΠΏΡ€ΠΈΡ‚ΠΎΠΌ Π·Π°Π΄Ρ€ΠΆΠΈ гостС срСћним. ОпСнРЦВ2 Π²Π°ΠΌ ΠΎΠΌΠΎΠ³ΡƒΡ›Π°Π²Π° Π΄Π° ΠΈΠ³Ρ€Π°Ρ‚Π΅ ΠΈΡƒ ΡΡ†Π΅Π½Π°Ρ€ΠΈΡ˜Ρƒ ΠΈΡƒ сандбоку. Π‘Ρ†Π΅Π½Π°Ρ€ΠΈΡ˜ΠΈ Π·Π°Ρ…Ρ‚Π΅Π²Π°Ρ˜Ρƒ ΠΎΠ΄ ΠΈΠ³Ρ€Π°Ρ‡Π° Π΄Π° ΠΈΠ·Π²Ρ€ΡˆΠΈ ΠΎΠ΄Ρ€Π΅Ρ’Π΅Π½ΠΈ Π·Π°Π΄Π°Ρ‚Π°ΠΊ Ρƒ ΠΎΠ΄Ρ€Π΅Ρ’Π΅Π½ΠΎΠΌ Ρ€ΠΎΠΊΡƒ, Π΄ΠΎΠΊ Π‘Π°Π½Π΄Π±ΠΎΠΊ ΠΎΠΌΠΎΠ³ΡƒΡ›Π°Π²Π° ΠΈΠ³Ρ€Π°Ρ‡Ρƒ Π΄Π° ΠΈΠ·Π³Ρ€Π°Π΄ΠΈ Ρ„Π»Π΅ΠΊΡΠΈΠ±ΠΈΠ»Π½ΠΈΡ˜ΠΈ ΠΏΠ°Ρ€ΠΊ Π±Π΅Π· ΠΈΠΊΠ°ΠΊΠ²ΠΈΡ… ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅ΡšΠ° ΠΈΠ»ΠΈ Ρ„ΠΈΠ½Π°Π½ΡΠΈΡ˜Π°.

подСшавањС

Π”Π° Π±ΠΈΡ… ΡƒΡˆΡ‚Π΅Π΄Π΅Π»Π° Π²Ρ€Π΅ΠΌΠ΅, Π²Π΅Ρ€ΠΎΠ²Π°Ρ‚Π½ΠΎ Ρ›Ρƒ прСскочити процСс ΠΈΠ½ΡΡ‚Π°Π»Π°Ρ†ΠΈΡ˜Π΅ ΠΈ ΠΏΠΎΡ‡Π΅Ρ‚ΠΈ ΠΎΠ΄ Ρ‚Ρ€Π΅Π½ΡƒΡ‚ΠΊΠ° ΠΊΠ°Π΄Π° Π½Π° ΠΌΠΎΠΌ Ρ€Π°Ρ‡ΡƒΠ½Π°Ρ€Ρƒ Π±ΡƒΠ΄Π΅ ΠΏΠΎΠΊΡ€Π΅Π½ΡƒΡ‚ Π’Π΅Π°ΠΌΠ¦ΠΈΡ‚ΠΈ сСрвСр. ΠœΠΎΡ€Π°ΠΌΠΎ Π΄Π° ΠΎΠ΄Π΅ΠΌΠΎ Π½Π°: лоцалхост:{ΠΏΠΎΡ€Ρ‚ спСцифициран Ρ‚ΠΎΠΊΠΎΠΌ процСса ΠΈΠ½ΡΡ‚Π°Π»Π°Ρ†ΠΈΡ˜Π΅} (Ρƒ ΠΌΠΎΠΌ ΡΠ»ΡƒΡ‡Π°Ρ˜Ρƒ, лоцалхост:9090) ΠΈ унСсСмо ΠΏΠΎΠ΄Π°Ρ‚ΠΊΠ΅ Π·Π° Π°ΡƒΡ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΡ˜Ρƒ. Након уласка Π΄ΠΎΡ‡Π΅ΠΊΠ°Ρ›Π΅ нас:

ΠŸΠ’Π‘-Π‘Ρ‚ΡƒΠ΄ΠΈΠΎ ΠΈ ΠΊΠΎΠ½Ρ‚ΠΈΠ½ΡƒΠΈΡ€Π°Π½Π° ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ˜Π°: Π’Π΅Π°ΠΌΠ¦ΠΈΡ‚ΠΈ. Анализа ΠΏΡ€ΠΎΡ˜Π΅ΠΊΡ‚Π° ОпСн РоллСрЦоастСр Π’ΠΈΡ†ΠΎΠΎΠ½ 2
НаТмём Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡƒ Create Project. Π”Π°Π»Π΅Π΅ Π²Ρ‹Π±Π΅Ρ€Π΅ΠΌ Manually, Π·Π°ΠΏΠΎΠ»Π½ΠΈΠΌ поля.

ΠŸΠ’Π‘-Π‘Ρ‚ΡƒΠ΄ΠΈΠΎ ΠΈ ΠΊΠΎΠ½Ρ‚ΠΈΠ½ΡƒΠΈΡ€Π°Π½Π° ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ˜Π°: Π’Π΅Π°ΠΌΠ¦ΠΈΡ‚ΠΈ. Анализа ΠΏΡ€ΠΎΡ˜Π΅ΠΊΡ‚Π° ОпСн РоллСрЦоастСр Π’ΠΈΡ†ΠΎΠΎΠ½ 2
Након притиска Π½Π° Π΄ΡƒΠ³ΠΌΠ΅ Π‘Ρ‚Π²ΠΎΡ€ΠΈΡ‚ΠΈ, Π΄ΠΎΡ‡Π΅ΠΊΠ° нас ΠΏΡ€ΠΎΠ·ΠΎΡ€ са подСшавањима.

ΠŸΠ’Π‘-Π‘Ρ‚ΡƒΠ΄ΠΈΠΎ ΠΈ ΠΊΠΎΠ½Ρ‚ΠΈΠ½ΡƒΠΈΡ€Π°Π½Π° ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ˜Π°: Π’Π΅Π°ΠΌΠ¦ΠΈΡ‚ΠΈ. Анализа ΠΏΡ€ΠΎΡ˜Π΅ΠΊΡ‚Π° ОпСн РоллСрЦоастСр Π’ΠΈΡ†ΠΎΠΎΠ½ 2
Π₯ајдС Π΄Π° ΠΊΠ»ΠΈΠΊΠ½Π΅ΠΌΠΎ ΠšΡ€Π΅ΠΈΡ€Π°Ρ˜Ρ‚Π΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Ρƒ ΠΈΠ·Π³Ρ€Π°Π΄ΡšΠ΅.

ΠŸΠ’Π‘-Π‘Ρ‚ΡƒΠ΄ΠΈΠΎ ΠΈ ΠΊΠΎΠ½Ρ‚ΠΈΠ½ΡƒΠΈΡ€Π°Π½Π° ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ˜Π°: Π’Π΅Π°ΠΌΠ¦ΠΈΡ‚ΠΈ. Анализа ΠΏΡ€ΠΎΡ˜Π΅ΠΊΡ‚Π° ОпСн РоллСрЦоастСр Π’ΠΈΡ†ΠΎΠΎΠ½ 2
ΠŸΠΎΠΏΡƒΠ½ΠΈΡ‚Π΅ ΠΏΠΎΡ™Π° ΠΈ ΠΊΠ»ΠΈΠΊΠ½ΠΈΡ‚Π΅ Π‘Ρ‚Π²ΠΎΡ€ΠΈΡ‚ΠΈ. ΠœΡ‹ Π²ΠΈΠ΄ΠΈΠΌ ΠΎΠΊΠ½ΠΎ с ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ Π²Ρ‹Π±ΠΎΡ€Π° систСмы контроля вСрсий. Π’Π°ΠΊ ΠΊΠ°ΠΊ исходники ΡƒΠΆΠ΅ Π»Π΅ΠΆΠ°Ρ‚ локально, ΠΆΠΌΡ‘ΠΌ ΠŸΡ€Π΅ΡΠΊΠΎΡ‡ΠΈΡ‚ΠΈ.

ΠŸΠ’Π‘-Π‘Ρ‚ΡƒΠ΄ΠΈΠΎ ΠΈ ΠΊΠΎΠ½Ρ‚ΠΈΠ½ΡƒΠΈΡ€Π°Π½Π° ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ˜Π°: Π’Π΅Π°ΠΌΠ¦ΠΈΡ‚ΠΈ. Анализа ΠΏΡ€ΠΎΡ˜Π΅ΠΊΡ‚Π° ОпСн РоллСрЦоастСр Π’ΠΈΡ†ΠΎΠΎΠ½ 2
На ΠΊΡ€Π°Ρ˜Ρƒ, ΠΏΡ€Π΅Π»Π°Π·ΠΈΠΌΠΎ Π½Π° подСшавања ΠΏΡ€ΠΎΡ˜Π΅ΠΊΡ‚Π°.

ΠŸΠ’Π‘-Π‘Ρ‚ΡƒΠ΄ΠΈΠΎ ΠΈ ΠΊΠΎΠ½Ρ‚ΠΈΠ½ΡƒΠΈΡ€Π°Π½Π° ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ˜Π°: Π’Π΅Π°ΠΌΠ¦ΠΈΡ‚ΠΈ. Анализа ΠΏΡ€ΠΎΡ˜Π΅ΠΊΡ‚Π° ОпСн РоллСрЦоастСр Π’ΠΈΡ†ΠΎΠΎΠ½ 2
Π”ΠΎΠ±Π°Π²ΠΈΠΌ шаги сборки, для этого ΠΆΠΌΡ‘ΠΌ: ΠšΠΎΡ€Π°Ρ†ΠΈ ΠΈΠ·Π³Ρ€Π°Π΄ΡšΠ΅ -> Π”ΠΎΠ΄Π°Ρ˜ ΠΊΠΎΡ€Π°ΠΊ ΠΈΠ·Π³Ρ€Π°Π΄ΡšΠ΅.

ΠŸΠ’Π‘-Π‘Ρ‚ΡƒΠ΄ΠΈΠΎ ΠΈ ΠΊΠΎΠ½Ρ‚ΠΈΠ½ΡƒΠΈΡ€Π°Π½Π° ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ˜Π°: Π’Π΅Π°ΠΌΠ¦ΠΈΡ‚ΠΈ. Анализа ΠΏΡ€ΠΎΡ˜Π΅ΠΊΡ‚Π° ОпСн РоллСрЦоастСр Π’ΠΈΡ†ΠΎΠΎΠ½ 2
ОвдС Π±ΠΈΡ€Π°ΠΌΠΎ:

  • Π’ΠΈΠΏ ΠΏΠΎΠΊΡ€Π΅Ρ‚Π°Ρ‡Π° -> Командна линија
  • ΠŸΠΎΠΊΡ€Π΅Π½ΠΈ -> ΠŸΡ€ΠΈΠ»Π°Π³ΠΎΡ’Π΅Π½Π° скрипта

Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ Π°Π½Π°Π»ΠΈΠ· Π²ΠΎ врСмя компиляции ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, сборка ΠΈ Π°Π½Π°Π»ΠΈΠ· Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ΄Π½ΠΈΠΌ шагом, поэтому Π·Π°ΠΏΠΎΠ»Π½ΠΈΠΌ ΠΏΠΎΠ»Π΅ Цустом Π‘Ρ†Ρ€ΠΈΠΏΡ‚:

ΠŸΠ’Π‘-Π‘Ρ‚ΡƒΠ΄ΠΈΠΎ ΠΈ ΠΊΠΎΠ½Ρ‚ΠΈΠ½ΡƒΠΈΡ€Π°Π½Π° ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ˜Π°: Π’Π΅Π°ΠΌΠ¦ΠΈΡ‚ΠΈ. Анализа ΠΏΡ€ΠΎΡ˜Π΅ΠΊΡ‚Π° ОпСн РоллСрЦоастСр Π’ΠΈΡ†ΠΎΠΎΠ½ 2
На ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… ΡˆΠ°Π³Π°Ρ… ΠΌΡ‹ остановимся ΠΏΠΎΠ·ΠΆΠ΅. Π’Π°ΠΆΠ½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°, сборка ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, Π΅Π³ΠΎ Π°Π½Π°Π»ΠΈΠ·, Π²Ρ‹Π²ΠΎΠ΄ ΠΎΡ‚Ρ‡Ρ‘Ρ‚Π° ΠΈ Π΅Π³ΠΎ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ заняло всСго ΠΎΠ΄ΠΈΠ½Π½Π°Π΄Ρ†Π°Ρ‚ΡŒ строк ΠΊΠΎΠ΄Π°.

ПослСднСС, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, β€” ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ окруТСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ я ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡ΠΈΠ» Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡƒΡ‚ΠΈ для ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡ ΠΈΡ… Ρ‡ΠΈΡ‚Π°Π±Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. Для этого ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Ρ‘ΠΌ: ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ -> Π”ΠΎΠ΄Π°Ρ˜ Π½ΠΎΠ²ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Π°Ρ€ ΠΈ Π΄ΠΎΠ΄Π°Ρ˜Ρ‚Π΅ Ρ‚Ρ€ΠΈ ΠΏΡ€ΠΎΠΌΠ΅Π½Ρ™ΠΈΠ²Π΅:

ΠŸΠ’Π‘-Π‘Ρ‚ΡƒΠ΄ΠΈΠΎ ΠΈ ΠΊΠΎΠ½Ρ‚ΠΈΠ½ΡƒΠΈΡ€Π°Π½Π° ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ˜Π°: Π’Π΅Π°ΠΌΠ¦ΠΈΡ‚ΠΈ. Анализа ΠΏΡ€ΠΎΡ˜Π΅ΠΊΡ‚Π° ОпСн РоллСрЦоастСр Π’ΠΈΡ†ΠΎΠΎΠ½ 2
ΠžΡΡ‚Π°Ρ‘Ρ‚ΡΡ Π½Π°ΠΆΠ°Ρ‚ΡŒ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡƒ Ρ‚Ρ€Ρ‡Π°ΡšΠ΅ Π² ΠΏΡ€Π°Π²ΠΎΠΌ Π²Π΅Ρ€Ρ…Π½Π΅ΠΌ ΡƒΠ³Π»Ρƒ. Пока ΠΈΠ΄Ρ‘Ρ‚ сборка ΠΈ Π°Π½Π°Π»ΠΈΠ· ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° расскаТу Π²Π°ΠΌ ΠΎ скриптС.

Π”ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ сцСнарио

Для Π½Π°Ρ‡Π°Π»Π° Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹ΠΊΠ°Ρ‡Π°Ρ‚ΡŒ свСТий дистрибутив PVS-Studio. Для этого ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΏΠ°ΠΊΠ΅Ρ‚Π½Ρ‹ΠΉ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ Π‘hocolatey. Для Ρ‚Π΅Ρ…, ΠΊΡ‚ΠΎ Ρ…ΠΎΡ‡Π΅Ρ‚ ΡƒΠ·Π½Π°Ρ‚ΡŒ ΠΎΠ± этом ΠΏΠΎΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅, Π΅ΡΡ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π°Ρ Ρ‡Π»Π°Π½Π°ΠΊ:

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% "c:ptest.plog" --renderTypes=TeamCity -o "C:temp"

ПослСдним дСйствиСм Π²Ρ‹Π²Π΅Π΄Π΅ΠΌ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΎΡ‚Ρ‡Ρ‘Ρ‚ Π² стдоут, Π³Π΄Π΅ Ρ›Π΅ Π³Π° ΠΏΠΎΠΊΡƒΠΏΠΈΡ‚ΠΈ Π’Π΅Π°ΠΌΠ¦ΠΈΡ‚ΠΈ парсСр.

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"

Π’Π΅ΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ, сборка ΠΈ Π°Π½Π°Π»ΠΈΠ· ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ»ΠΈΡΡŒ, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Π½Π° Π²ΠΊΠ»Π°Π΄ΠΊΡƒ Projekti ΠΈ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΠ° Π² Π΅Ρ‚ΠΎΠΌ.

ΠŸΠ’Π‘-Π‘Ρ‚ΡƒΠ΄ΠΈΠΎ ΠΈ ΠΊΠΎΠ½Ρ‚ΠΈΠ½ΡƒΠΈΡ€Π°Π½Π° ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ˜Π°: Π’Π΅Π°ΠΌΠ¦ΠΈΡ‚ΠΈ. Анализа ΠΏΡ€ΠΎΡ˜Π΅ΠΊΡ‚Π° ОпСн РоллСрЦоастСр Π’ΠΈΡ†ΠΎΠΎΠ½ 2
Π‘Π°Π΄Π° Π΄Π° ΠΊΠ»ΠΈΠΊΠ½Π΅ΠΌΠΎ Π½Π° ΠŸΡ€Π΅Π³Π»Π΅Π΄ΠΈ Π£ΠΊΡƒΠΏΠ½ΠΎ, Ρ‡Ρ‚ΠΎΠ± ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ просмотру ΠΎΡ‚Ρ‡Ρ‘Ρ‚Π° Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°:

ΠŸΠ’Π‘-Π‘Ρ‚ΡƒΠ΄ΠΈΠΎ ΠΈ ΠΊΠΎΠ½Ρ‚ΠΈΠ½ΡƒΠΈΡ€Π°Π½Π° ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ˜Π°: Π’Π΅Π°ΠΌΠ¦ΠΈΡ‚ΠΈ. Анализа ΠΏΡ€ΠΎΡ˜Π΅ΠΊΡ‚Π° ОпСн РоллСрЦоастСр Π’ΠΈΡ†ΠΎΠΎΠ½ 2
Π£ΠΏΠΎΠ·ΠΎΡ€Π΅ΡšΠ° су груписана ΠΏΡ€Π΅ΠΌΠ° Π±Ρ€ΠΎΡ˜Π΅Π²ΠΈΠΌΠ° Π΄ΠΈΡ˜Π°Π³Π½ΠΎΡΡ‚ΠΈΡ‡ΠΊΠΈΡ… ΠΏΡ€Π°Π²ΠΈΠ»Π°. Π”Π° бистС сС ΠΊΡ€Π΅Ρ‚Π°Π»ΠΈ ΠΊΡ€ΠΎΠ· ΠΊΠΎΠ΄, ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΎ јС Π΄Π° ΠΊΠ»ΠΈΠΊΠ½Π΅Ρ‚Π΅ Π½Π° Π±Ρ€ΠΎΡ˜ Ρ€Π΅Π΄Π° са ΡƒΠΏΠΎΠ·ΠΎΡ€Π΅ΡšΠ΅ΠΌ. Кликом Π½Π° ΡƒΠΏΠΈΡ‚Π½ΠΈΠΊ Ρƒ Π³ΠΎΡ€ΡšΠ΅ΠΌ дСсном ΡƒΠ³Π»Ρƒ ΠΎΡ‚Π²ΠΎΡ€ΠΈΡ›Π΅ сС Π½ΠΎΠ²Π° ΠΊΠ°Ρ€Ρ‚ΠΈΡ†Π° са Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜ΠΎΠΌ. Π’Π°ΠΊΠΎΡ’Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° сС ΠΊΡ€Π΅Ρ›Π΅Ρ‚Π΅ ΠΊΡ€ΠΎΠ· ΠΊΠΎΠ΄ Ρ‚Π°ΠΊΠΎ ΡˆΡ‚ΠΎ Ρ›Π΅Ρ‚Π΅ ΠΊΠ»ΠΈΠΊΠ½ΡƒΡ‚ΠΈ Π½Π° Π±Ρ€ΠΎΡ˜ Ρ€Π΅Π΄Π° са ΡƒΠΏΠΎΠ·ΠΎΡ€Π΅ΡšΠ΅ΠΌ Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°. ΠΠ°Π²ΠΈΠ³Π°Ρ†ΠΈΡ˜Π° са ΡƒΠ΄Π°Ρ™Π΅Π½ΠΎΠ³ Ρ€Π°Ρ‡ΡƒΠ½Π°Ρ€Π° јС ΠΌΠΎΠ³ΡƒΡ›Π° ΠΊΠ°Π΄Π° сС користи Π‘ΠΎΡƒΡ€Ρ†Π΅Π’Ρ€Π΅Π΅Π ΠΎΠΎΡ‚ ΠΌΠ°Ρ€ΠΊΠ΅Ρ€Π°. Π’ΠΎΡ‚, ΠΊΠΎΠΌΡƒ интСрСсСн Π΄Π°Π½Π½Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°, ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒΡΡ с ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ Ρ€Π°Π·Π΄Π΅Π»ΠΎΠΌ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Π°.

ΠŸΡ€Π΅Π³Π»Π΅Π΄ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚Π° Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°

ПослС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΌΡ‹ Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΠ»ΠΈ с Ρ€Π°Π·Π²Ρ‘Ρ€Ρ‚Ρ‹Π²Π°Π½ΠΈΠ΅ΠΌ ΠΈ настройкой сборки, ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π½Π° Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ интСрСсныС прСдупрСТдСния, ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹Π΅ Π² исслСдуСмом ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅.

Π£ΠΏΠΎΠ·ΠΎΡ€Π΅ΡšΠ΅ Н1

Π’ΠšΠ‘ΠΠ£ΠœΠšΠ‘ [CWE-401] The exception was thrown without releasing the 'result' pointer. A memory leak is possible. 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;
}

Анализатор Π·Π°ΠΌΠ΅Ρ‚ΠΈΠ» ΠΎΡˆΠΈΠ±ΠΊΡƒ, Π·Π°ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰ΡƒΡŽΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ послС динамичСского выдСлСния памяти Π² Π¦Ρ€Π΅Π°Ρ‚Π΅ΠžΠ±Ρ˜Π΅Ρ†Ρ‚, ΠΏΡ€ΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΏΠ°ΠΌΡΡ‚ΡŒ Π½Π΅ очищаСтся, соотвСтствСнно, Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΡƒΡ‚Π΅Ρ‡ΠΊΠ° памяти.

Π£ΠΏΠΎΠ·ΠΎΡ€Π΅ΡšΠ΅ Н2

Π’ΠšΠ‘ΠΠ£ΠœΠšΠ‘ There are identical sub-expressions '(1ULL << WIDX_MONTH_BOX)' to the left and to the right of the '|' operator. libopenrct2ui Cheats.cpp 487

static uint64_t window_cheats_page_enabled_widgets[] = 
{
  MAIN_CHEAT_ENABLED_WIDGETS |
  (1ULL << WIDX_NO_MONEY) |
  (1ULL << WIDX_ADD_SET_MONEY_GROUP) |
  (1ULL << WIDX_MONEY_SPINNER) |
  (1ULL << WIDX_MONEY_SPINNER_INCREMENT) |
  (1ULL << WIDX_MONEY_SPINNER_DECREMENT) |
  (1ULL << WIDX_ADD_MONEY) |
  (1ULL << WIDX_SET_MONEY) |
  (1ULL << WIDX_CLEAR_LOAN) |
  (1ULL << WIDX_DATE_SET) |
  (1ULL << WIDX_MONTH_BOX) |  // <=
  (1ULL << WIDX_MONTH_UP) |
  (1ULL << WIDX_MONTH_DOWN) |
  (1ULL << WIDX_YEAR_BOX) |
  (1ULL << WIDX_YEAR_UP) |
  (1ULL << WIDX_YEAR_DOWN) |
  (1ULL << WIDX_DAY_BOX) |
  (1ULL << WIDX_DAY_UP) |
  (1ULL << WIDX_DAY_DOWN) |
  (1ULL << WIDX_MONTH_BOX) |  // <=
  (1ULL << WIDX_DATE_GROUP) |
  (1ULL << WIDX_DATE_RESET),
  ....
};

Мало ΠΊΡ‚ΠΎ, ΠΊΡ€ΠΎΠΌΠ΅ статичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°, смог Π±Ρ‹ ΠΏΡ€ΠΎΠΉΡ‚ΠΈ Π΄Π°Π½Π½Ρ‹ΠΉ тСст Π½Π° Π²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ. Π”Π°Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ копипасты Ρ…ΠΎΡ€ΠΎΡˆ ΠΈΠΌΠ΅Π½Π½ΠΎ этим.

Π£ΠΏΠΎΠ·ΠΎΡ€Π΅ΡšΠ° Н3

Π’ΠšΠ‘ΠΠ£ΠœΠšΠ‘ It is odd that the 'flags' field in derived class 'RCT12BannerElement' overwrites field in base class 'RCT12TileElementBase'. Check lines: RCT12.h:570, RCT12.h:259. libopenrct2 RCT12.h 570

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

Наравно, ΠΊΠΎΡ€ΠΈΡˆΡ›Π΅ΡšΠ΅ ΠΏΡ€ΠΎΠΌΠ΅Π½Ρ™ΠΈΠ²Π΅ са истим ΠΈΠΌΠ΅Π½ΠΎΠΌ Ρƒ основној класи ΠΈ Ρƒ ΠΏΠΎΡ‚ΠΎΠΌΠΊΡƒ нијС ΡƒΠ²Π΅ΠΊ Π³Ρ€Π΅ΡˆΠΊΠ°. ΠœΠ΅Ρ’ΡƒΡ‚ΠΈΠΌ, сама Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΡ˜Π° Π½Π°ΡΠ»Π΅Ρ’ΠΈΠ²Π°ΡšΠ° прСтпоставља Π΄Π° су сва ΠΏΠΎΡ™Π° родитСљскС класС присутна Ρƒ ΠΏΠΎΠ΄Ρ€Π΅Ρ’Π΅Π½ΠΎΡ˜ класи. ΠŸΡ€ΠΎΠ³Π»Π°ΡˆΠ°Π²Π°ΡšΠ΅ΠΌ ΠΏΠΎΡ™Π° са истим ΠΈΠΌΠ΅Π½ΠΎΠΌ Ρƒ наслСднику стварамо Π·Π°Π±ΡƒΠ½Ρƒ.

Π£ΠΏΠΎΠ·ΠΎΡ€Π΅ΡšΠ΅ Н4

Π’ΠšΠ‘ΠΠ£ΠœΠšΠ‘ It is odd that the result of the 'imageDirection / 8' statement is a part of the condition. Perhaps, this statement should have been compared with something else. libopenrct2 ObservationTower.cpp 38

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

Π₯ајдС Π΄Π° ΠΏΠΎΠ³Π»Π΅Π΄Π°ΠΌΠΎ ΠΈΠ·Π±Π»ΠΈΠ·Π°. Π˜Π·Ρ€Π°Π· imageDirection / 8 Π±ΠΈΡ›Π΅ Π»Π°ΠΆΠ½ΠΎ Π°ΠΊΠΎ ΠΈΠΌΠ°Π³Π΅Π”ΠΈΡ€Π΅Ρ†Ρ‚ΠΈΠΎΠ½ јС Ρƒ опсСгу ΠΎΠ΄ -7 Π΄ΠΎ 7. Π”Ρ€ΡƒΠ³ΠΈ Π΄Π΅ΠΎ: (ΠΈΠΌΠ°Π³Π΅Π”ΠΈΡ€Π΅Ρ†Ρ‚ΠΈΠΎΠ½ / 8) != 3 ΠΏΡ€ΠΎΠ²Π΅Ρ€Π΅ ΠΈΠΌΠ°Π³Π΅Π”ΠΈΡ€Π΅Ρ†Ρ‚ΠΈΠΎΠ½ Π·Π° ΠΈΠ·Π²Π°Π½ опсСга: ΠΎΠ΄ -31 Π΄ΠΎ -24 ΠΈ ΠΎΠ΄ 24 Π΄ΠΎ 31, рСспСктивно. Π§ΠΈΠ½ΠΈ ΠΌΠΈ сС ΠΏΡ€ΠΈΠ»ΠΈΡ‡Π½ΠΎ Ρ‡ΡƒΠ΄Π½ΠΈΠΌ Π΄Π° Π½Π° овај Π½Π°Ρ‡ΠΈΠ½ ΠΏΡ€ΠΎΠ²Π΅Ρ€Π°Π²Π°ΠΌ Π±Ρ€ΠΎΡ˜Π΅Π²Π΅ Π·Π° ΡƒΠΊΡ™ΡƒΡ‡ΠΈΠ²Π°ΡšΠ΅ Ρƒ ΠΎΠ΄Ρ€Π΅Ρ’Π΅Π½ΠΈ опсСг ΠΈ, Ρ‡Π°ΠΊ ΠΈ Π°ΠΊΠΎ Π½Π΅ΠΌΠ° Π³Ρ€Π΅ΡˆΠΊΠ΅ Ρƒ ΠΎΠ²ΠΎΠΌ Π΄Π΅Π»Ρƒ ΠΊΠΎΠ΄Π°, ΠΏΡ€Π΅ΠΏΠΎΡ€ΡƒΡ‡ΠΈΠΎ Π±ΠΈΡ… Π΄Π° сС ΠΎΠ²ΠΈ услови ΠΏΠΎΠ½ΠΎΠ²ΠΎ Π½Π°ΠΏΠΈΡˆΡƒ ΠΊΠ°ΠΊΠΎ Π±ΠΈ Π±ΠΈΠ»ΠΈ Π΅ΠΊΡΠΏΠ»ΠΈΡ†ΠΈΡ‚Π½ΠΈΡ˜ΠΈ. Ово Π±ΠΈ Π·Π½Π°Ρ‚Π½ΠΎ олакшало ΠΆΠΈΠ²ΠΎΡ‚ Ρ™ΡƒΠ΄ΠΈΠΌΠ° који Π±ΠΈ Ρ‡ΠΈΡ‚Π°Π»ΠΈ ΠΈ ΠΎΠ΄Ρ€ΠΆΠ°Π²Π°Π»ΠΈ овај ΠΊΠΎΠ΄.

Π£ΠΏΠΎΠ·ΠΎΡ€Π΅ΡšΠ΅ Н5

Π’ΠšΠ‘ΠΠ£ΠœΠšΠ‘ An odd sequence of assignments of this kind: A = B; B = A;. Check lines: 1115, 1118. libopenrct2ui MouseInput.cpp 1118

void process_mouse_over(....)
{
  ....
  switch (window->widgets[widgetId].type)
  {
    case WWT_VIEWPORT:
      ebx = 0;
      edi = cursorId;                                 // <=
      // Window event WE_UNKNOWN_0E was called here,
      // but no windows actually implemented a handler and
      // it's not known what it was for
      cursorId = edi;                                 // <=
      if ((ebx & 0xFF) != 0)
      {
        set_cursor(cursorId);
        return;
      }
      break;
      ....
  }
  ....
}

Π”Π°Π½Π½Ρ‹ΠΉ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ ΠΊΠΎΠ΄Π°, скорСС всСго, Π±Ρ‹Π» ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ ΠΏΡƒΡ‚Π΅ΠΌ дСкомпиляции. Π—Π°Ρ‚Π΅ΠΌ, судя ΠΏΠΎ оставлСнному ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΡŽ, Π±Ρ‹Π»Π° ΡƒΠ΄Π°Π»Π΅Π½Π° Ρ‡Π°ΡΡ‚ΡŒ Π½Π΅Ρ€Π°Π±ΠΎΡ‡Π΅Π³ΠΎ ΠΊΠΎΠ΄Π°. Однако ΠΎΡΡ‚Π°Π»Π°ΡΡŒ ΠΏΠ°Ρ€Π° ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π½Π°Π΄ Ρ†ΡƒΡ€ΡΠΎΡ€Π˜Π΄, ΡˆΡ‚ΠΎ Ρ‚Π°ΠΊΠΎΡ’Π΅ Π½Π΅ΠΌΠ° ΠΌΠ½ΠΎΠ³ΠΎ смисла.

Π£ΠΏΠΎΠ·ΠΎΡ€Π΅ΡšΠ΅ Н6

Π’ΠšΠ‘ΠΠ£ΠœΠšΠ‘ [CWE-476] The 'player' pointer was used unsafely after it was verified against nullptr. Check lines: 2085, 2094. libopenrct2 Network.cpp 2094

void Network::ProcessPlayerList()
{
  ....
  auto* player = GetPlayerByID(pendingPlayer.Id);
  if (player == nullptr)
  {
    // Add new player.
    player = AddPlayer("", "");
    if (player)                                          // <=
    {
      *player = pendingPlayer;
       if (player->Flags & NETWORK_PLAYER_FLAG_ISSERVER)
       {
         _serverConnection->Player = player;
       }
    }
    newPlayers.push_back(player->Id);                    // <=
  }
  ....
}

Π”Π°Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΏΠΎΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ довольно просто, Π½ΡƒΠΆΠ½ΠΎ ΠΈΠ»ΠΈ Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ Ρ€Π°Π· ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ ΠΏΠ»Π΅Ρ˜Π΅Ρ€ Π½Π° Π½ΡƒΠ»Π΅Π²ΠΎΠΉ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ, Π»ΠΈΠ±ΠΎ внСсти Π΅Π³ΠΎ Π² Ρ‚Π΅Π»ΠΎ условного ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°. Π― Π±Ρ‹ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΠ» Π²Ρ‚ΠΎΡ€ΠΎΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚:

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

Π£ΠΏΠΎΠ·ΠΎΡ€Π΅ΡšΠ΅ Н7

Π’ΠšΠ‘ΠΠ£ΠœΠšΠ‘ [CWE-570] Expression 'name == nullptr' is always false. 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));
    ....
  }
  ....
}

МоТно ΠΎΠ΄Π½ΠΈΠΌ ΠΌΠ°Ρ…ΠΎΠΌ ΠΈΠ·Π±Π°Π²ΠΈΡ‚ΡŒΡΡ ΠΎΡ‚ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎΡ‡ΠΈΡ‚Π°Π΅ΠΌΠΎΠΉ строки ΠΊΠΎΠ΄Π° ΠΈ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ с ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΎΠΉ Π½Π° Π½ΡƒΠ»Π»ΠΏΡ‚Ρ€. ΠŸΡ€Π΅Π΄Π»Π°Π³Π°ΡŽ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

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

Π£ΠΏΠΎΠ·ΠΎΡ€Π΅ΡšΠ΅ Н8

Π’ΠšΠ‘ΠΠ£ΠœΠšΠ‘ [CWE-1164] The 'ColumnHeaderPressedCurrentState' variable was assigned the same value. libopenrct2ui CustomListView.cpp 510

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

Код выглядит довольно странно. МнС каТСтся, ΠΈΠΌΠ΅Π»Π° мСсто Π±Ρ‹Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ‡Π°Ρ‚ΠΊΠ° Π»ΠΈΠ±ΠΎ Π² условии, Π»ΠΈΠ±ΠΎ ΠΏΡ€ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠΌ присвоСнии ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π¦ΠΎΠ»ΡƒΠΌΠ½Π₯Π΅Π°Π΄Π΅Ρ€ΠŸΡ€Π΅ΡΡΠ΅Π΄Π¦ΡƒΡ€Ρ€Π΅Π½Ρ‚Π‘Ρ‚Π°Ρ‚Π΅ Π·Π½Π°Ρ‡Π΅ΡšΠ° Π»Π°ΠΆΠ°Π½.

Излаз

Као ΡˆΡ‚ΠΎ Π²ΠΈΠ΄ΠΈΠΌΠΎ, ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ˜Π° статичког Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° ΠŸΠ’Π‘-Π‘Ρ‚ΡƒΠ΄ΠΈΠΎ Ρƒ ваш Π’Π΅Π°ΠΌΠ¦ΠΈΡ‚ΠΈ ΠΏΡ€ΠΎΡ˜Π΅ΠΊΠ°Ρ‚ јС ΠΏΡ€ΠΈΠ»ΠΈΡ‡Π½ΠΎ Ρ˜Π΅Π΄Π½ΠΎΡΡ‚Π°Π²Π½Π°. Π”Π° бистС Ρ‚ΠΎ ΡƒΡ€Π°Π΄ΠΈΠ»ΠΈ, Π΄ΠΎΠ²ΠΎΡ™Π½ΠΎ јС написати само Ρ˜Π΅Π΄Π½Ρƒ ΠΌΠ°Π»Ρƒ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Ρƒ Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΡƒ. ΠŸΡ€ΠΎΠ²Π΅Ρ€Π° ΠΊΠΎΠ΄Π° Ρ›Π΅ Π²Π°ΠΌ ΠΎΠΌΠΎΠ³ΡƒΡ›ΠΈΡ‚ΠΈ Π΄Π° ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΡƒΡ˜Π΅Ρ‚Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ΅ ΠΎΠ΄ΠΌΠ°Ρ… Π½Π°ΠΊΠΎΠ½ склапања, ΡˆΡ‚ΠΎ Ρ›Π΅ ΠΏΠΎΠΌΠΎΡ›ΠΈ Π΄Π° ΠΈΡ… Π΅Π»ΠΈΠΌΠΈΠ½ΠΈΡˆΠ΅Ρ‚Π΅ ΠΊΠ°Π΄Π° су слоТСност ΠΈ Ρ†Π΅Π½Π° ΠΏΡ€ΠΎΠΌΠ΅Π½Π° још ΡƒΠ²Π΅ΠΊ ниска.

ΠŸΠ’Π‘-Π‘Ρ‚ΡƒΠ΄ΠΈΠΎ ΠΈ ΠΊΠΎΠ½Ρ‚ΠΈΠ½ΡƒΠΈΡ€Π°Π½Π° ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ˜Π°: Π’Π΅Π°ΠΌΠ¦ΠΈΡ‚ΠΈ. Анализа ΠΏΡ€ΠΎΡ˜Π΅ΠΊΡ‚Π° ОпСн РоллСрЦоастСр Π’ΠΈΡ†ΠΎΠΎΠ½ 2
Ако ΠΆΠ΅Π»ΠΈΡ‚Π΅ Π΄Π° ΠΏΠΎΠ΄Π΅Π»ΠΈΡ‚Π΅ овај Ρ‡Π»Π°Π½Π°ΠΊ са ΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠΌ која Π³ΠΎΠ²ΠΎΡ€ΠΈ СнглСски, користитС Π»ΠΈΠ½ΠΊ Π·Π° ΠΏΡ€Π΅Π²ΠΎΠ΄: Владислав Π‘Ρ‚ΠΎΠ»ΠΈΠ°Ρ€ΠΎΠ². PVS-Studio and Continuous Integration: TeamCity. Analysis of the Open RollerCoaster Tycoon 2 project.

Π˜Π·Π²ΠΎΡ€: Π²Π²Π².Ρ…Π°Π±Ρ€.Ρ†ΠΎΠΌ

Π”ΠΎΠ΄Π°Ρ˜ ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€