Skip to main content

CodeQL ๋ชจ๋ธ ํŽธ์ง‘๊ธฐ ์‚ฌ์šฉ

Visual Studio Code์—์„œ CodeQL ๋ชจ๋ธ ํŒฉ์„ ๋ณด๊ณ , ์“ฐ๊ณ , ํŽธ์ง‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ  ํ•ญ๋ชฉ

CodeQL ๋ชจ๋ธ ํŒฉ์€ ํ˜„์žฌ ๊ณต๊ฐœ ๋ฏธ๋ฆฌ ๋ณด๊ธฐ ์ƒํƒœ์ด๋ฉฐ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋ธ ํŒฉ์€ C/C++, C#, Java/Kotlin, Python, Ruby ๋ถ„์„์„ ์œ„ํ•ด ์ง€์›๋ฉ๋‹ˆ๋‹ค.

Visual Studio Code์— ๋Œ€ํ•œ CodeQL ํ™•์žฅ์˜ CodeQL ๋ชจ๋ธ ํŽธ์ง‘๊ธฐ์—์„œ C#, Java/Kotlin, Python, Ruby์— ๋Œ€ํ•œ ๋ชจ๋ธ๋ง ์ข…์†์„ฑ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

CodeQL ๋ชจ๋ธ ํŽธ์ง‘๊ธฐ ์ •๋ณด

CodeQL ๋ชจ๋ธ ํŒฉ์„ ์‚ฌ์šฉํ•˜๋ฉด CodeQL code scanning ๋ถ„์„์„ ํ™•์žฅํ•˜์—ฌ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ง€์›๋˜์ง€ ์•Š๋Š” ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์‚ฌ์šฉ์ž ์ง€์ • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฐ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์ธ์‹ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. CodeQL ๋ชจ๋ธ ํŽธ์ง‘๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ณ ์œ ํ•œ ๋ชจ๋ธ ํŒฉ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋ธ ํŽธ์ง‘๊ธฐ์—์„œ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์™ธ๋ถ€ ์˜์กด ๊ด€๊ณ„์— ๋Œ€ํ•œ ํ˜ธ์ถœ์„ ๋ชจ๋ธ๋งํ•˜๊ฑฐ๋‚˜ ์™ธ๋ถ€ ์˜์กด ๊ด€๊ณ„์˜ ๋ชจ๋“  ๊ณต์šฉ ํ•ญ๋ชฉ ๋ฐ ์ข…๋ฃŒ ์ง€์ ์„ ์™„์ „ํžˆ ๋ชจ๋ธ๋งํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•ˆ๋‚ดํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋ธ ํŒฉ์œผ๋กœ code scanning ๋ถ„์„์„ ์‚ฌ์šฉ์ž ์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๊ธฐ๋ณธ ์„ค์ • ๊ตฌ์„ฑ ํŽธ์ง‘ ๋ฐ ์ฝ”๋“œ ๊ฒ€์ƒ‰์„ ์œ„ํ•œ ๊ณ ๊ธ‰ ์„ค์ • ์‚ฌ์šฉ์ž ์ง€์ •์„(๋ฅผ) ์ฐธ์กฐํ•˜์„ธ์š”.

๋ชจ๋ธ ํŽธ์ง‘๊ธฐ๋ฅผ ์—ด๋ฉด ํ˜„์žฌ ์„ ํƒํ•œ CodeQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋ถ„์„ํ•˜๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์™ธ๋ถ€ API ๋ฐ ๋ชจ๋“  ๊ณต์šฉ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์œ„์น˜๋ฅผ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค. ์™ธ๋ถ€(๋˜๋Š” ํƒ€์‚ฌ) API๋Š” ์„ ํƒํ•œ CodeQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์†ํ•˜์ง€ ์•Š๋Š” API์ž…๋‹ˆ๋‹ค.

