PSP ಗೇಮ್ ಕನ್ಸೋಲ್ ಎಮ್ಯುಲೇಟರ್ನ ಉದಾಹರಣೆಯನ್ನು ಬಳಸಿಕೊಂಡು ಟ್ರಾವಿಸ್ CI ನಲ್ಲಿ PVS-ಸ್ಟುಡಿಯೋವನ್ನು ಹೇಗೆ ಕಾನ್ಫಿಗರ್ ಮಾಡುವುದು

PSP ಗೇಮ್ ಕನ್ಸೋಲ್ ಎಮ್ಯುಲೇಟರ್ನ ಉದಾಹರಣೆಯನ್ನು ಬಳಸಿಕೊಂಡು ಟ್ರಾವಿಸ್ CI ನಲ್ಲಿ PVS-ಸ್ಟುಡಿಯೋವನ್ನು ಹೇಗೆ ಕಾನ್ಫಿಗರ್ ಮಾಡುವುದು
ಟ್ರಾವಿಸ್ CI ಎನ್ನುವುದು GitHub ಅನ್ನು ಮೂಲ ಕೋಡ್ ಹೋಸ್ಟಿಂಗ್ ಆಗಿ ಬಳಸುವ ಸಾಫ್ಟ್‌ವೇರ್ ಅನ್ನು ನಿರ್ಮಿಸಲು ಮತ್ತು ಪರೀಕ್ಷಿಸಲು ವಿತರಿಸಲಾದ ವೆಬ್ ಸೇವೆಯಾಗಿದೆ. ಮೇಲಿನ ಆಪರೇಟಿಂಗ್ ಸನ್ನಿವೇಶಗಳಿಗೆ ಹೆಚ್ಚುವರಿಯಾಗಿ, ನೀವು ವ್ಯಾಪಕವಾದ ಕಾನ್ಫಿಗರೇಶನ್ ಆಯ್ಕೆಗಳಿಗೆ ನಿಮ್ಮ ಸ್ವಂತ ಧನ್ಯವಾದಗಳು ಸೇರಿಸಬಹುದು. ಈ ಲೇಖನದಲ್ಲಿ ನಾವು PPSSPP ಕೋಡ್ ಉದಾಹರಣೆಯನ್ನು ಬಳಸಿಕೊಂಡು PVS-Studio ನೊಂದಿಗೆ ಕೆಲಸ ಮಾಡಲು ಟ್ರಾವಿಸ್ CI ಅನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡುತ್ತೇವೆ.

ಪರಿಚಯ

ಟ್ರಾವಿಸ್ ಸಿಐ ಸಾಫ್ಟ್‌ವೇರ್ ಅನ್ನು ನಿರ್ಮಿಸಲು ಮತ್ತು ಪರೀಕ್ಷಿಸಲು ವೆಬ್ ಸೇವೆಯಾಗಿದೆ. ಇದನ್ನು ಸಾಮಾನ್ಯವಾಗಿ ನಿರಂತರ ಏಕೀಕರಣ ಅಭ್ಯಾಸಗಳ ಜೊತೆಯಲ್ಲಿ ಬಳಸಲಾಗುತ್ತದೆ.

PPSSPP - ಪಿಎಸ್ಪಿ ಗೇಮ್ ಕನ್ಸೋಲ್ ಎಮ್ಯುಲೇಟರ್. ಸೋನಿ ಪಿಎಸ್ಪಿಗಾಗಿ ಉದ್ದೇಶಿಸಲಾದ ಡಿಸ್ಕ್ ಚಿತ್ರಗಳಿಂದ ಯಾವುದೇ ಆಟಗಳ ಉಡಾವಣೆಯನ್ನು ಅನುಕರಿಸಲು ಪ್ರೋಗ್ರಾಂ ಸಾಧ್ಯವಾಗುತ್ತದೆ. ಕಾರ್ಯಕ್ರಮವನ್ನು ನವೆಂಬರ್ 1, 2012 ರಂದು ಬಿಡುಗಡೆ ಮಾಡಲಾಯಿತು. PPSSPP GPL v2 ಅಡಿಯಲ್ಲಿ ಪರವಾನಗಿ ಪಡೆದಿದೆ. ಯಾರಾದರೂ ಸುಧಾರಣೆಗಳನ್ನು ಮಾಡಬಹುದು ಯೋಜನೆಯ ಮೂಲ ಕೋಡ್.

ಪಿವಿಎಸ್-ಸ್ಟುಡಿಯೋ - ಪ್ರೋಗ್ರಾಂ ಕೋಡ್‌ನಲ್ಲಿ ದೋಷಗಳು ಮತ್ತು ಸಂಭಾವ್ಯ ದುರ್ಬಲತೆಗಳನ್ನು ಹುಡುಕಲು ಸ್ಥಿರ ಕೋಡ್ ವಿಶ್ಲೇಷಕ. ಈ ಲೇಖನದಲ್ಲಿ, ಬದಲಾವಣೆಗಾಗಿ, ನಾವು PVS-ಸ್ಟುಡಿಯೋವನ್ನು ಡೆವಲಪರ್‌ಗಳ ಯಂತ್ರದಲ್ಲಿ ಸ್ಥಳೀಯವಾಗಿ ಪ್ರಾರಂಭಿಸುವುದಿಲ್ಲ, ಆದರೆ ಕ್ಲೌಡ್‌ನಲ್ಲಿ, ಮತ್ತು PPSSPP ಯಲ್ಲಿ ದೋಷಗಳನ್ನು ಹುಡುಕುತ್ತೇವೆ.

ಟ್ರಾವಿಸ್ CI ಅನ್ನು ಹೊಂದಿಸಲಾಗುತ್ತಿದೆ

ನಮಗೆ ಅಗತ್ಯವಿರುವ ಪ್ರಾಜೆಕ್ಟ್ ಇರುವ GitHub ನಲ್ಲಿ ನಮಗೆ ರೆಪೊಸಿಟರಿಯ ಅಗತ್ಯವಿದೆ, ಜೊತೆಗೆ PVS-ಸ್ಟುಡಿಯೋಗೆ ಕೀ (ನೀವು ಪಡೆಯಬಹುದು ಪ್ರಯೋಗ ಕೀ ಅಥವಾ ಮುಕ್ತ ಮೂಲ ಯೋಜನೆಗಳಿಗೆ ಉಚಿತ).

ಸೈಟ್ಗೆ ಹೋಗೋಣ ಟ್ರಾವಿಸ್ ಸಿಐ. ನಿಮ್ಮ GitHub ಖಾತೆಯನ್ನು ಬಳಸಿಕೊಂಡು ದೃಢೀಕರಣದ ನಂತರ, ನಾವು ರೆಪೊಸಿಟರಿಗಳ ಪಟ್ಟಿಯನ್ನು ನೋಡುತ್ತೇವೆ:

PSP ಗೇಮ್ ಕನ್ಸೋಲ್ ಎಮ್ಯುಲೇಟರ್ನ ಉದಾಹರಣೆಯನ್ನು ಬಳಸಿಕೊಂಡು ಟ್ರಾವಿಸ್ CI ನಲ್ಲಿ PVS-ಸ್ಟುಡಿಯೋವನ್ನು ಹೇಗೆ ಕಾನ್ಫಿಗರ್ ಮಾಡುವುದು
ಪರೀಕ್ಷೆಗಾಗಿ, ನಾನು PPSSPP ಅನ್ನು ಫೋರ್ಕ್ ಮಾಡಿದ್ದೇನೆ.

ನಾವು ಸಂಗ್ರಹಿಸಲು ಬಯಸುವ ರೆಪೊಸಿಟರಿಯನ್ನು ನಾವು ಸಕ್ರಿಯಗೊಳಿಸುತ್ತೇವೆ:

