PSP ๊ฒŒ์ž„ ์ฝ˜์†” ์—๋ฎฌ๋ ˆ์ดํ„ฐ์˜ ์˜ˆ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Travis CI์—์„œ PVS-Studio๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•

PSP ๊ฒŒ์ž„ ์ฝ˜์†” ์—๋ฎฌ๋ ˆ์ดํ„ฐ์˜ ์˜ˆ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Travis CI์—์„œ PVS-Studio๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•
Travis CI๋Š” GitHub๋ฅผ ์†Œ์Šค ์ฝ”๋“œ ํ˜ธ์ŠคํŒ…์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๊ตฌ์ถ•ํ•˜๊ณ  ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•œ ๋ถ„์‚ฐ ์›น ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค. ์œ„์˜ ์šด์˜ ์‹œ๋‚˜๋ฆฌ์˜ค ์™ธ์—๋„ ๊ด‘๋ฒ”์œ„ํ•œ ๊ตฌ์„ฑ ์˜ต์…˜ ๋•๋ถ„์— ์ž์‹ ๋งŒ์˜ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ์‚ฌ์—์„œ๋Š” PPSSPP ์ฝ”๋“œ ์˜ˆ์ œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ PVS-Studio์™€ ์ž‘๋™ํ•˜๋„๋ก Travis CI๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์†Œ๊ฐœ

ํŠธ๋ž˜๋น„์Šค CI ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๊ตฌ์ถ•ํ•˜๊ณ  ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•œ ์›น ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ง€์†์ ์ธ ํ†ตํ•ฉ ๋ฐฉ์‹๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

PPSSPP - PSP ๊ฒŒ์ž„ ์ฝ˜์†” ์—๋ฎฌ๋ ˆ์ดํ„ฐ. ์ด ํ”„๋กœ๊ทธ๋žจ์€ Sony PSP์šฉ ๋””์Šคํฌ ์ด๋ฏธ์ง€์—์„œ ๋ชจ๋“  ๊ฒŒ์ž„์˜ ์‹คํ–‰์„ ์—๋ฎฌ๋ ˆ์ดํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํ”„๋กœ๊ทธ๋žจ์€ 1๋…„ 2012์›” 2์ผ์— ์ถœ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. PPSSPP๋Š” GPL vXNUMX์— ๋”ฐ๋ผ ๋ผ์ด์„ผ์Šค๊ฐ€ ๋ถ€์—ฌ๋ฉ๋‹ˆ๋‹ค. ๋ˆ„๊ตฌ๋‚˜ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค ํ”„๋กœ์ ํŠธ ์†Œ์Šค ์ฝ”๋“œ.

PVS-์ŠคํŠœ๋””์˜ค โ€” ํ”„๋กœ๊ทธ๋žจ ์ฝ”๋“œ์˜ ์˜ค๋ฅ˜ ๋ฐ ์ž ์žฌ์ ์ธ ์ทจ์•ฝ์ ์„ ๊ฒ€์ƒ‰ํ•˜๊ธฐ ์œ„ํ•œ ์ •์  ์ฝ”๋“œ ๋ถ„์„๊ธฐ์ž…๋‹ˆ๋‹ค. ์ด ๊ธ€์—์„œ๋Š” ๋ณ€ํ™”๋ฅผ ์œ„ํ•ด ๊ฐœ๋ฐœ์ž์˜ ์ปดํ“จํ„ฐ์—์„œ ๋กœ์ปฌ์ด ์•„๋‹Œ ํด๋ผ์šฐ๋“œ์—์„œ PVS-Studio๋ฅผ ์‹œ์ž‘ํ•˜๊ณ  PPSSPP์—์„œ ์˜ค๋ฅ˜๋ฅผ ์ฐพ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

ํŠธ๋ž˜๋น„์Šค CI ์„ค์ •