๋ชจ๋ธ ํŽธ์ง‘๊ธฐ์—๋Š” ๋‹ค์Œ์˜ ๋‘ ๊ฐ€์ง€ ๋ชจ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ชจ๋“œ(๊ธฐ๋ณธ ๋ณด๊ธฐ): ์„ ํƒํ•œ CodeQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ ์™ธ๋ถ€ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ํŽธ์ง‘๊ธฐ์— ๋‚˜์—ดํ•ฉ๋‹ˆ๋‹ค. ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ํ™•์žฅํ•˜๋ฉด ๊ฐ ํ˜ธ์ถœ์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ๋ชจ๋ธ๋งํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์˜ต์…˜๊ณผ ํ•จ๊ป˜ ์™ธ๋ถ€ API์™€์˜ ๋ชจ๋“  ํ˜ธ์ถœ ๋ชฉ๋ก์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์ด ๋ชจ๋“œ๋Š” ํŠน์ • ์ฝ”๋“œ๋ฒ ์ด์Šค์— ๋Œ€ํ•œ CodeQL ๊ฒฐ๊ณผ๋ฅผ ๊ฐœ์„ ํ•˜๋Š” ๋ฐ ๊ฐ€์žฅ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • ์ข…์†์„ฑ ๋ชจ๋“œ: ์„ ํƒํ•œ CodeQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๊ณต๊ฐœ์ ์œผ๋กœ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  API๋ฅผ ํŽธ์ง‘๊ธฐ์—์„œ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ณด๊ธฐ๋Š” ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ ๊ณต์šฉ API๋ฅผ ๋ชจ๋ธ๋งํ•˜๋Š” ๋‹จ๊ณ„๋ฅผ ์•ˆ๋‚ดํ•ฉ๋‹ˆ๋‹ค. ์ „์ฒด API ๋ชจ๋ธ๋ง์„ ์™„๋ฃŒํ•˜๋ฉด ๋ชจ๋ธ์„ ์ €์žฅํ•˜๊ณ  ์‚ฌ์šฉํ•˜์—ฌ ์ข…์†์„ฑ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ์ฝ”๋“œ๋ฒ ์ด์Šค์— ๋Œ€ํ•œ CodeQL ๋ถ„์„์„ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์„œ์˜ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์—์„œ๋Š” CodeQL ๋ชจ๋ธ ํŽธ์ง‘๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ข…์†์„ฑ์„ ๋ชจ๋ธ๋งํ•˜๋Š” ์‹ค์งˆ์ ์ธ ๋‚ด์šฉ์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค. ๊ธฐ์ˆ  ์ •๋ณด๋Š” CodeQL ์–ธ์–ด ์„ค๋ช…์„œ์—์„œ Java ๋ฐ Kotlin์šฉ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ชจ๋ธ ์‚ฌ์šฉ์ž ์ง€์ •, Python์šฉ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ชจ๋ธ ์‚ฌ์šฉ์ž ์ง€์ •, Ruby์šฉ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ชจ๋ธ ์‚ฌ์šฉ์ž ์ง€์ •, C#์šฉ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ชจ๋ธ ์‚ฌ์šฉ์ž ์ง€์ •์„ ์ฐธ์กฐํ•˜์„ธ์š”.

CodeQL ๋ชจ๋ธ ํŽธ์ง‘๊ธฐ ํ‘œ์‹œ

์ฐธ๊ณ  ํ•ญ๋ชฉ