PSP ಗೇಮ್ ಕನ್ಸೋಲ್ ಎಮ್ಯುಲೇಟರ್ನ ಉದಾಹರಣೆಯನ್ನು ಬಳಸಿಕೊಂಡು ಟ್ರಾವಿಸ್ CI ನಲ್ಲಿ PVS-ಸ್ಟುಡಿಯೋವನ್ನು ಹೇಗೆ ಕಾನ್ಫಿಗರ್ ಮಾಡುವುದು
ಈ ಸಮಯದಲ್ಲಿ, ಟ್ರಾವಿಸ್ CI ನಮ್ಮ ಯೋಜನೆಯನ್ನು ನಿರ್ಮಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ ಏಕೆಂದರೆ ಕಟ್ಟಡಕ್ಕೆ ಯಾವುದೇ ಸೂಚನೆಗಳಿಲ್ಲ. ಆದ್ದರಿಂದ ಇದು ಸಂರಚನಾ ಸಮಯ.

ವಿಶ್ಲೇಷಣೆಯ ಸಮಯದಲ್ಲಿ, ಕೆಲವು ಅಸ್ಥಿರಗಳು ನಮಗೆ ಉಪಯುಕ್ತವಾಗುತ್ತವೆ, ಉದಾಹರಣೆಗೆ, PVS-ಸ್ಟುಡಿಯೊಗೆ ಕೀ, ಇದು ಕಾನ್ಫಿಗರೇಶನ್ ಫೈಲ್ನಲ್ಲಿ ನಿರ್ದಿಷ್ಟಪಡಿಸಲು ಅನಪೇಕ್ಷಿತವಾಗಿದೆ. ಆದ್ದರಿಂದ ಟ್ರಾವಿಸ್ CI ನಲ್ಲಿ ನಿರ್ಮಾಣ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಬಳಸಿಕೊಂಡು ಪರಿಸರ ವೇರಿಯಬಲ್‌ಗಳನ್ನು ಸೇರಿಸೋಣ:

PSP ಗೇಮ್ ಕನ್ಸೋಲ್ ಎಮ್ಯುಲೇಟರ್ನ ಉದಾಹರಣೆಯನ್ನು ಬಳಸಿಕೊಂಡು ಟ್ರಾವಿಸ್ CI ನಲ್ಲಿ PVS-ಸ್ಟುಡಿಯೋವನ್ನು ಹೇಗೆ ಕಾನ್ಫಿಗರ್ ಮಾಡುವುದು
ನಮಗೆ ಅಗತ್ಯವಿದೆ:

  • PVS_USERNAME - ಬಳಕೆದಾರಹೆಸರು
  • PVS_KEY - ಕೀ
  • MAIL_USER - ವರದಿಯನ್ನು ಕಳುಹಿಸಲು ಬಳಸಲಾಗುವ ಇಮೇಲ್
  • MAIL_PASSWORD - ಇಮೇಲ್ ಪಾಸ್‌ವರ್ಡ್

ಕೊನೆಯ ಎರಡು ಐಚ್ಛಿಕ. ಮೇಲ್ ಮೂಲಕ ಫಲಿತಾಂಶಗಳನ್ನು ಕಳುಹಿಸಲು ಇವುಗಳನ್ನು ಬಳಸಲಾಗುತ್ತದೆ. ನೀವು ಇನ್ನೊಂದು ರೀತಿಯಲ್ಲಿ ವರದಿಯನ್ನು ವಿತರಿಸಲು ಬಯಸಿದರೆ, ನೀವು ಅವುಗಳನ್ನು ಸೂಚಿಸುವ ಅಗತ್ಯವಿಲ್ಲ.

ಆದ್ದರಿಂದ, ನಮಗೆ ಅಗತ್ಯವಿರುವ ಪರಿಸರ ಅಸ್ಥಿರಗಳನ್ನು ನಾವು ಸೇರಿಸಿದ್ದೇವೆ:

PSP ಗೇಮ್ ಕನ್ಸೋಲ್ ಎಮ್ಯುಲೇಟರ್ನ ಉದಾಹರಣೆಯನ್ನು ಬಳಸಿಕೊಂಡು ಟ್ರಾವಿಸ್ CI ನಲ್ಲಿ PVS-ಸ್ಟುಡಿಯೋವನ್ನು ಹೇಗೆ ಕಾನ್ಫಿಗರ್ ಮಾಡುವುದು
ಈಗ ನಾವು ಫೈಲ್ ಅನ್ನು ರಚಿಸೋಣ .travis.yml ಮತ್ತು ಅದನ್ನು ಯೋಜನೆಯ ಮೂಲದಲ್ಲಿ ಇರಿಸಿ. PPSSPP ಈಗಾಗಲೇ ಟ್ರಾವಿಸ್ CI ಗಾಗಿ ಕಾನ್ಫಿಗರೇಶನ್ ಫೈಲ್ ಅನ್ನು ಹೊಂದಿತ್ತು, ಆದಾಗ್ಯೂ, ಇದು ತುಂಬಾ ದೊಡ್ಡದಾಗಿದೆ ಮತ್ತು ಉದಾಹರಣೆಗಾಗಿ ಸಂಪೂರ್ಣವಾಗಿ ಸೂಕ್ತವಲ್ಲ, ಆದ್ದರಿಂದ ನಾವು ಅದನ್ನು ಹೆಚ್ಚು ಸರಳಗೊಳಿಸಬೇಕಾಗಿತ್ತು ಮತ್ತು ಮೂಲಭೂತ ಅಂಶಗಳನ್ನು ಮಾತ್ರ ಬಿಡಬೇಕಾಗಿತ್ತು.

ಮೊದಲಿಗೆ, ನಾವು ವರ್ಚುವಲ್ ಗಣಕದಲ್ಲಿ ಬಳಸಲು ಬಯಸುವ ಭಾಷೆ, ಉಬುಂಟು ಲಿನಕ್ಸ್‌ನ ಆವೃತ್ತಿ ಮತ್ತು ನಿರ್ಮಾಣಕ್ಕೆ ಅಗತ್ಯವಾದ ಪ್ಯಾಕೇಜ್‌ಗಳನ್ನು ಸೂಚಿಸೋಣ:

language: cpp
dist: xenial

addons:
  apt:
    update: true
    packages:
      - ant
      - aria2
      - build-essential
      - cmake
      - libgl1-mesa-dev
      - libglu1-mesa-dev
      - libsdl2-dev
      - pv
      - sendemail
      - software-properties-common
    sources:
      - sourceline: 'ppa:ubuntu-toolchain-r/test'
      - sourceline: 'ppa:ubuntu-sdk-team/ppa'

ಪಟ್ಟಿ ಮಾಡಲಾದ ಎಲ್ಲಾ ಪ್ಯಾಕೇಜುಗಳು PPSSPP ಗಾಗಿ ಪ್ರತ್ಯೇಕವಾಗಿ ಅಗತ್ಯವಿದೆ.

ಈಗ ನಾವು ಅಸೆಂಬ್ಲಿ ಮ್ಯಾಟ್ರಿಕ್ಸ್ ಅನ್ನು ಸೂಚಿಸುತ್ತೇವೆ:

matrix:
  include:
    - os: linux
      compiler: "gcc"
      env: PPSSPP_BUILD_TYPE=Linux PVS_ANALYZE=Yes
    - os: linux
      compiler: "clang"
      env: PPSSPP_BUILD_TYPE=Linux

