์ฌ์ฉ์ ์ง์ ์ฟผ๋ฆฌ ํ ์คํธ ์ ๋ณด
CodeQL(์)๋ ์ฟผ๋ฆฌ์ ์๋ํ๋ ์ฌ๋ฐ ํ ์คํธ๋ฅผ ์ํ ๊ฐ๋จํ ํ ์คํธ ํ๋ ์์ํฌ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ฟผ๋ฆฌ๋ฅผ ํ ์คํธํ์ฌ ์์๋๋ก ์๋ํ๋์ง ํ์ธํฉ๋๋ค.
์ฟผ๋ฆฌ ํ
์คํธ ์ค์ CodeQL์(๋) ์ฌ์ฉ์๊ฐ ์ฟผ๋ฆฌ๊ฐ ์์ฑ๋ ๊ฒ์ผ๋ก ์์ํ๋ ๊ฒฐ๊ณผ๋ฅผ ์ค์ ๋ก ์์ฑ๋ ๊ฒฐ๊ณผ์ ๋น๊ตํฉ๋๋ค. ์์ ๊ฒฐ๊ณผ์ ์ค์ ๊ฒฐ๊ณผ๊ฐ ๋ค๋ฅด๋ฉด ์ฟผ๋ฆฌ ํ
์คํธ๊ฐ ์คํจํฉ๋๋ค. ํ
์คํธ๋ฅผ ์์ ํ๋ ค๋ฉด ์ค์ ๊ฒฐ๊ณผ์ ์์ ๊ฒฐ๊ณผ๊ฐ ์ ํํ ์ผ์นํ ๋๊น์ง ์ฟผ๋ฆฌ ๋ฐ ์์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ๋ณตํด์ผ ํฉ๋๋ค. ์ด ํญ๋ชฉ์์๋ test run
ํ์ ๋ช
๋ น์ ์ฌ์ฉํ์ฌ ํ
์คํธ ํ์ผ์ ๋ง๋ค๊ณ ํ
์คํธ๋ฅผ ์คํํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ ์ค๋๋ค.
์ฌ์ฉ์ ์ง์ ์ฟผ๋ฆฌ์ ๋ํ ํ ์คํธ CodeQL ํฉ ์ค์
๋ชจ๋ CodeQL ํ
์คํธ๋ ํน์ํ "ํ
์คํธ" CodeQL ํฉ์ ์ ์ฅํด์ผ ํฉ๋๋ค. ์ฆ, ๋ค์์ ์ ์ํ๋ qlpack.yml
ํ์ผ์ด ์๋ ํ
์คํธ ํ์ผ์ ๋๋ ํฐ๋ฆฌ์
๋๋ค.
name: <name-of-test-pack>
version: 0.0.0
dependencies:
<codeql-libraries-and-queries-to-test>: "*"
extractor: <language-of-code-to-test>
์ด dependencies
๊ฐ์ ํ
์คํธํ ์ฟผ๋ฆฌ๊ฐ ํฌํจ๋ CodeQL ํฉ์ ์ง์ ํฉ๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ์ด๋ฌํ ํฉ์ ์๋ณธ์์ ํ์ธ๋๋ฏ๋ก ๊ณ ์ ๋ ๋ฒ์ ์ ํฉ์ ์ง์ ํ ํ์๊ฐ ์์ต๋๋ค. ์ด extractor
(์)๋ CodeQL ํฉ์ ์ ์ฅ๋ ์ฝ๋ ํ์ผ์์ ํ
์คํธ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ง๋๋ ๋ฐ CLI์์ ์ฌ์ฉํ ์ธ์ด๋ฅผ ์ ์ํฉ๋๋ค. ์์ธํ ๋ด์ฉ์ CodeQL ํฉ์ ์ฌ์ฉํ์ฌ ๋ถ์ ์ฌ์ฉ์ ์ง์ ์(๋ฅผ) ์ฐธ์กฐํ์ธ์.
์ฟผ๋ฆฌ ํ
์คํธ๊ฐ CodeQL ๋ฆฌํฌ์งํ ๋ฆฌ์์ ๊ตฌ์ฑ๋๋ ๋ฐฉ์์ ์ดํด๋ณด๋ ๊ฒ์ด ์ ์ฉํ ์ ์์ต๋๋ค. ๊ฐ ์ธ์ด์๋ ์ฝ๋๋ฒ ์ด์ค๋ฅผ ๋ถ์ํ๊ธฐ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฐ ์ฟผ๋ฆฌ๋ฅผ ํฌํจํ๋ src
๋๋ ํฐ๋ฆฌ ๋ฐ ql/<language>/ql/src
(์ด)๊ฐ ์์ต๋๋ค. src
๋๋ ํฐ๋ฆฌ์ ํจ๊ป ์ด๋ฌํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฐ ์ฟผ๋ฆฌ์ ๋ํ ํ
์คํธ๊ฐ ํฌํจ๋ test
๋๋ ํฐ๋ฆฌ๊ฐ ์์ต๋๋ค.
๊ฐ test
๋๋ ํฐ๋ฆฌ๋ ๋ ๊ฐ์ ํ์ ๋๋ ํฐ๋ฆฌ๊ฐ ์๋ ํ
์คํธ CodeQL ํฉ์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
query-tests
src
๋๋ ํฐ๋ฆฌ์ ์ ์ฅ๋ ์ฟผ๋ฆฌ์ ๋ํ ํ ์คํธ๊ฐ ํฌํจ๋ ์ผ๋ จ์ ํ์ ๋๋ ํฐ๋ฆฌ์ ๋๋ค. ๊ฐ ํ์ ๋๋ ํฐ๋ฆฌ์๋ ํ ์คํธ ์ฝ๋์ ํ ์คํธํ ์ฟผ๋ฆฌ๋ฅผ ์ง์ ํ๋ QL ์ฐธ์กฐ ํ์ผ์ด ํฌํจ๋ฉ๋๋ค.library-tests
QL ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ์ผ์ ๋ํ ํ ์คํธ๋ฅผ ํฌํจํ๋ ์ผ๋ จ์ ํ์ ๋๋ ํฐ๋ฆฌ์ ๋๋ค. ๊ฐ ํ์ ๋๋ ํฐ๋ฆฌ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ฉ ๋จ์ ํ ์คํธ๋ก ์์ฑ๋ ํ ์คํธ ์ฝ๋ ๋ฐ ์ฟผ๋ฆฌ๊ฐ ํฌํจ๋ฉ๋๋ค.
qlpack.yml
ํ์ผ์ ๋ง๋ ํ์๋ ๋ชจ๋ ์ข
์์ฑ์ด ๋ค์ด๋ก๋๋์ด CLI์์ ์ฌ์ฉํ ์ ์๋์ง ํ์ธํด์ผ ํฉ๋๋ค. qlpack.yml
ํ์ผ๊ณผ ๋์ผํ ๋๋ ํฐ๋ฆฌ์์ ๋ค์ ๋ช
๋ น์ ์คํํ์ฌ ์ด ์์
์ ์ํํฉ๋๋ค.
codeql pack install
์ด๋ ๊ฒ ํ๋ฉด ์ด ํฉ์์ ์ฟผ๋ฆฌ๋ฅผ ์คํํ๋ ๋ฐ ํ์ํ ๋ชจ๋ ์ ์ด์ ์ข
์์ฑ์ ์ง์ ํ๋ codeql-pack.lock.yml
ํ์ผ์ ์์ฑํ๊ฒ ๋ฉ๋๋ค. ์ด ํ์ผ์ ์์ค ๊ด๋ฆฌ์ ์ฒดํฌ์ธ๋์ด์ผ ํฉ๋๋ค.
์ฟผ๋ฆฌ์ฉ ํ ์คํธ ํ์ผ ์ค์
ํ ์คํธํ๋ ค๋ ๊ฐ ์ฟผ๋ฆฌ์ฉ์ผ๋ก ํ ์คํธ CodeQL ํฉ์ ํ์ ๋๋ ํฐ๋ฆฌ๋ฅผ ๋ง๋ค์ด์ผ ํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ํ ์คํธ ๋ช ๋ น์ ์คํํ๊ธฐ ์ ์ ํ์ ๋๋ ํฐ๋ฆฌ์ ๋ค์ ํ์ผ์ ์ถ๊ฐํฉ๋๋ค.
-
ํ ์คํธํ ์ฟผ๋ฆฌ์ ์์น๋ฅผ ์ ์ํ๋ ์ฟผ๋ฆฌ ์ฐธ์กฐ ํ์ผ(
.qlref
ํ์ผ)์ ๋๋ค. ์์น๋ ์ฟผ๋ฆฌ๊ฐ ํฌํจ๋ CodeQL ํฉ์ ๋ฃจํธ๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ์๋ฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ํ ์คํธ ํฉ์dependencies
๋ธ๋ก์ ์ง์ ๋ CodeQL ํฉ์ ๋๋ค. ์์ธํ ๋ด์ฉ์ ์ฟผ๋ฆฌ ์ฐธ์กฐ ํ์ผ์(๋ฅผ) ์ฐธ์กฐํ์ธ์.ํ ์คํธํ๋ ค๋ ์ฟผ๋ฆฌ๊ฐ ํ ์คํธ ๋๋ ํฐ๋ฆฌ์ ์ ์ฅ๋ ๊ฒฝ์ฐ ์ฟผ๋ฆฌ ์ฐธ์กฐ ํ์ผ์ ์ถ๊ฐํ ํ์๊ฐ ์์ง๋ง, ์ผ๋ฐ์ ์ผ๋ก ํ ์คํธ์ ๋ณ๋๋ก ์ฟผ๋ฆฌ๋ฅผ ์ ์ฅํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ ์ผํ ์์ธ๋ ๊ฒฝ๊ณ ๋๋ ๊ฒฝ๋ก๋ฅผ ์์ฑํ๋ ์ฟผ๋ฆฌ์๋ ๋ณ๋๋ก ํ ์คํธ ํฉ์ ์ ์ฅ๋๋ ๊ฒฝํฅ์ด ์๋ QL ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ฉ ๋จ์ ํ ์คํธ์ ๋๋ค.
-
์ฟผ๋ฆฌ๋ฅผ ์คํํ ์์ ์ฝ๋์ ๋๋ค. ์ฟผ๋ฆฌ๊ฐ ์๋ณํ๋๋ก ์ค๊ณ๋ ์ฝ๋์ ์์ ๋ฅผ ํฌํจํ๋ ํ๋ ์ด์์ ํ์ผ๋ก ๊ตฌ์ฑ๋์ด์ผ ํฉ๋๋ค.
ํ์ฅ๋ช
์ด .expected
์ธ ํ์ผ์ ๋ง๋ค์ด ์์ ์ฝ๋์ฉ ์ฟผ๋ฆฌ๋ฅผ ์คํํ ๋ ์์๋๋ ๊ฒฐ๊ณผ๋ฅผ ์ ์ํ ์๋ ์์ต๋๋ค. ํ
์คํธ ๋ช
๋ น์ ๊ทธ๋๋ก ๋๊ณ .expected
ํ์ผ์ ๋ง๋ค ์๋ ์์ต๋๋ค.
์ฟผ๋ฆฌ๋ฅผ ๋ง๋ค๊ณ ํ ์คํธํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ ์ฃผ๋ ์์ ๋, ์๋ ์์ ๋ฅผ ์ฐธ์กฐํ์ธ์.
์ฐธ๊ณ ํญ๋ชฉ
.ql
, .qlref
, .expected
ํ์ผ์ ์ผ๊ด๋ ์ด๋ฆ์ด ์์ด์ผ ํฉ๋๋ค.
- ํ
์คํธ ๋ช
๋ น์์
.ql
ํ์ผ ์์ฒด๋ฅผ ์ง์ ์ง์ ํ๋ ค๋ฉด ํด๋น.expected
ํ์ผ๊ณผ ๋์ผํ ๊ธฐ๋ณธ ์ด๋ฆ์ด ์์ด์ผ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด ์ฟผ๋ฆฌ๊ฐMyJavaQuery.ql
์ธ ๊ฒฝ์ฐ ์์ ๊ฒฐ๊ณผ ํ์ผ์MyJavaQuery.expected
(์ด)๊ฐ ๋์ด์ผ ํฉ๋๋ค. - ํ
์คํธ ๋ช
๋ น์์
.qlref
ํ์ผ์ ์ง์ ํ๋ ค๋ฉด, ํด๋น.expected
ํ์ผ๊ณผ ๋์ผํ ๊ธฐ๋ณธ ์ด๋ฆ์ด ์์ด์ผ ํ์ง๋ง ์ฟผ๋ฆฌ ์์ฒด ์ด๋ฆ์ ๋ค๋ฅผ ์๋ ์์ต๋๋ค. - ์์ ์ฝ๋ ํ์ผ์ ์ด๋ฆ์ ๋ค๋ฅธ ํ
์คํธ ํ์ผ๊ณผ ์ผ์นํ ํ์๊ฐ ์์ต๋๋ค.
.qlref
(๋๋.ql
) ํ์ผ ์์ ์๋ ๋ชจ๋ ์์ ์ฝ๋ ํ์ผ๊ณผ ํ์ ๋๋ ํฐ๋ฆฌ์์ ํ ์คํธ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ง๋๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ๋ฐ๋ผ์ ๊ฐ๋จํ ํ๊ธฐ ์ํด ์๋ก์ ์์ ํญ๋ชฉ์ธ ๋๋ ํฐ๋ฆฌ์ ํ ์คํธ ํ์ผ์ ์ ์ฅํ์ง ์๋ ๊ฒ์ด ์ข์ต๋๋ค.
codeql test run
์คํ
CodeQL ์ฟผ๋ฆฌ ํ ์คํธ๋ ๋ค์ ๋ช ๋ น์ ์คํํ์ฌ ์ค์๋ฉ๋๋ค.
codeql test run <test|dir>
<test|dir>
์ธ์๋ ๋ค์ ์ค ํ๋ ์ด์์ด ๋ ์ ์์ต๋๋ค.
.ql
ํ์ผ์ ๋ํ ๊ฒฝ๋ก์ ๋๋ค..ql
ํ์ผ์ ์ฐธ์กฐํ๋.qlref
ํ์ผ์ ๊ฒฝ๋ก์ ๋๋ค..ql
๋ฐ.qlref
ํ์ผ์ ์ฌ๊ท์ ์ผ๋ก ๊ฒ์ํ ๋๋ ํฐ๋ฆฌ ๊ฒฝ๋ก์ ๋๋ค.
๋ค์์ ์ง์ ํ ์๋ ์์ต๋๋ค.
--threads:
์ ํ์ ์ผ๋ก ์ฟผ๋ฆฌ๋ฅผ ์คํํ ๋ ์ฌ์ฉํ ์ค๋ ๋ ์์ ๋๋ค. ๊ธฐ๋ณธ ์ต์ ์1
์ ๋๋ค. ๋ ๋ง์ ์ค๋ ๋๋ฅผ ์ง์ ํ์ฌ ์ฟผ๋ฆฌ ์คํ ์๋๋ฅผ ๋์ผ ์ ์์ต๋๋ค. ์ค๋ ๋ ์๋ฅผ ๋ ผ๋ฆฌ ํ๋ก์ธ์ ์์ ์ผ์น์ํค๋ ค๋ฉด0
(์ผ)๋ก ์ง์ ํฉ๋๋ค.
์ฟผ๋ฆฌ๋ฅผ ํ ์คํธํ ๋ ์ฌ์ฉํ ์ ์๋ ๋ชจ๋ ์ต์ ์ ๋ํ ์ ์ฒด ๋ด์ฉ์ ํ ์คํธ ์คํ์(๋ฅผ) ์ฐธ์กฐํ์ธ์.
์์
๋ค์ ์์ ์์๋ Java ์ฝ๋์์ ๋น then
๋ธ๋ก์ด ์๋ if
๋ฌธ์ ๊ฒ์ํ๋ ์ฟผ๋ฆฌ์ ๋ํ ํ
์คํธ๋ฅผ ์ค์ ํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ ์ค๋๋ค. ์ฌ๊ธฐ์๋ ์ฌ์ฉ์ ์ง์ ์ฟผ๋ฆฌ ๋ฐ ํด๋น ํ
์คํธ ํ์ผ์ ์ถ๊ฐํ์ฌ CodeQL ๋ฆฌํฌ์งํ ๋ฆฌ์ ์ฒดํฌ ์์ ์ธ๋ถ์ ์๋ CodeQL ํฉ์ ๊ตฌ๋ถํ๋ ๋จ๊ณ๊ฐ ํฌํจ๋์ด ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด CodeQL ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์
๋ฐ์ดํธํ๊ฑฐ๋ ๋ค๋ฅธ ๋ถ๊ธฐ๋ฅผ ์ฒดํฌ ์์ํ ๊ฒฝ์ฐ ์ฌ์ฉ์ ์ง์ ์ฟผ๋ฆฌ ๋ฐ ํ
์คํธ๋ฅผ ๋ฎ์ด์ฐ์ง ์์ต๋๋ค.
์ฟผ๋ฆฌ ๋ฐ ํ ์คํธ ํ์ผ ์ค๋น
-
์ฟผ๋ฆฌ๋ฅผ ๊ฐ๋ฐํฉ๋๋ค. ์๋ฅผ ๋ค์ด ๋ค์์ ๊ฐ๋จํ ์ฟผ๋ฆฌ๋ Java ์ฝ๋์์ ๋น
then
๋ธ๋ก์ ์ฐพ์ต๋๋ค.import java from IfStmt ifstmt where ifstmt.getThen() instanceof EmptyStmt select ifstmt, "This if statement has an empty then."
-
๋ค๋ฅธ ์ฌ์ฉ์ ์ง์ ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋๋ ํฐ๋ฆฌ์
EmptyThen.ql
(์ผ)๋ก ๋ช ๋ช ๋ ํ์ผ์ ์ฟผ๋ฆฌ๋ฅผ ์ ์ฅํฉ๋๋ค. ์:custom-queries/java/queries/EmptyThen.ql
. -
์ฌ์ฉ์ ์ง์ ์ฟผ๋ฆฌ๋ฅผ CodeQL ํฉ์ ์์ง ์ถ๊ฐํ์ง ์์ ๊ฒฝ์ฐ ์ด์ CodeQL ํฉ์ ๋ง๋ญ๋๋ค. ์๋ฅผ ๋ค์ด ์ฌ์ฉ์ ์ง์ Java ์ฟผ๋ฆฌ๊ฐ
custom-queries/java/queries
์ ์ ์ฅ๋ ๊ฒฝ์ฐ ๋ค์ ๋ด์ฉ์ด ํฌํจ๋qlpack.yml
ํ์ผ์custom-queries/java/queries
์ ์ถ๊ฐํฉ๋๋ค.name: my-custom-queries dependencies: codeql/java-queries: "*"
CodeQL ํฉ์ ๋ํ ์์ธํ ๋ด์ฉ์ "CodeQL ํฉ์ ์ฌ์ฉํ์ฌ ๋ถ์ ์ฌ์ฉ์ ์ง์ "์(๋ฅผ) ์ฐธ์กฐํ์ธ์.
-
๋ค์ ๋ด์ฉ์ด ํฌํจ๋
qlpack.yml
ํ์ผ์custom-queries/java/tests
์ ์ถ๊ฐํ๊ณ ์ฌ์ฉ์ ์ง์ ์ฟผ๋ฆฌ์ CodeQL ํฉ์ ์ด๋ฆ๊ณผ ์ผ์นํ๋๋กdependencies
(์)๋ฅผ ์ ๋ฐ์ดํธํ์ฌ Java ํ ์คํธ์ฉ CodeQL ํฉ์ ๋ง๋ญ๋๋ค.๋ค์
qlpack.yml
ํ์ผ์ 1.2.3๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์ ๋ฒ์ ๊ณผ 2.0.0๋ณด๋ค ์์ ๋ฒ์ ์my-github-user/my-query-tests
๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋คmy-github-user/my-custom-queries
. ๋ํ CLI๋ ํ ์คํธ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ง๋ค ๋ Javaextractor
์(๋ฅผ) ์ฌ์ฉํด์ผ ํ๋ค๊ณ ์ ์ธํฉ๋๋ค. ์ดtests: .
์ค์--strict-test-discovery
์ต์ ์ ์ฌ์ฉํ์ฌ ์คํํ ๋ ํฉ์ ๋ชจ๋.ql
ํ์ผ์ ํ ์คํธ๋กcodeql test run
์คํํด์ผ ํ๋ค๊ณ ์ ์ธํฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ํ ์คํธ ํฉ์๋version
์์ฑ์ด ํฌํจ๋์ง ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ค์๋ก ๊ฒ์๋์ง ์์ต๋๋ค.name: my-github-user/my-query-tests dependencies: my-github-user/my-custom-queries: ^1.2.3 extractor: java-kotlin tests: .
-
ํ ์คํธ ๋๋ ํฐ๋ฆฌ์ ๋ฃจํธ์์
codeql pack install
(์)๋ฅผ ์คํํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ด ํฉ์์ ์ฟผ๋ฆฌ๋ฅผ ์คํํ๋ ๋ฐ ํ์ํ ๋ชจ๋ ์ ์ด์ ์ข ์์ฑ์ ์ง์ ํ๋codeql-pack.lock.yml
ํ์ผ์ด ์์ฑ๋ฉ๋๋ค. -
Java ํ ์คํธ ํฉ ๋ด์์
EmptyThen.ql
(์)๊ณผ ์ฐ๊ฒฐ๋ ํ ์คํธ ํ์ผ์ ํฌํจํ ๋๋ ํฐ๋ฆฌ๋ฅผ ๋ง๋ญ๋๋ค. ์:custom-queries/java/tests/EmptyThen
. -
์ ๋๋ ํฐ๋ฆฌ์์
EmptyThen.qlref
(์)๋ฅผ ๋ง๋ค์ดEmptyThen.ql
์ ์์น๋ฅผ ์ ์ํฉ๋๋ค. ๋๋ ํฐ๋ฆฌ์ ๊ฒฝ๋ก๋ ์ฟผ๋ฆฌ๊ฐ ํฌํจ๋ CodeQL ํฉ์ ๋ฃจํธ๋ฅผ ๊ธฐ์ค์ผ๋ก ์ง์ ๋์ด์ผ ํฉ๋๋ค. ์ด ๊ฒฝ์ฐ ์ฟผ๋ฆฌ๋my-query-tests
์ ๋ํ ์ข ์์ฑ์ผ๋ก ์ ์ธ๋my-custom-queries
์ด๋ผ๋ CodeQL ํฉ์ ์ต์์ ๋๋ ํฐ๋ฆฌ์ ์์ต๋๋ค. ๋ฐ๋ผ์EmptyThen.qlref
(์) ๋จ์ํEmptyThen.ql
(์)๋ฅผ ํฌํจํด์ผ ํฉ๋๋ค. -
์ฝ๋ ์กฐ๊ฐ์ ๋ง๋ญ๋๋ค. ๋ค์ Java ์ฝ๋๋ ์ธ ๋ฒ์งธ ์ค์ ๋น
if
๋ฌธ์ ํฌํจํฉ๋๋ค.custom-queries/java/tests/EmptyThen/Test.java
์ ์ ์ฅํฉ๋๋ค.class Test { public void problem(String arg) { if (arg.isEmpty()) ; { System.out.println("Empty argument"); } } public void good(String arg) { if (arg.isEmpty()) { System.out.println("Empty argument"); } } }
ํ ์คํธ๋ฅผ ์คํํฉ๋๋ค.
ํ
์คํธ๋ฅผ ์คํํ๋ ค๋ฉด custom-queries
๋๋ ํฐ๋ฆฌ๋ก ์ด๋ํ์ฌ codeql test run java/tests/EmptyThen
(์)๋ฅผ ์คํํฉ๋๋ค.
ํ ์คํธ๊ฐ ์คํ๋๋ฉด ๋ค์์ ์ํํฉ๋๋ค.
-
EmptyThen
๋๋ ํฐ๋ฆฌ์์ ํ ์คํธ ํ๋๋ฅผ ์ฐพ์ต๋๋ค. -
EmptyThen
๋๋ ํฐ๋ฆฌ์ ์ ์ฅ๋.java
ํ์ผ์์ CodeQL ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ถ์ถํฉ๋๋ค. -
EmptyThen.qlref
ํ์ผ์์ ์ฐธ์กฐํ๋ ์ฟผ๋ฆฌ๋ฅผ ์ปดํ์ผํฉ๋๋ค.์ด ๋จ๊ณ๊ฐ ์คํจํ๋ฉด CLI์์ ์ฌ์ฉ์ ์ง์ CodeQL ํฉ์ ์ฐพ์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ช ๋ น์ ๋ค์ ์คํํ๊ณ ์ฌ์ฉ์ ์ง์ CodeQL ํฉ์ ์์น๋ฅผ ์ง์ ํฉ๋๋ค. ์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
codeql test run --search-path=java java/tests/EmptyThen
๊ตฌ์ฑ์ ์ผ๋ถ๋ก ๊ฒ์ ๊ฒฝ๋ก๋ฅผ ์ ์ฅํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์์ธํ ๋ด์ฉ์ CodeQL ๊ตฌ์ฑ ํ์ผ์์ ๋ช ๋ น ์ต์ ์ง์ ํ๊ธฐ์(๋ฅผ) ์ฐธ์กฐํ์ธ์.
-
์ฟผ๋ฆฌ๋ฅผ ์คํํ๊ณ
EmptyThen.actual
๊ฒฐ๊ณผ ํ์ผ์ ์์ฑํ์ฌ ํ ์คํธ๋ฅผ ์คํํฉ๋๋ค. -
.actual
๊ฒฐ๊ณผ ํ์ผ๊ณผ ๋น๊ตํEmptyThen.expected
ํ์ผ์ ํ์ธํฉ๋๋ค. -
ํ ์คํธ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ณ ํฉ๋๋ค.
0 tests passed; 1 tests failed:
์ ๊ฒฝ์ฐ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ฟผ๋ฆฌ์ ์์ ๊ฒฐ๊ณผ๊ฐ ํฌํจ๋ ํ์ผ์ ์์ง ์ถ๊ฐํ์ง ์์๊ธฐ ๋๋ฌธ์ ํ ์คํธ์ ์คํจํ์ต๋๋ค.
์ฟผ๋ฆฌ ํ ์คํธ ์ถ๋ ฅ ๋ณด๊ธฐ
CodeQL์(๋) EmptyThen
๋๋ ํฐ๋ฆฌ์ ๋ค์ ํ์ผ์ ์์ฑํฉ๋๋ค.
EmptyThen.actual
, ์ฟผ๋ฆฌ์์ ์์ฑ๋ ์ค์ ๊ฒฐ๊ณผ๋ฅผ ํฌํจํ๋ ํ์ผ์ ๋๋ค.EmptyThen.testproj
, VS Code์ ๋ก๋ํ๊ณ ์คํจํ ํ ์คํธ๋ฅผ ๋๋ฒ๊ทธํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ ํ ์คํธ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋๋ค. ํ ์คํธ๊ฐ ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋๋ฉด ์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ํ์ฐ์คํคํ ๋จ๊ณ์์ ์ญ์ ๋ฉ๋๋ค.--keep-databases
์ต์ ์ผ๋กtest run
(์)๋ฅผ ์คํํ์ฌ ์ด ๋จ๊ณ๋ฅผ ์ฌ์ ์ํ ์ ์์ต๋๋ค.
์ด ๊ฒฝ์ฐ ์์๋ ์ค๋ฅ๋ฅผ ์ฝ๊ฒ ์์ ํ ์ ์์ต๋๋ค. EmptyThen.actual
ํ์ผ์ ์ด๋ฉด ํ
์คํธ ๊ฒฐ๊ณผ๋ฅผ ๋ณผ ์ ์์ต๋๋ค.
| Test.java:3:5:3:22 | stmt | This if statement has an empty then. |
์ด ํ์ผ์๋ ์ฟผ๋ฆฌ๊ฐ ์ถ๋ ฅํ๋ select
์ ์ ๊ฐ ๋ถ๋ถ์ ๋ํ ๋ณ๋์ ์ด๊ณผ ํจ๊ป ๊ฒฐ๊ณผ ์์น์ ๋ํ ์ด์ด ์๋ ํ
์ด๋ธ์ด ํฌํจ๋์ด ์์ต๋๋ค.
์์๋ ๊ฒฐ๊ณผ์ด๋ฏ๋ก ํ์ผ ํ์ฅ์๋ฅผ ์
๋ฐ์ดํธํ์ฌ ์ด ํ
์คํธ(EmptyThen.expected
)์ ๋ํ ์์ ๊ฒฐ๊ณผ๋ก ์ ์ํ ์ ์์ต๋๋ค.
์ง๊ธ ํ
์คํธ๋ฅผ ๋ค์ ์คํํ๋ฉด ์ถ๋ ฅ์ ๋น์ทํ์ง๋ง All 1 tests passed.
(์)๋ฅผ ๋ณด๊ณ ํ์ฌ ์๋ฃ๋ฉ๋๋ค.
์๋ฅผ ๋ค์ด ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๊ฐ ๋ณ๊ฒฝ๋๋ฉด ์ฟผ๋ฆฌ์ ๋ํ select
๋ฌธ์ ์์ ํ ๊ฒฝ์ฐ, ํ
์คํธ๊ฐ ์คํจํฉ๋๋ค. ์คํจํ ๊ฒฐ๊ณผ์ ๊ฒฝ์ฐ CLI ์ถ๋ ฅ์๋ EmptyThen.expected
๋ฐ EmptyThen.actual
ํ์ผ์ ํตํฉ๋ ์ฐจ์ด๊ฐ ํฌํจ๋ฉ๋๋ค.
์ด ์ ๋ณด๋ ๊ฐ๋จํ ํ
์คํธ ์ค๋ฅ๋ฅผ ๋๋ฒ๊ทธํ๊ธฐ์ ์ถฉ๋ถํ ์ ์์ต๋๋ค.
๋๋ฒ๊ทธํ๊ธฐ ์ด๋ ค์ด ์ค๋ฅ์ ๊ฒฝ์ฐ, EmptyThen.testproj
(์)๋ฅผ VS Code์ฉ CodeQL(์ผ)๋ก ๊ฐ์ ธ์ Test.java
์์ ์ฝ๋์์ EmptyThen.ql
(์)๋ฅผ ์คํํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ CodeQL ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ด๋ฆฌ์(๋ฅผ) ์ฐธ์กฐํ์ธ์.