์ด ๊ณต๊ฐœ ๋ฏธ๋ฆฌ ๋ณด๊ธฐ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด Visual Studio Code์šฉ ์ตœ์‹  ๋ฒ„์ „์˜ CodeQL ํ™•์žฅ์„ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

  1. VS Code์—์„œ CodeQL ์ž‘์—… ์˜์—ญ์„ ์—ฝ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด vscode-codeql-starter ์ž‘์—… ์˜์—ญ์„ ์—ฝ๋‹ˆ๋‹ค. ์‹œ์ž‘ ์ž‘์—… ์˜์—ญ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ main์˜ ql ํ•˜์œ„ ๋ชจ๋“ˆ์„ ์—…๋ฐ์ดํŠธํ•˜์—ฌ ๋ชจ๋ธ ํŽธ์ง‘๊ธฐ์šฉ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์ฟผ๋ฆฌ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

  2. Visual Studio Code์—์„œ ์™ผ์ชฝ ์‚ฌ์ด๋“œ๋ฐ”์˜ QL์„ ํด๋ฆญํ•˜์—ฌ GitHub Copilot ์ต์Šคํ…์…˜์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

  3. "๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค" ๋ณด๊ธฐ์—์„œ ๋ชจ๋ธ๋งํ•˜๋ ค๋Š” CodeQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

  4. CodeQL "๋ฉ”์„œ๋“œ ๋ชจ๋ธ๋ง" ๋ณด๊ธฐ์—์„œ ๋ชจ๋ธ๋ง ์‹œ์ž‘์„ ํด๋ฆญํ•˜์—ฌ ๋ชจ๋ธ ํŽธ์ง‘๊ธฐ๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ๋˜๋Š” VS Code Command Palette์„(๋ฅผ) ์‚ฌ์šฉํ•˜์—ฌ CodeQL: ๋ชจ๋ธ ํŽธ์ง‘๊ธฐ ์—ด๊ธฐ(๋ฒ ํƒ€) ๋ช…๋ น์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  5. CodeQL ๋ชจ๋ธ ํŽธ์ง‘๊ธฐ๋Š” ์ฝ”๋“œ์—์„œ API๋ฅผ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด ์ผ๋ จ์˜ ์›๊ฒฉ ๋ถ„์„ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๋ฉฐ ํŽธ์ง‘๊ธฐ๋Š” ์ƒˆ ํƒญ์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

  6. ์›๊ฒฉ ๋ถ„์„ ์ฟผ๋ฆฌ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ์‹๋ณ„๋œ API๊ฐ€ ํŽธ์ง‘๊ธฐ์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

ํŒ

ํ˜ธ์ถœ ๋˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ๋ชจ๋ธ๋งํ•˜๋Š” ๋™์•ˆ ๋” ๋งŽ์€ ๊ณต๊ฐ„์„ ํ™•๋ณดํ•˜๊ธฐ ์œ„ํ•ด CodeQL โ€œ๋ฉ”์„œ๋“œ ๋ชจ๋ธ๋งโ€ ๋ณด๊ธฐ๋ฅผ ๊ธฐ๋ณธ ์‚ฌ์ด๋“œ๋ฐ”์—์„œ ๋ณด์กฐ ์‚ฌ์ด๋“œ๋ฐ”๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณด๊ธฐ๋ฅผ ๋‹ซ์€ ๊ฒฝ์šฐ VS Code์˜ "๋ณด๊ธฐ" ๋ฉ”๋‰ด์—์„œ ๋‹ค์‹œ ์—ด์–ด ๋ณด๊ธฐ ์—ด๊ธฐ... ๋ฅผ ํด๋ฆญํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฝ”๋“œ๋ฒ ์ด์Šค๊ฐ€ ์™ธ๋ถ€ API์— ๋Œ€ํ•ด ํ˜ธ์ถœํ•˜๋Š” ๋ชจ๋ธ๋ง