ವಿಭಾಗದ ಬಗ್ಗೆ ಸ್ವಲ್ಪ ಹೆಚ್ಚು ಮ್ಯಾಟ್ರಿಕ್ಸ್. ಟ್ರಾವಿಸ್ CI ಯಲ್ಲಿ, ಬಿಲ್ಡ್ ಆಯ್ಕೆಗಳನ್ನು ರಚಿಸಲು ಎರಡು ಮಾರ್ಗಗಳಿವೆ: ಮೊದಲನೆಯದು ಕಂಪೈಲರ್‌ಗಳು, ಆಪರೇಟಿಂಗ್ ಸಿಸ್ಟಮ್ ಪ್ರಕಾರಗಳು, ಪರಿಸರ ವೇರಿಯಬಲ್‌ಗಳು ಇತ್ಯಾದಿಗಳ ಪಟ್ಟಿಯನ್ನು ನಿರ್ದಿಷ್ಟಪಡಿಸುವುದು, ಅದರ ನಂತರ ಎಲ್ಲಾ ಸಂಭಾವ್ಯ ಸಂಯೋಜನೆಗಳ ಮ್ಯಾಟ್ರಿಕ್ಸ್ ಅನ್ನು ರಚಿಸಲಾಗುತ್ತದೆ; ಎರಡನೆಯದು ಮ್ಯಾಟ್ರಿಕ್ಸ್‌ನ ಸ್ಪಷ್ಟ ಸೂಚನೆಯಾಗಿದೆ. ಸಹಜವಾಗಿ, ನೀವು ಈ ಎರಡು ವಿಧಾನಗಳನ್ನು ಸಂಯೋಜಿಸಬಹುದು ಮತ್ತು ವಿಶಿಷ್ಟವಾದ ಪ್ರಕರಣವನ್ನು ಸೇರಿಸಬಹುದು, ಅಥವಾ, ಇದಕ್ಕೆ ವಿರುದ್ಧವಾಗಿ, ವಿಭಾಗವನ್ನು ಬಳಸಿಕೊಂಡು ಅದನ್ನು ಹೊರಗಿಡಬಹುದು ಬಹಿಷ್ಕರಿಸು. ನೀವು ಇದರ ಬಗ್ಗೆ ಇನ್ನಷ್ಟು ಓದಬಹುದು ಟ್ರಾವಿಸ್ CI ದಸ್ತಾವೇಜನ್ನು.

ಪ್ರಾಜೆಕ್ಟ್-ನಿರ್ದಿಷ್ಟ ಅಸೆಂಬ್ಲಿ ಸೂಚನೆಗಳನ್ನು ಒದಗಿಸುವುದು ಮಾತ್ರ ಉಳಿದಿದೆ:

before_install:
  - travis_retry bash .travis.sh travis_before_install

install:
  - travis_retry bash .travis.sh travis_install

script:
  - bash .travis.sh travis_script

after_success:
  - bash .travis.sh travis_after_success

ಟ್ರಾವಿಸ್ CI ಒಂದು ವರ್ಚುವಲ್ ಗಣಕದ ಜೀವನದ ವಿವಿಧ ಹಂತಗಳಿಗೆ ನಿಮ್ಮ ಸ್ವಂತ ಆಜ್ಞೆಗಳನ್ನು ಸೇರಿಸಲು ನಿಮಗೆ ಅನುಮತಿಸುತ್ತದೆ. ವಿಭಾಗ ಮೊದಲು_ಸ್ಥಾಪಿಸು ಪ್ಯಾಕೇಜ್‌ಗಳನ್ನು ಸ್ಥಾಪಿಸುವ ಮೊದಲು ಕಾರ್ಯಗತಗೊಳಿಸಲಾಗುತ್ತದೆ. ನಂತರ ಅನುಸ್ಥಾಪಿಸು, ಇದು ಪಟ್ಟಿಯಿಂದ ಪ್ಯಾಕೇಜುಗಳ ಸ್ಥಾಪನೆಯನ್ನು ಅನುಸರಿಸುತ್ತದೆ addons.aptನಾವು ಮೇಲೆ ಸೂಚಿಸಿದ. ಅಸೆಂಬ್ಲಿ ಸ್ವತಃ ನಡೆಯುತ್ತದೆ ಸ್ಕ್ರಿಪ್ಟ್. ಎಲ್ಲವೂ ಸರಿಯಾಗಿ ನಡೆದರೆ, ನಾವು ನಮ್ಮನ್ನು ಕಂಡುಕೊಳ್ಳುತ್ತೇವೆ ನಂತರ_ಯಶಸ್ಸು (ಈ ವಿಭಾಗದಲ್ಲಿಯೇ ನಾವು ಸ್ಥಿರ ವಿಶ್ಲೇಷಣೆಯನ್ನು ನಡೆಸುತ್ತೇವೆ). ಇವುಗಳು ಮಾರ್ಪಡಿಸಬಹುದಾದ ಎಲ್ಲಾ ಹಂತಗಳಲ್ಲ, ನಿಮಗೆ ಹೆಚ್ಚಿನ ಅಗತ್ಯವಿದ್ದರೆ, ನೀವು ನೋಡಬೇಕು ಟ್ರಾವಿಸ್ CI ದಸ್ತಾವೇಜನ್ನು.

ಓದುವ ಅನುಕೂಲಕ್ಕಾಗಿ, ಆಜ್ಞೆಗಳನ್ನು ಪ್ರತ್ಯೇಕ ಸ್ಕ್ರಿಪ್ಟ್‌ನಲ್ಲಿ ಇರಿಸಲಾಗಿದೆ .travis.sh, ಇದು ಯೋಜನೆಯ ಮೂಲದಲ್ಲಿ ಇರಿಸಲಾಗಿದೆ.

ಆದ್ದರಿಂದ ನಾವು ಈ ಕೆಳಗಿನ ಫೈಲ್ ಅನ್ನು ಹೊಂದಿದ್ದೇವೆ .travis.yml:

language: cpp
dist: xenial

addons:
  apt:
    update: true
    packages:
      - ant
      - aria2
      - build-essential
      - cmake
      - libgl1-mesa-dev
      - libglu1-mesa-dev
      - libsdl2-dev
      - pv
      - sendemail
      - software-properties-common
    sources:
      - sourceline: 'ppa:ubuntu-toolchain-r/test'
      - sourceline: 'ppa:ubuntu-sdk-team/ppa'

matrix:
  include:
    - os: linux
      compiler: "gcc"
      env: PVS_ANALYZE=Yes
    - os: linux
      compiler: "clang"

before_install:
  - travis_retry bash .travis.sh travis_before_install

install:
  - travis_retry bash .travis.sh travis_install

script:
  - bash .travis.sh travis_script

after_success:
  - bash .travis.sh travis_after_success

ಪ್ಯಾಕೇಜುಗಳನ್ನು ಸ್ಥಾಪಿಸುವ ಮೊದಲು, ನಾವು ಉಪ ಮಾಡ್ಯೂಲ್‌ಗಳನ್ನು ನವೀಕರಿಸುತ್ತೇವೆ. PPSSPP ಅನ್ನು ನಿರ್ಮಿಸಲು ಇದು ಅಗತ್ಯವಿದೆ. ಮೊದಲ ಕಾರ್ಯವನ್ನು ಸೇರಿಸೋಣ .travis.sh (ವಿಸ್ತರಣೆ ಗಮನಿಸಿ):

travis_before_install() {
  git submodule update --init --recursive
}

ಈಗ ನಾವು ಟ್ರಾವಿಸ್ CI ನಲ್ಲಿ PVS-ಸ್ಟುಡಿಯೊದ ಸ್ವಯಂಚಾಲಿತ ಉಡಾವಣೆಯನ್ನು ಹೊಂದಿಸಲು ನೇರವಾಗಿ ಬರುತ್ತೇವೆ. ಮೊದಲು ನಾವು ಸಿಸ್ಟಂನಲ್ಲಿ ಪಿವಿಎಸ್-ಸ್ಟುಡಿಯೋ ಪ್ಯಾಕೇಜ್ ಅನ್ನು ಸ್ಥಾಪಿಸಬೇಕಾಗಿದೆ:

travis_install() {
  if [ "$CXX" = "g++" ]; then
    sudo apt-get install -qq g++-4.8
  fi
  
  if [ "$PVS_ANALYZE" = "Yes" ]; then
    wget -q -O - https://files.viva64.com/etc/pubkey.txt 
      | sudo apt-key add -
    sudo wget -O /etc/apt/sources.list.d/viva64.list 
      https://files.viva64.com/etc/viva64.list  
    
    sudo apt-get update -qq
    sudo apt-get install -qq pvs-studio 
                             libio-socket-ssl-perl 
                             libnet-ssleay-perl
  fi
    
  download_extract 
    "https://cmake.org/files/v3.6/cmake-3.6.2-Linux-x86_64.tar.gz" 
    cmake-3.6.2-Linux-x86_64.tar.gz
}

ಕಾರ್ಯದ ಆರಂಭದಲ್ಲಿ travis_install ಪರಿಸರ ವೇರಿಯಬಲ್‌ಗಳನ್ನು ಬಳಸಿಕೊಂಡು ನಮಗೆ ಅಗತ್ಯವಿರುವ ಕಂಪೈಲರ್‌ಗಳನ್ನು ನಾವು ಸ್ಥಾಪಿಸುತ್ತೇವೆ. ನಂತರ ವೇರಿಯಬಲ್ ವೇಳೆ $PVS_ANALYZE ಮೌಲ್ಯವನ್ನು ಸಂಗ್ರಹಿಸುತ್ತದೆ ಹೌದು (ನಾವು ಅದನ್ನು ವಿಭಾಗದಲ್ಲಿ ಸೂಚಿಸಿದ್ದೇವೆ ಕಳುಹಿಸು ಬಿಲ್ಡ್ ಮ್ಯಾಟ್ರಿಕ್ಸ್ ಕಾನ್ಫಿಗರೇಶನ್ ಸಮಯದಲ್ಲಿ), ನಾವು ಪ್ಯಾಕೇಜ್ ಅನ್ನು ಸ್ಥಾಪಿಸುತ್ತೇವೆ pvs-ಸ್ಟುಡಿಯೋ. ಇದರ ಜೊತೆಗೆ, ಪ್ಯಾಕೇಜ್ಗಳನ್ನು ಸಹ ಸೂಚಿಸಲಾಗುತ್ತದೆ ಲಿಬಿಯೋ-ಸಾಕೆಟ್-ಎಸ್ಎಸ್ಎಲ್-ಪರ್ಲ್ и libnet-ssley-perl, ಆದಾಗ್ಯೂ, ಮೇಲಿಂಗ್ ಫಲಿತಾಂಶಗಳಿಗೆ ಅವು ಅಗತ್ಯವಿದೆ, ಆದ್ದರಿಂದ ನಿಮ್ಮ ವರದಿಯನ್ನು ತಲುಪಿಸಲು ನೀವು ಇನ್ನೊಂದು ವಿಧಾನವನ್ನು ಆರಿಸಿಕೊಂಡರೆ ಅವುಗಳು ಅಗತ್ಯವಿಲ್ಲ.

ಕಾರ್ಯ download_extract ನಿರ್ದಿಷ್ಟಪಡಿಸಿದ ಆರ್ಕೈವ್ ಅನ್ನು ಡೌನ್‌ಲೋಡ್ ಮಾಡುತ್ತದೆ ಮತ್ತು ಅನ್ಪ್ಯಾಕ್ ಮಾಡುತ್ತದೆ:

download_extract() {
  aria2c -x 16 $1 -o $2
  tar -xf $2
}

ಯೋಜನೆಯನ್ನು ಒಟ್ಟಿಗೆ ಸೇರಿಸುವ ಸಮಯ. ಇದು ವಿಭಾಗದಲ್ಲಿ ಸಂಭವಿಸುತ್ತದೆ ಸ್ಕ್ರಿಪ್ಟ್:

travis_script() {
  if [ -d cmake-3.6.2-Linux-x86_64 ]; then
    export PATH=$(pwd)/cmake-3.6.2-Linux-x86_64/bin:$PATH
  fi
  
  CMAKE_ARGS="-DHEADLESS=ON ${CMAKE_ARGS}"
  if [ "$PVS_ANALYZE" = "Yes" ]; then
    CMAKE_ARGS="-DCMAKE_EXPORT_COMPILE_COMMANDS=On ${CMAKE_ARGS}"
  fi
  cmake $CMAKE_ARGS CMakeLists.txt
  make
}

ವಾಸ್ತವವಾಗಿ, ಈ ಸಾಲುಗಳನ್ನು ಹೊರತುಪಡಿಸಿ ಇದು ಸರಳೀಕೃತ ಮೂಲ ಸಂರಚನೆಯಾಗಿದೆ:

if [ "$PVS_ANALYZE" = "Yes" ]; then
  CMAKE_ARGS="-DCMAKE_EXPORT_COMPILE_COMMANDS=On ${CMAKE_ARGS}"
fi

ಕೋಡ್‌ನ ಈ ವಿಭಾಗದಲ್ಲಿ ನಾವು ಹೊಂದಿಸಿದ್ದೇವೆ ಸಿಮೇಕ್ ಸಂಕಲನ ಆಜ್ಞೆಗಳನ್ನು ರಫ್ತು ಮಾಡಲು ಫ್ಲ್ಯಾಗ್. ಸ್ಥಿರ ಕೋಡ್ ವಿಶ್ಲೇಷಕಕ್ಕೆ ಇದು ಅವಶ್ಯಕವಾಗಿದೆ. ಲೇಖನದಲ್ಲಿ ನೀವು ಇದರ ಬಗ್ಗೆ ಇನ್ನಷ್ಟು ಓದಬಹುದು "Linux ಮತ್ತು macOS ನಲ್ಲಿ PVS-ಸ್ಟುಡಿಯೋವನ್ನು ಹೇಗೆ ಚಲಾಯಿಸುವುದು".

ಅಸೆಂಬ್ಲಿ ಯಶಸ್ವಿಯಾದರೆ, ನಾವು ಪಡೆಯುತ್ತೇವೆ ನಂತರ_ಯಶಸ್ಸು, ಅಲ್ಲಿ ನಾವು ಸ್ಥಿರ ವಿಶ್ಲೇಷಣೆ ನಡೆಸುತ್ತೇವೆ:

travis_after_success() {
  if [ "$PVS_ANALYZE" = "Yes" ]; then
    pvs-studio-analyzer credentials $PVS_USERNAME $PVS_KEY -o PVS-Studio.lic
    pvs-studio-analyzer analyze -j2 -l PVS-Studio.lic 
                                    -o PVS-Studio-${CC}.log 
                                    --disableLicenseExpirationCheck
    
    plog-converter -t html PVS-Studio-${CC}.log -o PVS-Studio-${CC}.html
    sendemail -t [email protected] 
              -u "PVS-Studio $CC report, commit:$TRAVIS_COMMIT" 
              -m "PVS-Studio $CC report, commit:$TRAVIS_COMMIT" 
              -s smtp.gmail.com:587 
              -xu $MAIL_USER 
              -xp $MAIL_PASSWORD 
              -o tls=yes 
              -f $MAIL_USER 
              -a PVS-Studio-${CC}.log PVS-Studio-${CC}.html
  fi
}