ํ•„์š”ํ•œ ํ”„๋กœ์ ํŠธ๊ฐ€ ์žˆ๋Š” GitHub์˜ ์ €์žฅ์†Œ์™€ PVS-Studio์šฉ ํ‚ค๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ํ‰๊ฐ€ํŒ ํ‚ค ๋˜๋Š” ์˜คํ”ˆ ์†Œ์Šค ํ”„๋กœ์ ํŠธ์˜ ๊ฒฝ์šฐ ๋ฌด๋ฃŒ).

์‚ฌ์ดํŠธ๋กœ ๋“ค์–ด๊ฐ€๋ณด์ž ํŠธ๋ž˜๋น„์Šค CI. GitHub ๊ณ„์ •์„ ์‚ฌ์šฉํ•˜์—ฌ ์Šน์ธํ•˜๋ฉด ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๋ชฉ๋ก์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

PSP ๊ฒŒ์ž„ ์ฝ˜์†” ์—๋ฎฌ๋ ˆ์ดํ„ฐ์˜ ์˜ˆ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Travis CI์—์„œ PVS-Studio๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•
ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด PPSSPP๋ฅผ ํฌํฌํ–ˆ์Šต๋‹ˆ๋‹ค.

์ˆ˜์ง‘ํ•˜๋ ค๋Š” ์ €์žฅ์†Œ๋ฅผ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.

PSP ๊ฒŒ์ž„ ์ฝ˜์†” ์—๋ฎฌ๋ ˆ์ดํ„ฐ์˜ ์˜ˆ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Travis CI์—์„œ PVS-Studio๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•
ํ˜„์žฌ Travis CI์—๋Š” ๋นŒ๋“œ ์ง€์นจ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ์šฐ๋ฆฌ ํ”„๋กœ์ ํŠธ๋ฅผ ๋นŒ๋“œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด์ œ ๊ตฌ์„ฑํ•  ์ฐจ๋ก€์ž…๋‹ˆ๋‹ค.

๋ถ„์„ ์ค‘์— ์ผ๋ถ€ ๋ณ€์ˆ˜(์˜ˆ: ๊ตฌ์„ฑ ํŒŒ์ผ์— ์ง€์ •ํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•˜์ง€ ์•Š์€ PVS-Studio์˜ ํ‚ค)๊ฐ€ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. Travis CI์˜ ๋นŒ๋“œ ์„ค์ •์„ ์‚ฌ์šฉํ•˜์—ฌ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

PSP ๊ฒŒ์ž„ ์ฝ˜์†” ์—๋ฎฌ๋ ˆ์ดํ„ฐ์˜ ์˜ˆ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Travis CI์—์„œ PVS-Studio๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•
์šฐ๋ฆฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค :

  • PVS_USERNAME - ์‚ฌ์šฉ์ž ์ด๋ฆ„
  • PVS_KEY - ํ‚ค
  • MAIL_USER - ๋ณด๊ณ ์„œ๋ฅผ ๋ณด๋‚ด๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์ด๋ฉ”์ผ
  • MAIL_PASSWORD - ์ด๋ฉ”์ผ ๋น„๋ฐ€๋ฒˆํ˜ธ

๋งˆ์ง€๋ง‰ ๋‘ ๊ฐœ๋Š” ์„ ํƒ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ๊ฒฐ๊ณผ๋ฅผ ์šฐํŽธ์œผ๋กœ ๋ณด๋‚ด๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋ณด๊ณ ์„œ๋ฅผ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ฐฐํฌํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ์ด๋ฅผ ํ‘œ์‹œํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ํ•„์š”ํ•œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