์ด ๋ฐฉ๋ฒ•์€ ์ผ๋ฐ˜์ ์œผ๋กœ CodeQL ๊ฒฐ๊ณผ์˜ ์ •๋ฐ€๋„๋ฅผ ํ–ฅ์ƒํ•˜๋ ค๋Š” ํŠน์ • ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ๋ณผ ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์€ ์ฝ”๋“œ๋ฒ ์ด์Šค๊ฐ€ CodeQL์—์„œ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ํ”„๋ ˆ์ž„์›Œํฌ ๋˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ํ”„๋ ˆ์ž„์›Œํฌ ๋˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์†Œ์Šค ์ฝ”๋“œ๊ฐ€ ๋ถ„์„์— ํฌํ•จ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ด ์„น์…˜์—์„œ๋Š” "sofa-jraft"๋ผ๋Š” ์˜คํ”ˆ ์†Œ์Šค Java ํ”„๋กœ์ ํŠธ๋ฅผ ์˜ˆ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์ปดํŒŒ์ผ๋œ ์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ ์™ธ๋ถ€ API์— ๋Œ€ํ•œ ํ˜ธ์ถœ์„ ๋ชจ๋ธ๋งํ•˜๋Š” ํ™˜๊ฒฝ๋„ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.

  1. Visual Studio Code์—์„œ CodeQL ์ ์šฉ ๋ฒ”์œ„๋ฅผ ๊ฐœ์„ ํ•  CodeQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

  2. CodeQL ๋ชจ๋ธ ํŽธ์ง‘๊ธฐ๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ํŽธ์ง‘๊ธฐ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ชจ๋“œ์—์„œ ์‹คํ–‰๋˜๋ฏ€๋กœ ์„ ํƒํ•œ ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์™ธ๋ถ€ API ๋ชฉ๋ก์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

    "sofa-jraft" ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋‘ ๊ฐœ์˜ ์™ธ๋ถ€ Java ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๋ณด์—ฌ ์ฃผ๋Š” "์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ชจ๋“œ" ๋ณด๊ธฐ ์Šคํฌ๋ฆฐ์ƒท

  3. ์™ธ๋ถ€ API๋ฅผ ํ™•์žฅํ•˜๊ณ  ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ ์™ธ๋ถ€ ์˜์กด ๊ด€๊ณ„๋กœ์˜ ํ˜ธ์ถœ ๋ชฉ๋ก์„ ๋ณด๋ ค๋ฉด ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

    "rocksdbjni" ํ”„๋ ˆ์ž„์›Œํฌ์— ๋Œ€ํ•œ ํ˜ธ์ถœ์„ ๋ณด์—ฌ ์ฃผ๋Š” "์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ชจ๋“œ"์˜ ์Šคํฌ๋ฆฐ์ƒท ์ฒซ ๋ฒˆ์งธ ํ˜ธ์ถœ์— ๋Œ€ํ•œ "View" ์˜ต์…˜์€ ์ฃผํ™ฉ์ƒ‰ ์œค๊ณฝ์„ ์œผ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

  4. API ํ˜ธ์ถœ ๋˜๋Š” ๋ฉ”์„œ๋“œ์™€ ์—ฐ๊ฒฐ๋œ ๋ณด๊ธฐ๋ฅผ ํด๋ฆญํ•˜์—ฌ ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์œ„์น˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

  5. ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ API๋กœ์˜ ์ฒซ ๋ฒˆ์งธ ํ˜ธ์ถœ์ด ํฌํ•จ๋œ ํŒŒ์ผ์ด ์—ด๋ฆฌ๊ณ  CodeQL "๋ฉ”์„œ๋“œ ์‚ฌ์šฉ๋Ÿ‰" ๋ณด๊ธฐ๊ฐ€ VS Code์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค(์—ฌ๊ธฐ์„œ "๋ฌธ์ œ" ๋ฐ "ํ„ฐ๋ฏธ๋„" ๋ณด๊ธฐ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ํ‘œ์‹œ๋จ). CodeQL "๋ฉ”์„œ๋“œ ์‚ฌ์šฉ๋Ÿ‰" ๋ณด๊ธฐ๋Š” ์ฝ”๋“œ์—์„œ API๋กœ์˜ ๋ชจ๋“  ํ˜ธ์ถœ ๋ชฉ๋ก์„ ๋ฉ”์„œ๋“œ๋ณ„๋กœ ๊ทธ๋ฃนํ™”ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ์‚ฌ์šฉ์„ ํ†ตํ•ด ํด๋ฆญํ•˜์—ฌ ๋ฉ”์„œ๋“œ ์‚ฌ์šฉ์„ ๋ชจ๋ธ๋งํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  6. ๋ฉ”์„œ๋“œ ์‚ฌ์šฉ์„ ๋ชจ๋ธ๋งํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ฒฐ์ •ํ•œ ๊ฒฝ์šฐ ๋‹ค๋ฅธ ๋ชจ๋ธ ์œ ํ˜•์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. CodeQL ์ต์Šคํ…์…˜์˜ CodeQL "๋ฉ”์„œ๋“œ ๋ชจ๋ธ๋ง" ๋ณด๊ธฐ์—์„œ "๋ชจ๋ธ ์œ ํ˜•" ์•„๋ž˜์˜ ๋“œ๋กญ๋‹ค์šด์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ณ€๊ฒฝ ๋‚ด์šฉ์€ ๊ธฐ๋ณธ ๋ชจ๋ธ ํŽธ์ง‘๊ธฐ์—์„œ ์ž๋™์œผ๋กœ ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค.

  7. ํ•ด๋‹น ํ–‰์˜ ๋‚˜๋จธ์ง€ ํ•„๋“œ๋Š” ์„ ํƒํ•œ ๋ชจ๋ธ ์œ ํ˜•์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์˜ต์…˜์œผ๋กœ ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค.

    • "์›๋ณธ": ๋ชจ๋ธ๋งํ•  "์ถœ๋ ฅ" ์š”์†Œ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
    • "์‹ฑํฌ": ๋ชจ๋ธ๋งํ•  "์ž…๋ ฅ" ์š”์†Œ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
    • "ํ๋ฆ„ ์š”์•ฝ": ๋ชจ๋ธ๋งํ•  "์ž…๋ ฅ" ๋ฐ "์ถœ๋ ฅ" ์š”์†Œ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  8. ๋ชจ๋ธ์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ ํ๋ฆ„์˜ "์ข…๋ฅ˜"๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

  9. ๋ชจ๋ธ๋ง์„ ๋งˆ์ณค์œผ๋ฉด ๊ธฐ๋ณธ ๋ชจ๋ธ ํŽธ์ง‘๊ธฐ๋ฅผ ํ‘œ์‹œํ•˜๊ณ  ๋ชจ๋‘ ์ €์žฅ ๋˜๋Š” ์ €์žฅ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค(ํ™•์žฅ๋œ ๊ฐ ๋ฉ”์„œ๋“œ ๋ชฉ๋ก์˜ ์˜ค๋ฅธ์ชฝ ์•„๋ž˜์— ํ‘œ์‹œ๋จ). ํŽธ์ง‘๊ธฐ์—์„œ ๋ชจ๋ธ๋ง๋œ ๋ฉ”์„œ๋“œ์˜ ๋ฐฑ๋ถ„์œจ์ด ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค.