ಕೆಳಗಿನ ಸಾಲುಗಳನ್ನು ಹತ್ತಿರದಿಂದ ನೋಡೋಣ:

pvs-studio-analyzer credentials $PVS_USERNAME $PVS_KEY -o PVS-Studio.lic
pvs-studio-analyzer analyze -j2 -l PVS-Studio.lic 
                                -o PVS-Studio-${CC}.log 
                                --disableLicenseExpirationCheck
plog-converter -t html PVS-Studio-${CC}.log -o PVS-Studio-${CC}.html

ಮೊದಲ ಸಾಲು ಟ್ರಾವಿಸ್ CI ಪರಿಸರದ ವೇರಿಯೇಬಲ್‌ಗಳನ್ನು ಹೊಂದಿಸುವಾಗ ನಾವು ಪ್ರಾರಂಭದಲ್ಲಿಯೇ ನಿರ್ದಿಷ್ಟಪಡಿಸಿದ ಬಳಕೆದಾರಹೆಸರು ಮತ್ತು ಕೀಲಿಯಿಂದ ಪರವಾನಗಿ ಫೈಲ್ ಅನ್ನು ರಚಿಸುತ್ತದೆ.

ಎರಡನೇ ಸಾಲು ನೇರವಾಗಿ ವಿಶ್ಲೇಷಣೆಯನ್ನು ಪ್ರಾರಂಭಿಸುತ್ತದೆ. ಧ್ವಜ -ಜೆ ವಿಶ್ಲೇಷಣೆಗಾಗಿ ಎಳೆಗಳ ಸಂಖ್ಯೆಯನ್ನು ಹೊಂದಿಸುತ್ತದೆ, ಧ್ವಜ -ಎಲ್ ಪರವಾನಗಿ, ಧ್ವಜವನ್ನು ಸೂಚಿಸುತ್ತದೆ -ಒ ಲಾಗ್‌ಗಳನ್ನು ಔಟ್‌ಪುಟ್ ಮಾಡಲು ಫೈಲ್ ಮತ್ತು ಫ್ಲ್ಯಾಗ್ ಅನ್ನು ವಿವರಿಸುತ್ತದೆ -ಅಶಕ್ತಗೊಳಿಸು ಪರವಾನಗಿ ಮುಕ್ತಾಯ ಪರಿಶೀಲನೆ ಪೂರ್ವನಿಯೋಜಿತವಾಗಿ ಪ್ರಾಯೋಗಿಕ ಆವೃತ್ತಿಗಳಿಗೆ ಅಗತ್ಯವಿದೆ pvs-ಸ್ಟುಡಿಯೋ-ವಿಶ್ಲೇಷಕ ಪರವಾನಗಿ ಅವಧಿ ಮುಗಿಯಲಿದೆ ಎಂದು ಬಳಕೆದಾರರಿಗೆ ಎಚ್ಚರಿಕೆ ನೀಡುತ್ತದೆ. ಇದು ಸಂಭವಿಸದಂತೆ ತಡೆಯಲು, ನೀವು ಈ ಫ್ಲ್ಯಾಗ್ ಅನ್ನು ನಿರ್ದಿಷ್ಟಪಡಿಸಬಹುದು.

ಲಾಗ್ ಫೈಲ್ ಕಚ್ಚಾ ಔಟ್‌ಪುಟ್ ಅನ್ನು ಹೊಂದಿದ್ದು ಅದನ್ನು ಪರಿವರ್ತಿಸದೆ ಓದಲಾಗುವುದಿಲ್ಲ, ಆದ್ದರಿಂದ ನೀವು ಮೊದಲು ಫೈಲ್ ಅನ್ನು ಓದುವಂತೆ ಮಾಡಬೇಕು. ಲಾಗ್‌ಗಳನ್ನು ಹಾದು ಹೋಗೋಣ ಪ್ಲಗ್-ಪರಿವರ್ತಕ, ಮತ್ತು ಔಟ್ಪುಟ್ ಒಂದು html ಫೈಲ್ ಆಗಿದೆ.

ಈ ಉದಾಹರಣೆಯಲ್ಲಿ, ಆಜ್ಞೆಯನ್ನು ಬಳಸಿಕೊಂಡು ಮೇಲ್ ಮೂಲಕ ವರದಿಗಳನ್ನು ಕಳುಹಿಸಲು ನಾನು ನಿರ್ಧರಿಸಿದೆ ಇಮೇಲ್ ಕಳುಹಿಸಿ.

ಪರಿಣಾಮವಾಗಿ, ನಾವು ಈ ಕೆಳಗಿನ ಫೈಲ್ ಅನ್ನು ಪಡೆದುಕೊಂಡಿದ್ದೇವೆ .travis.sh:

#/bin/bash

travis_before_install() {
  git submodule update --init --recursive
}

download_extract() {
  aria2c -x 16 $1 -o $2
  tar -xf $2
}

travis_install() {
  if [ "$CXX" = "g++" ]; then
    sudo apt-get install -qq g++-4.8
  fi
  
  if [ "$PVS_ANALYZE" = "Yes" ]; then
    wget -q -O - https://files.viva64.com/etc/pubkey.txt 
      | sudo apt-key add -
    sudo wget -O /etc/apt/sources.list.d/viva64.list 
      https://files.viva64.com/etc/viva64.list  
    
    sudo apt-get update -qq
    sudo apt-get install -qq pvs-studio 
                             libio-socket-ssl-perl 
                             libnet-ssleay-perl
  fi
    
  download_extract 
    "https://cmake.org/files/v3.6/cmake-3.6.2-Linux-x86_64.tar.gz" 
    cmake-3.6.2-Linux-x86_64.tar.gz
}
travis_script() {
  if [ -d cmake-3.6.2-Linux-x86_64 ]; then
    export PATH=$(pwd)/cmake-3.6.2-Linux-x86_64/bin:$PATH
  fi
  
  CMAKE_ARGS="-DHEADLESS=ON ${CMAKE_ARGS}"
  if [ "$PVS_ANALYZE" = "Yes" ]; then
    CMAKE_ARGS="-DCMAKE_EXPORT_COMPILE_COMMANDS=On ${CMAKE_ARGS}"
  fi
  cmake $CMAKE_ARGS CMakeLists.txt
  make
}
travis_after_success() {
  if [ "$PVS_ANALYZE" = "Yes" ]; then
    pvs-studio-analyzer credentials $PVS_USERNAME $PVS_KEY -o PVS-Studio.lic
    pvs-studio-analyzer analyze -j2 -l PVS-Studio.lic 
                                    -o PVS-Studio-${CC}.log 
                                    --disableLicenseExpirationCheck
    
    plog-converter -t html PVS-Studio-${CC}.log -o PVS-Studio-${CC}.html
    sendemail -t [email protected] 
              -u "PVS-Studio $CC report, commit:$TRAVIS_COMMIT" 
              -m "PVS-Studio $CC report, commit:$TRAVIS_COMMIT" 
              -s smtp.gmail.com:587 
              -xu $MAIL_USER 
              -xp $MAIL_PASSWORD 
              -o tls=yes 
              -f $MAIL_USER 
              -a PVS-Studio-${CC}.log PVS-Studio-${CC}.html
  fi
}
set -e
set -x

$1;

ಈಗ ಬದಲಾವಣೆಗಳನ್ನು ಜಿಟ್ ರೆಪೊಸಿಟರಿಗೆ ತಳ್ಳುವ ಸಮಯ ಬಂದಿದೆ, ಅದರ ನಂತರ ಟ್ರಾವಿಸ್ ಸಿಐ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ನಿರ್ಮಾಣವನ್ನು ರನ್ ಮಾಡುತ್ತದೆ. ಬಿಲ್ಡ್ ವರದಿಗಳಿಗೆ ಹೋಗಲು "ppsspp" ಮೇಲೆ ಕ್ಲಿಕ್ ಮಾಡಿ:

PSP ಗೇಮ್ ಕನ್ಸೋಲ್ ಎಮ್ಯುಲೇಟರ್ನ ಉದಾಹರಣೆಯನ್ನು ಬಳಸಿಕೊಂಡು ಟ್ರಾವಿಸ್ CI ನಲ್ಲಿ PVS-ಸ್ಟುಡಿಯೋವನ್ನು ಹೇಗೆ ಕಾನ್ಫಿಗರ್ ಮಾಡುವುದು
ಪ್ರಸ್ತುತ ನಿರ್ಮಾಣದ ಅವಲೋಕನವನ್ನು ನಾವು ನೋಡುತ್ತೇವೆ:

PSP ಗೇಮ್ ಕನ್ಸೋಲ್ ಎಮ್ಯುಲೇಟರ್ನ ಉದಾಹರಣೆಯನ್ನು ಬಳಸಿಕೊಂಡು ಟ್ರಾವಿಸ್ CI ನಲ್ಲಿ PVS-ಸ್ಟುಡಿಯೋವನ್ನು ಹೇಗೆ ಕಾನ್ಫಿಗರ್ ಮಾಡುವುದು
ನಿರ್ಮಾಣವು ಯಶಸ್ವಿಯಾಗಿ ಪೂರ್ಣಗೊಂಡರೆ, ಸ್ಥಿರ ವಿಶ್ಲೇಷಣೆಯ ಫಲಿತಾಂಶಗಳೊಂದಿಗೆ ನಾವು ಇಮೇಲ್ ಅನ್ನು ಸ್ವೀಕರಿಸುತ್ತೇವೆ. ಸಹಜವಾಗಿ, ವರದಿಯನ್ನು ಸ್ವೀಕರಿಸಲು ಮೇಲಿಂಗ್ ಏಕೈಕ ಮಾರ್ಗವಲ್ಲ. ನೀವು ಯಾವುದೇ ಅನುಷ್ಠಾನ ವಿಧಾನವನ್ನು ಆಯ್ಕೆ ಮಾಡಬಹುದು. ಆದರೆ ನಿರ್ಮಾಣ ಪೂರ್ಣಗೊಂಡ ನಂತರ, ವರ್ಚುವಲ್ ಯಂತ್ರ ಫೈಲ್‌ಗಳನ್ನು ಪ್ರವೇಶಿಸಲು ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ ಎಂಬುದನ್ನು ನೆನಪಿಟ್ಟುಕೊಳ್ಳುವುದು ಬಹಳ ಮುಖ್ಯ.

ದೋಷ ಸಾರಾಂಶ

ನಾವು ಅತ್ಯಂತ ಕಷ್ಟಕರವಾದ ಭಾಗವನ್ನು ಯಶಸ್ವಿಯಾಗಿ ಪೂರ್ಣಗೊಳಿಸಿದ್ದೇವೆ. ಈಗ ನಮ್ಮ ಎಲ್ಲಾ ಪ್ರಯತ್ನಗಳು ಯೋಗ್ಯವಾಗಿವೆ ಎಂದು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳೋಣ. ಮೇಲ್ ಮೂಲಕ ನನಗೆ ಬಂದ ಸ್ಥಿರ ವಿಶ್ಲೇಷಣೆಯ ವರದಿಯಿಂದ ಕೆಲವು ಆಸಕ್ತಿದಾಯಕ ಅಂಶಗಳನ್ನು ನೋಡೋಣ (ನಾನು ಅದನ್ನು ಸೂಚಿಸಿದ್ದು ಯಾವುದಕ್ಕೂ ಅಲ್ಲ).

ಅಪಾಯಕಾರಿ ಆಪ್ಟಿಮೈಸೇಶನ್

void sha1( unsigned char *input, int ilen, unsigned char output[20] )
{
  sha1_context ctx;

  sha1_starts( &ctx );
  sha1_update( &ctx, input, ilen );
  sha1_finish( &ctx, output );

  memset( &ctx, 0, sizeof( sha1_context ) );
}

PVS-ಸ್ಟುಡಿಯೋ ಎಚ್ಚರಿಕೆ: V597 ಕಂಪೈಲರ್ 'ಮೆಮ್‌ಸೆಟ್' ಫಂಕ್ಷನ್ ಕರೆಯನ್ನು ಅಳಿಸಬಹುದು, ಇದನ್ನು 'ಸಮ್' ಬಫರ್ ಅನ್ನು ಫ್ಲಶ್ ಮಾಡಲು ಬಳಸಲಾಗುತ್ತದೆ. ಖಾಸಗಿ ಡೇಟಾವನ್ನು ಅಳಿಸಲು RtlSecureZeroMemory() ಕಾರ್ಯವನ್ನು ಬಳಸಬೇಕು. sha1.cpp 325

ಈ ಕೋಡ್ ತುಣುಕು ಸುರಕ್ಷಿತ ಹ್ಯಾಶಿಂಗ್ ಮಾಡ್ಯೂಲ್‌ನಲ್ಲಿದೆ, ಆದಾಗ್ಯೂ, ಇದು ಗಂಭೀರವಾದ ಭದ್ರತಾ ದೋಷವನ್ನು ಹೊಂದಿದೆ (CWE-14) ಡೀಬಗ್ ಆವೃತ್ತಿಯನ್ನು ಕಂಪೈಲ್ ಮಾಡುವಾಗ ರಚಿಸಲಾದ ಅಸೆಂಬ್ಲಿ ಪಟ್ಟಿಯನ್ನು ನೋಡೋಣ:

; Line 355
  mov r8d, 20
  xor edx, edx
  lea rcx, QWORD PTR sum$[rsp]
  call memset
; Line 356

ಎಲ್ಲವೂ ಕ್ರಮದಲ್ಲಿ ಮತ್ತು ಕಾರ್ಯದಲ್ಲಿದೆ ಮೆಮ್ಸೆಟ್ ಕಾರ್ಯಗತಗೊಳಿಸಲಾಗುತ್ತದೆ, ಇದರಿಂದಾಗಿ RAM ನಲ್ಲಿ ಪ್ರಮುಖ ಡೇಟಾವನ್ನು ತಿದ್ದಿ ಬರೆಯಲಾಗುತ್ತದೆ, ಆದಾಗ್ಯೂ, ಇನ್ನೂ ಸಂತೋಷಪಡಬೇಡಿ. ಆಪ್ಟಿಮೈಸೇಶನ್‌ನೊಂದಿಗೆ ಬಿಡುಗಡೆ ಆವೃತ್ತಿಯ ಅಸೆಂಬ್ಲಿ ಪಟ್ಟಿಯನ್ನು ನೋಡೋಣ:

; 354  :
; 355  :  memset( sum, 0, sizeof( sum ) );
; 356  :}