PSP ๊ฒŒ์ž„ ์ฝ˜์†” ์—๋ฎฌ๋ ˆ์ดํ„ฐ์˜ ์˜ˆ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Travis CI์—์„œ PVS-Studio๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•
์ด์ œ ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด๋ณด์ž .travis.yml ๊ทธ๋ฆฌ๊ณ  ํ”„๋กœ์ ํŠธ์˜ ๋ฃจํŠธ์— ๋„ฃ์œผ์„ธ์š”. PPSSPP์—๋Š” ์ด๋ฏธ Travis CI์— ๋Œ€ํ•œ ๊ตฌ์„ฑ ํŒŒ์ผ์ด ์žˆ์—ˆ์ง€๋งŒ ๋„ˆ๋ฌด ํฌ๊ณ  ์˜ˆ์ œ์— ์ „ํ˜€ ์ ํ•ฉํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ๋Œ€ํญ ๋‹จ์ˆœํ™”ํ•˜๊ณ  ๊ธฐ๋ณธ ์š”์†Œ๋งŒ ๋‚จ๊ฒจ์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋จผ์ €, ๊ฐ€์ƒ ๋จธ์‹ ์—์„œ ์‚ฌ์šฉํ•˜๋ ค๋Š” ์–ธ์–ด, Ubuntu Linux ๋ฒ„์ „, ๋นŒ๋“œ์— ํ•„์š”ํ•œ ํŒจํ‚ค์ง€๋ฅผ ์ง€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

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

์„น์…˜์— ๋Œ€ํ•ด ์กฐ๊ธˆ ๋” ๋งคํŠธ๋ฆญ์Šค. Travis 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

Travis 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
}

์ด์ œ Travis CI์—์„œ PVS-Studio ์ž๋™ ์‹คํ–‰์„ ์ง์ ‘ ์„ค์ •ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋จผ์ € ์‹œ์Šคํ…œ์— PVS-Studio ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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-์ŠคํŠœ๋””์˜ค. ์ด ์™ธ์—๋„ ํŒจํ‚ค์ง€๋„ ํ‘œ์‹œ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. libio-์†Œ์ผ“-ssl-perl ะธ libnet-ssleay-perl๊ทธ๋Ÿฌ๋‚˜ ๊ฒฐ๊ณผ๋ฅผ ์šฐํŽธ์œผ๋กœ ๋ณด๋‚ด๋Š” ๋ฐ ํ•„์š”ํ•˜๋ฏ€๋กœ ๋ณด๊ณ ์„œ ์ „๋‹ฌ์„ ์œ„ํ•ด ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ์„ ํƒํ•œ ๊ฒฝ์šฐ์—๋Š” ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ธฐ๋Šฅ ๋‹ค์šด๋กœ๋“œ_์ถ”์ถœ ์ง€์ •๋œ ์•„์นด์ด๋ธŒ๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ์••์ถ•์„ ํ‘ผ๋‹ค:

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

์ด ์ฝ”๋“œ ์„น์…˜์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. cmake ์ปดํŒŒ์ผ ๋ช…๋ น์„ ๋‚ด๋ณด๋‚ด๊ธฐ ์œ„ํ•œ ํ”Œ๋ž˜๊ทธ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์ •์  ์ฝ”๋“œ ๋ถ„์„๊ธฐ์— ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ "Linux ๋ฐ macOS์—์„œ PVS-Studio๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•".

์กฐ๋ฆฝ์ด ์„ฑ๊ณตํ–ˆ๋‹ค๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ๋„˜์–ด๊ฐ‘๋‹ˆ๋‹ค. ์„ฑ๊ณต ํ›„, ์—ฌ๊ธฐ์„œ ์ •์  ๋ถ„์„์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

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

์ฒซ ๋ฒˆ์งธ ์ค„์€ Travis CI ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•  ๋•Œ ๋งจ ์ฒ˜์Œ์— ์ง€์ •ํ•œ ์‚ฌ์šฉ์ž ์ด๋ฆ„๊ณผ ํ‚ค์—์„œ ๋ผ์ด์„ผ์Šค ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