๋ชจ๋ธ์€ .github/codeql/extensions/CODEQL-MODEl-PACK ์ž‘์—… ์˜์—ญ์— ์ €์žฅ๋˜๋ฉฐ, ์—ฌ๊ธฐ์„œ CODEQL-MODEL-PACK์€ ์„ ํƒํ•œ CodeQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ์ฆ‰, CodeQL์—์„œ ๋ถ„์„ํ•œ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ, ํ•˜์ดํ”ˆ, ์–ธ์–ด์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ CodeQL ํŒฉ ๋งŒ๋“ค๊ธฐ ๋ฐ ์ž‘์—…์„(๋ฅผ) ์ฐธ์กฐํ•˜์„ธ์š”.

๋ชจ๋ธ์€ ๊ฐ ์™ธ๋ถ€ API์— ๋Œ€ํ•ด ํ•˜๋‚˜์”ฉ ์ผ๋ จ์˜ YAML ๋ฐ์ดํ„ฐ ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ ํŒŒ์ผ์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์‹œ:

.github/codeql/extensions/sofa-jraft-java # the model pack directory
    models
        jmh-core.model.yml                  # models calls to jmh-core@1.20
        rocksdbjni.model.yml                # models calls to rocksdbjni@7.7.3

์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ๊ณต์šฉ API ๋ชจ๋ธ๋ง