ಪಟ್ಟಿಯಿಂದ ನೋಡಬಹುದಾದಂತೆ, ಕಂಪೈಲರ್ ಕರೆಯನ್ನು ನಿರ್ಲಕ್ಷಿಸಿದೆ ಮೆಮ್ಸೆಟ್. ಈ ಕಾರ್ಯದಲ್ಲಿ ಎಂದು ವಾಸ್ತವವಾಗಿ ಕಾರಣ sha1 ಕರೆ ನಂತರ ಮೆಮ್ಸೆಟ್ ರಚನೆಗೆ ಹೆಚ್ಚಿನ ಉಲ್ಲೇಖವಿಲ್ಲ ctx. ಆದ್ದರಿಂದ, ಭವಿಷ್ಯದಲ್ಲಿ ಬಳಸದ ಮೆಮೊರಿಯನ್ನು ಓವರ್‌ರೈಟ್ ಮಾಡುವ ಪ್ರೊಸೆಸರ್ ಸಮಯವನ್ನು ವ್ಯರ್ಥ ಮಾಡುವುದರಲ್ಲಿ ಕಂಪೈಲರ್ ಯಾವುದೇ ಅರ್ಥವನ್ನು ಕಾಣುವುದಿಲ್ಲ. ಕಾರ್ಯವನ್ನು ಬಳಸಿಕೊಂಡು ನೀವು ಇದನ್ನು ಸರಿಪಡಿಸಬಹುದು RtlSecureZeroMemory ಅಥವಾ ಹೋಲುತ್ತದೆ ಅವಳಿಗೆ.

ಸರಿಯಾಗಿ:

void sha1( unsigned char *input, int ilen, unsigned char output[20] )
{
  sha1_context ctx;

  sha1_starts( &ctx );
  sha1_update( &ctx, input, ilen );
  sha1_finish( &ctx, output );

  RtlSecureZeroMemory(&ctx, sizeof( sha1_context ) );
} 

ಅನಗತ್ಯ ಹೋಲಿಕೆ

static u32 sceAudioOutputPannedBlocking
             (u32 chan, int leftvol, int rightvol, u32 samplePtr) {
  int result = 0;
  // For some reason, this is the only one that checks for negative.
  if (leftvol > 0xFFFF || rightvol > 0xFFFF || leftvol < 0 || rightvol < 0) {
    ....
  } else {
    if (leftvol >= 0) {
      chans[chan].leftVolume = leftvol;
    }
    if (rightvol >= 0) {
      chans[chan].rightVolume = rightvol;
    }
    chans[chan].sampleAddress = samplePtr;
    result = __AudioEnqueue(chans[chan], chan, true);
  }
}

PVS-ಸ್ಟುಡಿಯೋ ಎಚ್ಚರಿಕೆ: V547 ಅಭಿವ್ಯಕ್ತಿ 'leftvol >= 0' ಯಾವಾಗಲೂ ನಿಜ. sceAudio.cpp 120

ಮೊದಲನೆಯದಕ್ಕೆ ಬೇರೆ ಶಾಖೆಗೆ ಗಮನ ಕೊಡಿ if. ಎಲ್ಲಾ ಷರತ್ತುಗಳಿದ್ದರೆ ಮಾತ್ರ ಕೋಡ್ ಅನ್ನು ಕಾರ್ಯಗತಗೊಳಿಸಲಾಗುತ್ತದೆ leftvol > 0xFFFF || rightvol > 0xFFFF || leftvol < 0 || rightvol <0 ಸುಳ್ಳಾಗಿ ಪರಿಣಮಿಸುತ್ತದೆ. ಆದ್ದರಿಂದ, ನಾವು ಈ ಕೆಳಗಿನ ಹೇಳಿಕೆಗಳನ್ನು ಪಡೆಯುತ್ತೇವೆ, ಅದು ಬೇರೆ ಶಾಖೆಗೆ ನಿಜವಾಗುತ್ತದೆ: leftvol <= 0xFFFF, rightvol <= 0xFFFF, ಎಡ ಸಂಪುಟ >= 0 и rightvol >= 0. ಕೊನೆಯ ಎರಡು ಹೇಳಿಕೆಗಳನ್ನು ಗಮನಿಸಿ. ಈ ಕೋಡ್‌ನ ಕಾರ್ಯಗತಗೊಳಿಸಲು ಅಗತ್ಯವಾದ ಸ್ಥಿತಿ ಏನೆಂದು ಪರಿಶೀಲಿಸಲು ಇದು ಅರ್ಥಪೂರ್ಣವಾಗಿದೆಯೇ?

ಆದ್ದರಿಂದ ನಾವು ಈ ಷರತ್ತುಬದ್ಧ ಹೇಳಿಕೆಗಳನ್ನು ಸುರಕ್ಷಿತವಾಗಿ ತೆಗೆದುಹಾಕಬಹುದು:

static u32 sceAudioOutputPannedBlocking
(u32 chan, int leftvol, int rightvol, u32 samplePtr) {
  int result = 0;
  // For some reason, this is the only one that checks for negative.
  if (leftvol > 0xFFFF || rightvol > 0xFFFF || leftvol < 0 || rightvol < 0) {
    ....
  } else {
    chans[chan].leftVolume = leftvol;
    chans[chan].rightVolume = rightvol;

    chans[chan].sampleAddress = samplePtr;
    result = __AudioEnqueue(chans[chan], chan, true);
  }
}

ಇನ್ನೊಂದು ಸನ್ನಿವೇಶ. ಈ ಅನಗತ್ಯ ಪರಿಸ್ಥಿತಿಗಳ ಹಿಂದೆ ಕೆಲವು ರೀತಿಯ ದೋಷ ಅಡಗಿದೆ. ಬಹುಶಃ ಅವರು ಅಗತ್ಯವಿರುವದನ್ನು ಪರಿಶೀಲಿಸಲಿಲ್ಲ.

Ctrl+C Ctrl+V ಸ್ಟ್ರೈಕ್ ಬ್ಯಾಕ್

static u32 scePsmfSetPsmf(u32 psmfStruct, u32 psmfData) {
  if (!Memory::IsValidAddress(psmfData) ||
      !Memory::IsValidAddress(psmfData)) {
    return hleReportError(ME, SCE_KERNEL_ERROR_ILLEGAL_ADDRESS, "bad address");
  }
  ....
}

V501 '||' ನ ಎಡಕ್ಕೆ ಮತ್ತು ಬಲಕ್ಕೆ ಒಂದೇ ರೀತಿಯ ಉಪ-ಅಭಿವ್ಯಕ್ತಿಗಳಿವೆ '!ಮೆಮೊರಿ::IsValidAddress(psmfData)' ಆಪರೇಟರ್. scePsmf.cpp 703

ಒಳಗಿನ ಚೆಕ್ಗೆ ಗಮನ ಕೊಡಿ if. ವಿಳಾಸವು ಮಾನ್ಯವಾಗಿದೆಯೇ ಎಂದು ನಾವು ಪರಿಶೀಲಿಸುವುದು ವಿಚಿತ್ರವಾಗಿದೆ ಎಂದು ನಿಮಗೆ ಅನಿಸುವುದಿಲ್ಲವೇ? psmfData, ಎರಡು ಪಟ್ಟು ಹೆಚ್ಚು? ಆದ್ದರಿಂದ ಇದು ನನಗೆ ವಿಚಿತ್ರವೆನಿಸುತ್ತದೆ... ವಾಸ್ತವವಾಗಿ, ಇದು ಸಹಜವಾಗಿ, ಮುದ್ರಣದೋಷವಾಗಿದೆ ಮತ್ತು ಎರಡೂ ಇನ್‌ಪುಟ್ ನಿಯತಾಂಕಗಳನ್ನು ಪರಿಶೀಲಿಸುವುದು ಕಲ್ಪನೆಯಾಗಿದೆ.

ಸರಿಯಾದ ಆಯ್ಕೆ:

static u32 scePsmfSetPsmf(u32 psmfStruct, u32 psmfData) {
  if (!Memory::IsValidAddress(psmfStruct) ||
      !Memory::IsValidAddress(psmfData)) {
    return hleReportError(ME, SCE_KERNEL_ERROR_ILLEGAL_ADDRESS, "bad address");
  }
  ....
}

ಮರೆತುಹೋದ ವೇರಿಯಬಲ್