๋‘ ๋ฒˆ์งธ ์ค„์—์„œ๋Š” ๋ถ„์„์„ ์ง์ ‘ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๊นƒ๋ฐœ -์ œ์ด ๋ถ„์„ํ•  ์Šค๋ ˆ๋“œ ์ˆ˜๋ฅผ ์„ค์ •ํ•˜๊ณ  ํ”Œ๋ž˜๊ทธ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. -์—˜ ๋ผ์ด์„ผ์Šค, ํ”Œ๋ž˜๊ทธ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. -์˜ํ˜• ๋กœ๊ทธ ์ถœ๋ ฅ์„ ์œ„ํ•œ ํŒŒ์ผ๊ณผ ํ”Œ๋ž˜๊ทธ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. -disableLicenseExpirationCheck ํ‰๊ฐ€ํŒ์—๋Š” ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ 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;

์ด์ œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ git ์ €์žฅ์†Œ์— ํ‘ธ์‹œํ•  ์ฐจ๋ก€์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด Travis CI๊ฐ€ ์ž๋™์œผ๋กœ ๋นŒ๋“œ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋นŒ๋“œ ๋ณด๊ณ ์„œ๋กœ ์ด๋™ํ•˜๋ ค๋ฉด "ppsspp"๋ฅผ ํด๋ฆญํ•˜์„ธ์š”.

PSP ๊ฒŒ์ž„ ์ฝ˜์†” ์—๋ฎฌ๋ ˆ์ดํ„ฐ์˜ ์˜ˆ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Travis CI์—์„œ PVS-Studio๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•
ํ˜„์žฌ ๋นŒ๋“œ์˜ ๊ฐœ์š”๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

PSP ๊ฒŒ์ž„ ์ฝ˜์†” ์—๋ฎฌ๋ ˆ์ดํ„ฐ์˜ ์˜ˆ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Travis CI์—์„œ PVS-Studio๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•
๋นŒ๋“œ๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋˜๋ฉด ์ •์  ๋ถ„์„ ๊ฒฐ๊ณผ๊ฐ€ ํฌํ•จ๋œ ์ด๋ฉ”์ผ์„ ๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์šฐํŽธ์œผ๋กœ ๋ณด๊ณ ์„œ๋ฅผ ๋ฐ›๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋นŒ๋“œ๊ฐ€ ์™„๋ฃŒ๋œ ํ›„์—๋Š” ๊ฐ€์ƒ ๋จธ์‹  ํŒŒ์ผ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์—†๋‹ค๋Š” ์ ์„ ๊ธฐ์–ตํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

์˜ค๋ฅ˜ ์š”์•ฝ

์šฐ๋ฆฌ๋Š” ๊ฐ€์žฅ ์–ด๋ ค์šด ๋ถ€๋ถ„์„ ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ์šฐ๋ฆฌ์˜ ๋ชจ๋“  ๋…ธ๋ ฅ์ด ๊ทธ๋งŒํ•œ ๊ฐ€์น˜๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ์‹œ๋‹ค. ๋ฉ”์ผ๋กœ ๋ฐ›์€ ์ •์  ๋ถ„์„ ๋ณด๊ณ ์„œ์—์„œ ๋ช‡ ๊ฐ€์ง€ ํฅ๋ฏธ๋กœ์šด ์ ์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค(๊ดœํžˆ ํ‘œ์‹œํ•œ ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค).

์œ„ํ—˜ํ•œ ์ตœ์ ํ™”

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-Studio ๊ฒฝ๊ณ : V597 ์ปดํŒŒ์ผ๋Ÿฌ๋Š” 'sum' ๋ฒ„ํผ๋ฅผ ํ”Œ๋Ÿฌ์‹œํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” 'memset' ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ์ธ ๋ฐ์ดํ„ฐ๋ฅผ ์ง€์šฐ๋ ค๋ฉด 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. ๋”ฐ๋ผ์„œ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋‚˜์ค‘์— ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋ฎ์–ด์“ฐ๋ฉด์„œ ํ”„๋กœ์„ธ์„œ ์‹œ๊ฐ„์„ ๋‚ญ๋น„ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. RtlSecureZero๋ฉ”๋ชจ๋ฆฌ ๋˜๋Š” ๋น„์Šทํ•œ ๊ทธ๋…€.