์ผ๋ฐ˜์ ์œผ๋กœ ์กฐ์ง์—์„œ ๋‘˜ ์ด์ƒ์˜ ์ฝ”๋“œ๋ฒ ์ด์Šค์— ์‚ฌ์šฉํ•˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ ๋˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ชจ๋ธ๋งํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ์ด ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋ธ ๋งŒ๋“ค๊ธฐ ๋ฐ ํ…Œ์ŠคํŠธ๋ฅผ ๋งˆ์ณค์œผ๋ฉด ์ „์ฒด ์กฐ์ง์—์„œ ์‚ฌ์šฉํ•  GitHub Container registry์— CodeQL ๋ชจ๋ธ ํŒฉ์„ ๊ฒŒ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์„น์…˜์—์„œ๋Š” "sofa-jraft"๋ผ๋Š” ์˜คํ”ˆ ์†Œ์Šค Java ํ”„๋กœ์ ํŠธ๋ฅผ ์˜ˆ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์ปดํŒŒ์ผ๋œ ์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ ์™ธ๋ถ€ API์— ๋Œ€ํ•œ ํ˜ธ์ถœ์„ ๋ชจ๋ธ๋งํ•˜๋Š” ํ™˜๊ฒฝ๋„ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.

  1. ๋ชจ๋ธ๋งํ•˜๋ ค๋Š” CodeQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

  2. CodeQL ๋ชจ๋ธ ํŽธ์ง‘๊ธฐ๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ํŽธ์ง‘๊ธฐ๊ฐ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ชจ๋“œ์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์ข…์†์„ฑ ๋ชจ๋“œ๋ฅผ ํ‘œ์‹œํ•˜๋ ค๋ฉด ์ข…์†์„ฑ์œผ๋กœ ๋ชจ๋ธ๋ง์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค. ํ”„๋ ˆ์ž„์›Œํฌ ๋˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๊ณต์šฉ API๋ฅผ ํ‘œ์‹œํ•˜๋„๋ก ํ™”๋ฉด์ด ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค.

    "sofa-jraft" ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ ๊ฒŒ์‹œํ•œ ํŒจํ‚ค์ง€ ์„ธ ๊ฐ€์ง€๋ฅผ ๋ณด์—ฌ ์ฃผ๋Š” "์ข…์†์„ฑ ๋ชจ๋“œ" ๋ณด๊ธฐ ์Šคํฌ๋ฆฐ์ƒท

  3. ํŒจํ‚ค์ง€๋ฅผ ํ™•์žฅํ•˜๊ณ  ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฉ”์„œ๋“œ ๋ชฉ๋ก์„ ๋ณด๋ ค๋ฉด ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

  4. ๋ฉ”์„œ๋“œ์™€ ์—ฐ๊ฒฐ๋œ ๋ณด๊ธฐ๋ฅผ ํด๋ฆญํ•˜์—ฌ ํ•ด๋‹น ์ •์˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

    "com.alipay.sofa.jraft.option.BallotBoxOptions.getClosureQueue()"์— ๋Œ€ํ•œ ํ•˜๋‚˜์˜ ๋ชจ๋ธ์ด ์žˆ๋Š” "์ข…์†์„ฑ ๋ชจ๋“œ"์˜ ์Šคํฌ๋ฆฐ์ƒท "+" ๋‹จ์ถ”๊ฐ€ ์œค๊ณฝ์„ ์œผ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

  5. ๋ฉ”์„œ๋“œ๋ฅผ ๋ชจ๋ธ๋งํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ฒฐ์ •ํ•œ ๊ฒฝ์šฐ "๋ชจ๋ธ ํ˜•์‹"์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

  6. ํ•ด๋‹น ํ–‰์˜ ๋‚˜๋จธ์ง€ ํ•„๋“œ๋Š” ์„ ํƒํ•œ ๋ชจ๋ธ ์œ ํ˜•์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์˜ต์…˜์œผ๋กœ ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค.

    • "์›๋ณธ": ๋ชจ๋ธ๋งํ•  "์ถœ๋ ฅ" ์š”์†Œ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
    • "์‹ฑํฌ": ๋ชจ๋ธ๋งํ•  "์ž…๋ ฅ" ์š”์†Œ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
    • "ํ๋ฆ„ ์š”์•ฝ": ๋ชจ๋ธ๋งํ•  "์ž…๋ ฅ" ๋ฐ "์ถœ๋ ฅ" ์š”์†Œ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  7. ๋ชจ๋ธ์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ ํ๋ฆ„์˜ "์ข…๋ฅ˜"๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

  8. ๋ชจ๋ธ๋ง์„ ๋งˆ์ณค์œผ๋ฉด ๋ชจ๋‘ ์ €์žฅ ๋˜๋Š” ์ €์žฅ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค(ํ™•์žฅ๋œ ๊ฐ ํ˜ธ์ถœ ๋ชฉ๋ก์˜ ์˜ค๋ฅธ์ชฝ ์•„๋ž˜์— ํ‘œ์‹œ๋จ). ํŽธ์ง‘๊ธฐ์—์„œ ๋ชจ๋ธ๋ง๋œ ํ˜ธ์ถœ์˜ ๋ฐฑ๋ถ„์œจ์ด ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค.