extern void ud_translate_att(
  int size = 0;
  ....
  if (size == 8) {
    ud_asmprintf(u, "b");
  } else if (size == 16) {
    ud_asmprintf(u, "w");
  } else if (size == 64) {
    ud_asmprintf(u, "q");
  }
  ....
}

PVS-ಸ್ಟುಡಿಯೋ ಎಚ್ಚರಿಕೆ: V547 ಅಭಿವ್ಯಕ್ತಿ 'ಗಾತ್ರ == 8' ಯಾವಾಗಲೂ ತಪ್ಪು. syn-att.c 195

ಈ ದೋಷವು ಫೋಲ್ಡರ್‌ನಲ್ಲಿದೆ ext, ಆದ್ದರಿಂದ ಯೋಜನೆಗೆ ನಿಜವಾಗಿಯೂ ಸಂಬಂಧಿಸಿಲ್ಲ, ಆದರೆ ನಾನು ಅದನ್ನು ಗಮನಿಸುವ ಮೊದಲು ದೋಷ ಕಂಡುಬಂದಿದೆ, ಆದ್ದರಿಂದ ನಾನು ಅದನ್ನು ಬಿಡಲು ನಿರ್ಧರಿಸಿದೆ. ಎಲ್ಲಾ ನಂತರ, ಈ ಲೇಖನವು ದೋಷಗಳನ್ನು ಪರಿಶೀಲಿಸುವ ಬಗ್ಗೆ ಅಲ್ಲ, ಆದರೆ ಟ್ರಾವಿಸ್ CI ಯೊಂದಿಗೆ ಏಕೀಕರಣದ ಬಗ್ಗೆ, ಮತ್ತು ವಿಶ್ಲೇಷಕದ ಯಾವುದೇ ಸಂರಚನೆಯನ್ನು ಕೈಗೊಳ್ಳಲಾಗಿಲ್ಲ.

ವೇರಿಯಬಲ್ ಗಾತ್ರ ಸ್ಥಿರದಿಂದ ಪ್ರಾರಂಭಿಸಲಾಗಿದೆ, ಆದಾಗ್ಯೂ, ಅದನ್ನು ಕೋಡ್‌ನಲ್ಲಿ ಬಳಸಲಾಗುವುದಿಲ್ಲ, ನೇರವಾಗಿ ಆಪರೇಟರ್‌ಗೆ if, ಇದು, ಸಹಜವಾಗಿ, ನೀಡುತ್ತದೆ ಸುಳ್ಳು ಪರಿಸ್ಥಿತಿಗಳನ್ನು ಪರಿಶೀಲಿಸುವಾಗ, ಏಕೆಂದರೆ, ನಾವು ನೆನಪಿಟ್ಟುಕೊಳ್ಳುವಂತೆ, ಗಾತ್ರ ಶೂನ್ಯಕ್ಕೆ ಸಮ. ನಂತರದ ಪರಿಶೀಲನೆಗಳು ಸಹ ಯಾವುದೇ ಅರ್ಥವಿಲ್ಲ.

ಸ್ಪಷ್ಟವಾಗಿ, ಕೋಡ್ ತುಣುಕಿನ ಲೇಖಕರು ವೇರಿಯೇಬಲ್ ಅನ್ನು ತಿದ್ದಿ ಬರೆಯಲು ಮರೆತಿದ್ದಾರೆ ಗಾತ್ರ ಅದಕ್ಕಿಂತ ಮುಂಚೆ.

ನಿಲ್ಲಿಸು

ಇಲ್ಲಿ ನಾವು ಬಹುಶಃ ತಪ್ಪುಗಳೊಂದಿಗೆ ಕೊನೆಗೊಳ್ಳುತ್ತೇವೆ. ಈ ಲೇಖನದ ಉದ್ದೇಶವು ಟ್ರಾವಿಸ್ CI ಜೊತೆಗೆ PVS-ಸ್ಟುಡಿಯೊದ ಕೆಲಸವನ್ನು ಪ್ರದರ್ಶಿಸುವುದು ಮತ್ತು ಯೋಜನೆಯನ್ನು ಸಾಧ್ಯವಾದಷ್ಟು ಸಂಪೂರ್ಣವಾಗಿ ವಿಶ್ಲೇಷಿಸುವುದು ಅಲ್ಲ. ನೀವು ದೊಡ್ಡ ಮತ್ತು ಹೆಚ್ಚು ಸುಂದರವಾದ ತಪ್ಪುಗಳನ್ನು ಬಯಸಿದರೆ, ನೀವು ಯಾವಾಗಲೂ ಅವರನ್ನು ಮೆಚ್ಚಬಹುದು ಇಲ್ಲಿ :).

ತೀರ್ಮಾನಕ್ಕೆ

ಹೆಚ್ಚುತ್ತಿರುವ ವಿಶ್ಲೇಷಣೆಯ ಅಭ್ಯಾಸದೊಂದಿಗೆ ಯೋಜನೆಗಳನ್ನು ನಿರ್ಮಿಸಲು ವೆಬ್ ಸೇವೆಗಳನ್ನು ಬಳಸುವುದು ಕೋಡ್ ಅನ್ನು ವಿಲೀನಗೊಳಿಸಿದ ನಂತರ ತಕ್ಷಣವೇ ಅನೇಕ ಸಮಸ್ಯೆಗಳನ್ನು ಕಂಡುಹಿಡಿಯಲು ನಿಮಗೆ ಅನುಮತಿಸುತ್ತದೆ. ಆದಾಗ್ಯೂ, ಒಂದು ನಿರ್ಮಾಣವು ಸಾಕಾಗದೇ ಇರಬಹುದು, ಆದ್ದರಿಂದ ಸ್ಥಿರ ವಿಶ್ಲೇಷಣೆಯೊಂದಿಗೆ ಪರೀಕ್ಷೆಯನ್ನು ಹೊಂದಿಸುವುದು ಕೋಡ್‌ನ ಗುಣಮಟ್ಟವನ್ನು ಗಮನಾರ್ಹವಾಗಿ ಸುಧಾರಿಸುತ್ತದೆ.

ಉಪಯುಕ್ತ ಕೊಂಡಿಗಳು

PSP ಗೇಮ್ ಕನ್ಸೋಲ್ ಎಮ್ಯುಲೇಟರ್ನ ಉದಾಹರಣೆಯನ್ನು ಬಳಸಿಕೊಂಡು ಟ್ರಾವಿಸ್ CI ನಲ್ಲಿ PVS-ಸ್ಟುಡಿಯೋವನ್ನು ಹೇಗೆ ಕಾನ್ಫಿಗರ್ ಮಾಡುವುದು

ನೀವು ಈ ಲೇಖನವನ್ನು ಇಂಗ್ಲಿಷ್ ಮಾತನಾಡುವ ಪ್ರೇಕ್ಷಕರೊಂದಿಗೆ ಹಂಚಿಕೊಳ್ಳಲು ಬಯಸಿದರೆ, ದಯವಿಟ್ಟು ಅನುವಾದ ಲಿಂಕ್ ಬಳಸಿ: ಮ್ಯಾಕ್ಸಿಮ್ ಜ್ವ್ಯಾಗಿಂಟ್ಸೆವ್. PSP ಗೇಮ್ ಕನ್ಸೋಲ್ ಎಮ್ಯುಲೇಟರ್ನ ಉದಾಹರಣೆಯನ್ನು ಬಳಸಿಕೊಂಡು ಟ್ರಾವಿಸ್ CI ನಲ್ಲಿ PVS-ಸ್ಟುಡಿಯೋವನ್ನು ಹೇಗೆ ಹೊಂದಿಸುವುದು.

ಮೂಲ: www.habr.com

ಕಾಮೆಂಟ್ ಅನ್ನು ಸೇರಿಸಿ