์˜ฌ๋ฐ”๋ฅด๊ฒŒ :

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-Studio ๊ฒฝ๊ณ : V547 ํ‘œํ˜„์‹ 'leftvol >= 0'์€ ํ•ญ์ƒ ์ฐธ์ž…๋‹ˆ๋‹ค. sceAudio.cpp 120

๋จผ์ € else ๋ถ„๊ธฐ์— ์ฃผ๋ชฉํ•˜์„ธ์š”. if. ๋ชจ๋“  ์กฐ๊ฑด์ด ์ถฉ์กฑ๋œ ๊ฒฝ์šฐ์—๋งŒ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. leftvol > 0xFFFF || ์˜ค๋ฅธ์ชฝ๋ณผ > 0xFFFF || leftvol < 0 || ์˜ค๋ฅธ์ชฝ ๋ณผ๋ฅจ < 0 ๊ฑฐ์ง“์œผ๋กœ ๋ฐํ˜€์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๋Š” else ๋ถ„๊ธฐ์— ์ ์šฉ๋˜๋Š” ๋‹ค์Œ ๋ช…๋ น๋ฌธ์„ ์–ป์Šต๋‹ˆ๋‹ค. ์™ผ์ชฝ๋ณผ <= 0xFFFF, ์˜ค๋ฅธ์ชฝ๋ณผ <= 0xFFFF, ์™ผ์ชฝ ๋ณผ๋ฅจ >= 0 ะธ ์˜ค๋ฅธ์ชฝ ๋ณผ๋ฅจ >= 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 '||' ์™ผ์ชฝ๊ณผ ์˜ค๋ฅธ์ชฝ์— ๋™์ผํ•œ ํ•˜์œ„ ํ‘œํ˜„์‹ '!Memory::IsValidAddress(psmfData)'๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์šด์˜์ž. scePsmf.cpp 703

๋‚ด๋ถ€ ์ˆ˜ํ‘œ์—์ฃผ์˜ํ•˜์‹ญ์‹œ์˜ค if. ์ฃผ์†Œ๊ฐ€ ์œ ํšจํ•œ์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์ด์ƒํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š๋‚˜์š”? psmf๋ฐ์ดํ„ฐ, ๋‘ ๋ฐฐ? ๊ทธ๋ž˜์„œ ์ œ๊ฒŒ๋Š” ์ด์ƒํ•˜๊ฒŒ ๋ณด์ž…๋‹ˆ๋‹ค... ์‚ฌ์‹ค ์ด๊ฒƒ์€ ๋ฌผ๋ก  ์˜คํƒ€์ด๋ฉฐ ๋‘ ์ž…๋ ฅ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ชจ๋‘ ํ™•์ธํ•˜๋ ค๋Š” ์•„์ด๋””์–ด์˜€์Šต๋‹ˆ๋‹ค.

์˜ฌ๋ฐ”๋ฅธ ์˜ต์…˜:

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-Studio ๊ฒฝ๊ณ : V547 'size == 8' ํ‘œํ˜„์‹์€ ํ•ญ์ƒ false์ž…๋‹ˆ๋‹ค. syn-att.c 195