๋ชจ๋ธ์€ .github/codeql/extensions/CODEQL-MODEL-PACK ์ž‘์—… ์˜์—ญ์— ์ €์žฅ๋˜๋ฉฐ, ์—ฌ๊ธฐ์„œ CODEQL-MODEL-PACK์€ ์„ ํƒํ•œ CodeQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ์ฆ‰, CodeQL์—์„œ ๋ถ„์„ํ•œ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ, ํ•˜์ดํ”ˆ, ์–ธ์–ด์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ CodeQL ํŒฉ ๋งŒ๋“ค๊ธฐ ๋ฐ ์ž‘์—…์„(๋ฅผ) ์ฐธ์กฐํ•˜์„ธ์š”.

๋ชจ๋ธ์€ ๊ฐ ๊ณต์šฉ ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•ด ํ•˜๋‚˜์”ฉ ์ผ๋ จ์˜ YAML ๋ฐ์ดํ„ฐ ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ ํŒŒ์ผ์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์‹œ:

.github/codeql/extensions/sofa-jraft-java          # the model pack directory
    models
        com.alipay.sofa.jraft.option.model.yml # models public methods in package
        com.alipay.sofa.jraft.rhea.options.model.yml

ํŽธ์ง‘๊ธฐ์—์„œ ๋ชจ๋ธ๋งํ•˜๋Š” ๊ฐ ํŒจํ‚ค์ง€์— ๋Œ€ํ•ด ๋ณ„๋„์˜ ๋ชจ๋ธ ํŒŒ์ผ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ ์ž ์žฌ์ ์ธ ํ๋ฆ„์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ”์„œ๋“œ ๋ชจ๋ธ๋ง

์ผ๋ถ€ ๋ฉ”์„œ๋“œ๋Š” ๋‘˜ ์ด์ƒ์˜ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ๋ชจ๋ธ๋งํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋ฉฐ, ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋ฉ”์„œ๋“œ ์‚ฌ์šฉ๊ณผ ๊ด€๋ จ๋œ ๋ชจ๋“  ์ž ์žฌ์ ์ธ ๋ฌธ์ œ๋ฅผ ๊ฐ์ง€ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋จผ์ € ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•ด ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ๋ชจ๋ธ๋งํ•œ ๋‹ค์Œ ๋ฉ”์„œ๋“œ ํ–‰์˜ + ๋ฒ„ํŠผ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‘ ๋ฒˆ์งธ ๋ฐ์ดํ„ฐ ํ๋ฆ„ ๋ชจ๋ธ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

"com.alipay.soft.jraft.option"์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ณต์šฉ ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ๋Š” "์ข…์†์„ฑ ๋ชจ๋“œ" ๋ณด๊ธฐ์˜ ์Šคํฌ๋ฆฐ์ƒท "View" ์˜ต์…˜์€ ์ฃผํ™ฉ์ƒ‰ ์œค๊ณฝ์„ ์œผ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

VS Code์˜ CodeQL ๋ชจ๋ธ ํŒฉ ํ…Œ์ŠคํŠธ

"์‹คํ–‰ ์ค‘์ธ ์ฟผ๋ฆฌ: ์ต์Šคํ…์…˜ ํŒฉ ์‚ฌ์šฉ" ์„ค์ •์„ ์‚ฌ์šฉํ•˜์—ฌ VS Code์—์„œ ๋งŒ๋“  CodeQL ๋ชจ๋ธ ํŒฉ์„ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์„ค์ • ์‚ฌ์šฉ์ž ์ง€์ •์„(๋ฅผ) ์ฐธ์กฐํ•˜์„ธ์š”. ์ด ๋ฉ”์„œ๋“œ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ๋ณ€ํ˜• ๋ถ„์„ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๋ชจ๋‘์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

  • ์ž‘์—… ์˜์—ญ์˜ .github/codeql/extensions ๋””๋ ‰ํ„ฐ๋ฆฌ ๋‚ด์— ์ €์žฅ๋œ ๋ชจ๋ธ ํŒฉ์„ ์‚ฌ์šฉํ•˜์—ฌ CodeQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๋ ค๋ฉด "codeQL.runningQueries.useExtensionPacks": "all",๋กœ settings.json ํŒŒ์ผ์„ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

  • ๋ชจ๋ธ ํŒฉ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  CodeQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๋ ค๋ฉด "codeQL.runningQueries.useExtensionPacks": "none",์„ ์‚ฌ์šฉํ•˜์—ฌ settings.json ํŒŒ์ผ์„ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

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

์ถ”๊ฐ€ ์ฐธ๊ณ  ์ž๋ฃŒ