์ถ์ถ๊ธฐ ์ ๋ณด
CodeQL CLI์(๋) ์ถ์ถ๊ธฐ๋ผ๋ ํน์ ํ๋ก๊ทธ๋จ์ ์ฌ์ฉํ์ฌ ์ํํธ์จ์ด ์์คํ ์ ์์ค ์ฝ๋์์ ์ฟผ๋ฆฌํ ์ ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก ์ ๋ณด๋ฅผ ์ถ์ถํฉ๋๋ค. CodeQL CLI๋ฅผ ํตํด ์ถ์ถ๊ธฐ ๊ตฌ์ฑ ์ต์ ์ ์ค์ ํ์ฌ ์ถ์ถ๊ธฐ์ ๋์์ ์ฌ์ฉ์ ์ง์ ํ ์ ์์ต๋๋ค.
์ถ์ถ๊ธฐ ์ต์ ์ ๋ณด
๊ฐ ์ถ์ถ๊ธฐ๋ ๊ณ ์ ํ ๊ตฌ์ฑ ์ต์
์งํฉ์ ์ ์ํฉ๋๋ค. ํน์ ์ถ์ถ๊ธฐ์์ ์ฌ์ฉํ ์ ์๋ ์ต์
์ ํ์ธํ๋ ค๋ฉด --format=betterjson ์ต์
๊ณผ ํจ๊ป codeql resolve languages ๋๋ codeql resolve extractor๋ฅผ ์คํํ ์ ์์ต๋๋ค. betterjson ์ถ๋ ฅ ํ์์ ์ถ์ถ๊ธฐ์ ๋ฃจํธ ๊ฒฝ๋ก์ ์ถ๊ฐ ์ ๋ณด๋ฅผ ์ ๊ณตํฉ๋๋ค. codeql resolve extractor --format=betterjson ์ถ๋ ฅ์ ํํ ๋ค์ ์์ ๊ฐ์ด ํ์์ด ์ง์ ๋ฉ๋๋ค.
{
"extractor_root" : "/home/user/codeql/java",
"extractor_options" : {
"option1" : {
"title" : "Java extractor option 1",
"description" : "An example string option for the Java extractor.",
"type" : "string",
"pattern" : "[a-z]+"
},
"group1" : {
"title" : "Java extractor group 1",
"description" : "An example option group for the Java extractor.",
"type" : "object",
"properties" : {
"option2" : {
"title" : "Java extractor option 2",
"description" : "An example array option for the Java extractor",
"type" : "array",
"pattern" : "[1-9][0-9]*"
}
}
}
}
}
์ถ์ถ๊ธฐ ์ต์
์ด๋ฆ ๋ฐ ์ค๋ช
์ extractor_options ์๋์ ๋์ด๋ฉ๋๋ค. ๊ฐ ์ต์
์ ๋ํด ๋ค์ ํ๋๋ฅผ ์ค์ ํฉ๋๋ค.
title(ํ์): ์ต์ ์ ์ ๋ชฉdescription(ํ์): ์ต์ ์ ๋ํ ์ค๋ชtype(ํ์): ์ต์ ์ ํ์์ ๋๋ค. ๋ค์ ์ค ํ๋๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.string: ์ต์ ์ ๋จ์ผ ๋ฌธ์์ด ๊ฐ์ด ์์ ์ ์์์ ๋ํ๋ ๋๋ค.array: ์ต์ ์ ๋ฌธ์์ด ๊ฐ ์ํ์ค๊ฐ ์์ ์ ์์์ ๋ํ๋ ๋๋ค.object: ์ต์ ์์ฒด๊ฐ ์๋๋ผ ๋ค๋ฅธ ์ต์ ๋ฐ ์ต์ ๊ทธ๋ฃน์ ํฌํจํ ์ ์๋ ๊ทธ๋ฃนํ์์ ๋ํ๋ ๋๋ค.
pattern(์ ํ ์ฌํญ): ์ต์ ์ ๋ชจ๋ ๊ฐ์ด ์ผ์นํด์ผ ํ๋ ์ ๊ท์ ํจํด์ ๋๋ค. ์ถ์ถ๊ธฐ๋ ์ด ์ ๊ท์ ํจํด์์ ํํํ ์ ์๊ฑฐ๋ ํํํ ์ ์๋ ์ต์ ๊ฐ์ ์ถ๊ฐ ์ ์ฝ ์กฐ๊ฑด์ ์ ์ฉํ ์ ์์ต๋๋ค. ์ด๋ฌํ ์ ์ฝ ์กฐ๊ฑด์ด ์๋ ๊ฒฝ์ฐ ์ค๋ช ํ๋ ์๋์ ์ค๋ช ๋ฉ๋๋ค.properties(์ ํ ์ฌํญ): ์ต์ ๊ทธ๋ฃน์ ์ถ์ถ๊ธฐ ์ต์ ์ด๋ฆ์์ ํด๋น ์ถ์ถ๊ธฐ ์ต์ ์ค๋ช ์ผ๋ก์ ๋งต์ ๋๋ค. ์ด ํ๋๋ ์ต์ ๊ทธ๋ฃน์ ๋ํด์๋ง ์กด์ฌํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค๋ฉดobject์ ํ์ ์ต์ ์ ๋๋ค.
์์ ์์์ ์ถ์ถ๊ธฐ๋ ๋ ๊ฐ์ง ์ต์ ์ ์ ์ธํฉ๋๋ค.
option1์[a-z]+์ ์ผ์นํ๋ ๊ฐ์ ๊ฐ๋string์ต์ ์ ๋๋ค.group1.option2๋[1-9][0-9]\*์ ์ผ์นํ๋ ๊ฐ์ ๊ฐ๋array์ต์ ์ ๋๋ค.
CodeQL CLI๋ฅผ ์ฌ์ฉํ์ฌ ์ถ์ถ๊ธฐ ์ต์ ์ค์
CodeQL CLI๋ ์ถ์ถ๊ธฐ๋ฅผ ์ง์ ๋๋ ๊ฐ์ ์ ์ผ๋ก ํธ์ถํ๋ ํ์ ๋ช ๋ น์ ์ถ์ถ๊ธฐ ์ต์ ์ค์ ์ ์ง์ํฉ๋๋ค. ํด๋น ๋ช ๋ น์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
codeql database createcodeql database start-tracingcodeql database trace-commandcodeql database index-files
์ด๋ฌํ ํ์ ๋ช
๋ น์ ์คํํ ๋ --extractor-option CLI ์ต์
์ ์ฌ์ฉํ์ฌ ์ถ์ถ๊ธฐ ์ต์
์ ์ค์ ํ ์ ์์ต๋๋ค. ์์:
codeql database create --extractor-option java.option1=abc ...codeql database start-tracing --extractor-option java.group1.option2=102 ...
--extractor-option์๋ extractor_option_name=extractor_option_value ํ์์ ์ธ์๊ฐ ์ ํํ ํ๋ ํ์ํฉ๋๋ค. extractor_option_name์ ์ถ์ถ๊ธฐ ์ด๋ฆ(์ด ์์์๋ java)๊ณผ ๋ง์นจํ, ์ถ์ถ๊ธฐ ์ต์
์ ์ด๋ฆ(์ด ์์์๋ option1 ๋๋ group1.option2)์
๋๋ค. extractor_option_value \๋ ์ถ์ถ๊ธฐ ์ต์
์ ํ ๋น๋๋ ๊ฐ์
๋๋ค. ๊ฐ์ ์ถ์ถ๊ธฐ ์ต์
์ ์ ๊ท์ ํจํด(์๋ ๊ฒฝ์ฐ)๊ณผ ์ผ์นํด์ผ ํ๋ฉฐ ์ค ๋ฐ๊ฟ ๋ฌธ์๋ฅผ ํฌํจํด์๋ ์ ๋ฉ๋๋ค.
--extractor-option์ ์ฌ์ฉํ์ฌ ์กด์ฌํ์ง ์๋ ์ถ์ถ๊ธฐ ์ต์
์ ํ ๋นํ๋ ๊ฒ์ ์ค๋ฅ์
๋๋ค.
CodeQL CLI๋ ๋์ผํ ํธ์ถ์์ ์ฌ๋ฌ --extractor-option ์ต์
์ ํ์ฉํฉ๋๋ค. string ์ถ์ถ๊ธฐ ์ต์
์ ์ฌ๋ฌ ๋ฒ ์ค์ ํ๋ฉด ๋ง์ง๋ง ์ต์
๊ฐ์ด ์ด์ ์ ๋ชจ๋ ์ต์
์ ๋ฎ์ด์๋๋ค. ๋ฐฐ์ด ์ถ์ถ๊ธฐ ์ต์
์ ์ฌ๋ฌ ๋ฒ ์ค์ ํ๋ฉด ๋ชจ๋ ์ต์
๊ฐ์ด ์์๋๋ก ์ฐ๊ฒฐ๋ฉ๋๋ค.
์ถ์ถ๊ธฐ ์ด๋ฆ ์์ด ์ถ์ถ๊ธฐ ์ต์ ์ด๋ฆ์ ์ง์ ํ ์๋ ์์ต๋๋ค. ์์:
codeql database create --extractor-option option1=abc ...codeql database start-tracing --extractor-option group1.option2=102 ...
์ถ์ถ๊ธฐ ์ด๋ฆ์ ์ง์ ํ์ง ์์ผ๋ฉด ์ง์ ๋ ์ด๋ฆ์ผ๋ก ์ต์
์ ์ ์ธํ๋ ๋ชจ๋ ์ถ์ถ๊ธฐ์ ์ถ์ถ๊ธฐ ์ต์
์ค์ ์ด ์ ์ฉ๋ฉ๋๋ค. ์์ ์์ ์์ ์ฒซ ๋ฒ์งธ ๋ช
๋ น์ java ์ถ์ถ๊ธฐ ๋ฐ ์ต์
option1๊ฐ ์๋ ๋ชจ๋ ์ถ์ถ๊ธฐ(์: ํด๋น ์ถ์ถ๊ธฐ์ option1 ์ถ์ถ๊ธฐ ์ต์
์ด ์๋ ๊ฒฝ์ฐ cpp ์ถ์ถ๊ธฐ)์ ๋ํด ์ถ์ถ๊ธฐ ์ต์
option1์(๋ฅผ) abc(์ผ)๋ก ์ค์ ํฉ๋๋ค.
ํ์ผ์์ ์ถ์ถ๊ธฐ ์ต์ ์ค์
ํ์ผ์ ํตํด ์ถ์ถ๊ธฐ ์ต์
์ ์ค์ ํ ์๋ ์์ต๋๋ค. --extractor-option์ ์๋ฝํ๋ CodeQL CLI ํ์ ๋ช
๋ น์ --extractor-options-file๋ ์๋ฝํฉ๋๋ค. ์ฌ๊ธฐ์๋ YAML ํ์ผ(ํ์ฅ์ .yaml ๋๋ .yml) ๋๋ JSON ํ์ผ(ํ์ฅ์ .json) ๊ฒฝ๋ก์ ๋ํ ํ์ ์ธ์๊ฐ ์์ต๋๋ค. ์์:
codeql database create --extractor-options-file options.yml ...codeql database start-tracing --extractor-options-file options.json ...
๊ฐ ์ต์ ํ์ผ์๋ ์ค์ฒฉ๋ ๋งต์ ํธ๋ฆฌ ๊ตฌ์กฐ๊ฐ ํฌํจ๋์ด ์์ต๋๋ค. ๋ฃจํธ์๋ ์ถ์ถ๊ธฐ ๋งต ํค๊ฐ ์์ผ๋ฉฐ ๊ทธ ์๋์๋ ์ถ์ถ๊ธฐ ์ด๋ฆ์ ํด๋นํ๋ ์ง๋ ํค๊ฐ ์์ต๋๋ค. ์ธ ๋ฒ์งธ ์์ค๋ถํฐ ์ถ์ถ๊ธฐ ์ต์ ๋ฐ ์ต์ ๊ทธ๋ฃน์ด ์์ต๋๋ค.
JSON:
{
"extractor" : {
"java": {
"option1" : "abc",
"group1" : {
"option2" : [ 102 ]
}
}
}
}
YAML:
extractor:
java:
option1: "abc"
group1:
option2: [ 102 ]
์ถ์ถ๊ธฐ ์ต์
์ string ๊ฐ์ ๋ฌธ์์ด ๋๋ ์ซ์์ฌ์ผ ํฉ๋๋ค(์ถ๊ฐ ์ฒ๋ฆฌ ์ ์ ๋ฌธ์์ด๋ก ๋ณํ๋จ).
์ถ์ถ๊ธฐ ์ต์
์ array ๊ฐ์ ๋ฌธ์์ด ๋๋ ์ซ์์ ๋ฐฐ์ด์ด์ด์ผ ํฉ๋๋ค.
์ต์
๊ทธ๋ฃน(ํ์ object)์ ๊ฐ์ ์ค์ฒฉ๋ ์ถ์ถ๊ธฐ ์ต์
๋ฐ ์ต์
๊ทธ๋ฃน์ ํฌํจํ ์ ์๋ ๋งต์ด์ด์ผ ํฉ๋๋ค.
๊ฐ ์ถ์ถ๊ธฐ ์ต์ ๊ฐ์ ์ถ์ถ๊ธฐ ์ต์ ์ ์ ๊ท์ ํจํด(์๋ ๊ฒฝ์ฐ)๊ณผ ์ผ์นํด์ผ ํ๋ฉฐ ์ค ๋ฐ๊ฟ ๋ฌธ์๋ฅผ ํฌํจํด์๋ ์ ๋ฉ๋๋ค.
์กด์ฌํ์ง ์๋ ์ถ์ถ๊ธฐ ์ต์
์ ํ ๋นํ๋ ๊ฒ์ ์ค๋ฅ์
๋๋ค. ํน์ํ __allow_unknown_properties ๋ถ์ธ ํ๋๋ฅผ ์ฌ์ฉํ์ฌ CodeQL CLI๊ฐ ์ ์ ์๋ ์ถ์ถ๊ธฐ ์ต์
์ ๋ฌด์ํ๋๋ก ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ๋ค์ ์ต์
ํ์ผ์ CodeQL CLI๊ฐ ๋ชจ๋ ์ ์ ์๋ ์ถ์ถ๊ธฐ ์ต์
๋ฐ group1 ์๋์ ์ต์
๊ทธ๋ฃน์ ๋ฌด์ํ๋๋ก ์์ฒญํฉ๋๋ค.
extractor:
java:
option1: "abc"
group1:
__allow_unknown_properties: true
option2: [ 102 ]
--extractor-options-file์ ์ฌ๋ฌ ๋ฒ ์ง์ ํ ์ ์์ต๋๋ค. ์ถ์ถ๊ธฐ ์ต์
ํ ๋น์ ๋ค์๊ณผ ๊ฐ์ ์์๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค.
--extractor-options-file์ผ๋ก ์ง์ ํ ๋ชจ๋ ์ถ์ถ๊ธฐ ์ต์ ํ์ผ์ ๋ช ๋ น์ค์ ํ์๋๋ ์์๋๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค.--extractor-option์ผ๋ก ์ง์ ํ ๋ชจ๋ ์ถ์ถ๊ธฐ ์ต์ ํ ๋น์ ๋ช ๋ น์ค์ ํ์๋๋ ์์๋๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค.
--extractor-option์ ์ฌ์ฉํ์ฌ, --extractor-options-file์ ์ฌ์ฉํ์ฌ ๋๋ ์ด ๋์ ๋ช ๊ฐ์ง ์กฐํฉ์ ์ฌ์ฉํ์ฌ ํ ๋นํ๋์ง์ ๊ด๊ณ์์ด ๋์ผํ ์ถ์ถ๊ธฐ ์ต์
์ ์ฌ๋ฌ ๋ฒ ์ค์ ํ ๋ ๋ฐ์ํ๋ ์์
์ ๋์ผํ ๊ท์น์ด ์ ์ดํฉ๋๋ค. string ์ถ์ถ๊ธฐ ์ต์
์ ์ฌ๋ฌ ๋ฒ ์ค์ ํ๋ฉด ๋ง์ง๋ง ์ต์
๊ฐ์ด ๋ชจ๋ ์ด์ ๊ฐ์ ๋ฎ์ด์๋๋ค. array ์ถ์ถ๊ธฐ ์ต์
์ ์ฌ๋ฌ ๋ฒ ์ค์ ํ๋ฉด ๋ชจ๋ ์ต์
๊ฐ์ด ์์๋๋ก ์ฐ๊ฒฐ๋ฉ๋๋ค.