์ด ์˜ค๋ฅ˜๋Š” ํด๋”์— ์žˆ์Šต๋‹ˆ๋‹ค ๋‚ด์„ , ๊ทธ๋ž˜์„œ ํ”„๋กœ์ ํŠธ์™€ ๋ณ„๋กœ ๊ด€๋ จ์ด ์—†์ง€๋งŒ, ๋ฒ„๊ทธ๊ฐ€ ์ œ๊ฐ€ ๊นจ๋‹ซ๊ธฐ๋„ ์ „์— ๋ฐœ๊ฒฌ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋– ๋‚˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ ์ด ๊ธ€์€ ์˜ค๋ฅ˜ ๊ฒ€ํ† ์— ๊ด€ํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ Travis CI์™€์˜ ํ†ตํ•ฉ์— ๊ด€ํ•œ ๊ฒƒ์ด๋ฉฐ ๋ถ„์„๊ธฐ ๊ตฌ์„ฑ์€ ์ˆ˜ํ–‰๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๋ณ€์ˆ˜ ํฌ๊ธฐ ์ƒ์ˆ˜๋กœ ์ดˆ๊ธฐํ™”๋˜์ง€๋งŒ ์ฝ”๋“œ์—์„œ ์—ฐ์‚ฐ์ž๊นŒ์ง€ ์ „ํ˜€ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. if, ๋ฌผ๋ก  ์ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆ‡๋œ ์กฐ๊ฑด์„ ํ™•์ธํ•˜๋Š” ๋™์•ˆ ์šฐ๋ฆฌ๊ฐ€ ๊ธฐ์–ตํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ํฌ๊ธฐ XNUMX๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํ›„์† ์ ๊ฒ€๋„ ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋ถ„๋ช…ํžˆ ์ฝ”๋“œ ์กฐ๊ฐ ์ž‘์„ฑ์ž๊ฐ€ ๋ณ€์ˆ˜๋ฅผ ๋ฎ์–ด์“ฐ๋Š” ๊ฒƒ์„ ์žŠ์—ˆ์Šต๋‹ˆ๋‹ค. ํฌ๊ธฐ ๊ทธ๊ฒƒ ์•ž์—.

์ค‘์ง€

์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๋Š” ์•„๋งˆ๋„ ์‹ค์ˆ˜๋กœ ๋๋‚  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๊ธ€์˜ ๋ชฉ์ ์€ Travis CI์™€ ํ•จ๊ป˜ PVS-Studio์˜ ์ž‘์—…์„ ์‹œ์—ฐํ•˜๋Š” ๊ฒƒ์ด์ง€ ํ”„๋กœ์ ํŠธ๋ฅผ ์ตœ๋Œ€ํ•œ ์ฒ ์ €ํ•˜๊ฒŒ ๋ถ„์„ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋” ํฌ๊ณ  ์•„๋ฆ„๋‹ค์šด ์‹ค์ˆ˜๋ฅผ ์›ํ•œ๋‹ค๋ฉด ์–ธ์ œ๋“ ์ง€ ๊ฐํƒ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— :).

๊ฒฐ๋ก 

์›น ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ์ ํŠธ๋ฅผ ๋นŒ๋“œํ•˜๊ณ  ์ฆ๋ถ„ ๋ถ„์„์„ ์ˆ˜ํ–‰ํ•˜๋ฉด ์ฝ”๋“œ ๋ณ‘ํ•ฉ ํ›„ ์ฆ‰์‹œ ๋งŽ์€ ๋ฌธ์ œ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ•˜๋‚˜์˜ ๋นŒ๋“œ๋งŒ์œผ๋กœ๋Š” ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ •์  ๋ถ„์„๊ณผ ํ•จ๊ป˜ ํ…Œ์ŠคํŠธ๋ฅผ ์„ค์ •ํ•˜๋ฉด ์ฝ”๋“œ ํ’ˆ์งˆ์ด ํฌ๊ฒŒ ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค.

์œ ์šฉํ•œ ๋งํฌ

PSP ๊ฒŒ์ž„ ์ฝ˜์†” ์—๋ฎฌ๋ ˆ์ดํ„ฐ์˜ ์˜ˆ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Travis CI์—์„œ PVS-Studio๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•

์ด ๊ธฐ์‚ฌ๋ฅผ ์˜์–ด๊ถŒ ์ฒญ์ค‘๊ณผ ๊ณต์œ ํ•˜๋ ค๋ฉด ๋ฒˆ์—ญ ๋งํฌ์ธ Maxim Zvyagintsev๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. PSP ๊ฒŒ์ž„ ์ฝ˜์†” ์—๋ฎฌ๋ ˆ์ดํ„ฐ์˜ ์˜ˆ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Travis CI์—์„œ PVS-Studio๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•.

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€