LLVM ํ”„๋กœ์ ํŠธ๋Š” C++์—์„œ ๋ฒ„ํผ ์•ˆ์ „ ์ฒ˜๋ฆฌ๋ฅผ ๊ฐœ๋ฐœํ•ฉ๋‹ˆ๋‹ค.

LLVM ํ”„๋กœ์ ํŠธ ๊ฐœ๋ฐœ์ž๋Š” ์—…๋ฌด์ƒ ์ค‘์š”ํ•œ C++ ํ”„๋กœ์ ํŠธ์˜ ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ•˜๊ณ  ๋ฒ„ํผ ์˜ค๋ฒ„๋Ÿฐ์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ์˜ค๋ฅ˜๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ์ˆ˜๋‹จ์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•œ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ œ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ์ž‘์—…์€ ๋‘ ๊ฐ€์ง€ ์˜์—ญ์— ์ค‘์ ์„ ๋‘๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๋ฒ„ํผ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์•ˆ์ „ํ•œ ์ž‘์—…์„ ํ—ˆ์šฉํ•˜๋Š” ๊ฐœ๋ฐœ ๋ชจ๋ธ์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ๊ณผ libc++ ํ‘œ์ค€ ํ•จ์ˆ˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ•˜๋Š” ์ž‘์—…์ž…๋‹ˆ๋‹ค.

์ œ์•ˆ๋œ C++์šฉ ์•ˆ์ „ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ชจ๋ธ์—๋Š” ๋ฒ ์–ด ํฌ์ธํ„ฐ๋ฅผ ์กฐ์ž‘ํ•˜๋Š” ๋Œ€์‹  ๋ฒ„ํผ๋กœ ์ž‘์—…ํ•  ๋•Œ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ œ๊ณตํ•˜๋Š” ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๊ณผ๋‹ค ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ์— ๋Œ€ํ•œ ๋Ÿฐํƒ€์ž„ ๊ฒ€์‚ฌ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” std::array, std::Vector ๋ฐ std::span ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ œ์•ˆ๋ฉ๋‹ˆ๋‹ค.

clang์˜ ์œ„ํ—˜ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ด€ํ–‰์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด "cppcoreguidelines-pro-bounds-pointer-arithmetic" ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ clang-tidy linter ๊ฒฝ๊ณ  ์ถœ๋ ฅ๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ๋ชจ๋“  ํฌ์ธํ„ฐ ์—ฐ์‚ฐ ์ž‘์—…์— ๋Œ€ํ•œ ์ปดํŒŒ์ผ๋Ÿฌ ๊ฒฝ๊ณ ๋ฅผ ํ‘œ์‹œํ•˜๋Š” ๊ฒƒ์ด ์ œ์•ˆ๋ฉ๋‹ˆ๋‹ค. LLVM 16 ๋ฆด๋ฆฌ์Šค์— ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฒฝ๊ณ ๋ฅผ ํ™œ์„ฑํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๊ธฐ๋ณธ์ ์œผ๋กœ ํ™œ์„ฑํ™”๋˜์ง€ ์•Š์€ ๋ณ„๋„์˜ ํ”Œ๋ž˜๊ทธ๊ฐ€ clang์— ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.

libc++์—์„œ๋Š” ์„ ํƒ์  ๊ฐ•ํ™” ๋ณดํ˜ธ ๋ชจ๋“œ๋ฅผ ๊ตฌํ˜„ํ•  ๊ณ„ํš์ž…๋‹ˆ๋‹ค. ์ด ๋ชจ๋“œ๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋ฉด ์ •์˜๋˜์ง€ ์•Š์€ ๋™์ž‘์œผ๋กœ ์ด์–ด์ง€๋Š” ์ผ๋ถ€ ์ƒํ™ฉ์„ ๋Ÿฐํƒ€์ž„์— ํฌ์ฐฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, std::span ๋ฐ std::Vector ํด๋ž˜์Šค์—์„œ๋Š” ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚œ ๋ฉ”๋ชจ๋ฆฌ ์•ก์„ธ์Šค๊ฐ€ ๋ชจ๋‹ˆํ„ฐ๋ง๋˜๋ฉฐ, ๊ฐ์ง€๋˜๋ฉด ํ”„๋กœ๊ทธ๋žจ์ด ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๋“ค์€ ์ด๋Ÿฌํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ถ”๊ฐ€ํ•˜๋ฉด libc++๊ฐ€ C++ ํ‘œ์ค€์„ ์ค€์ˆ˜ํ•  ๊ฒƒ์ด๋ผ๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค. ์ •์˜๋˜์ง€ ์•Š์€ ๋™์ž‘์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์„ ํƒ์€ ๋ฌด์—‡๋ณด๋‹ค๋„ ์ •์˜๋˜์ง€ ์•Š์€ ๋™์ž‘์„ ์‹คํŒจ๋กœ ์ฒ˜๋ฆฌํ•˜์—ฌ ๋‹ค์Œ ์ž‘์—…์„ ์š”๊ตฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋žจ์„ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.

libc++์˜ ๋Ÿฐํƒ€์ž„ ๊ฒ€์‚ฌ๋Š” ๊ฐœ๋ณ„์ ์œผ๋กœ ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฒ”์ฃผ๋กœ ๋‚˜๋ˆ„์–ด์งˆ ๊ณ„ํš์ž…๋‹ˆ๋‹ค. ์ž‘์—…์ด ๋ณต์žกํ•ด์ง€๊ฑฐ๋‚˜ ABI๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ์ œ์•ˆ๋œ ๊ฒ€์‚ฌ ์ค‘ ์ผ๋ถ€๋Š” ์ด๋ฏธ libc++ ์•ˆ์ „ ๋ชจ๋“œ ๋‚ด์—์„œ ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ถ”๊ฐ€์ ์œผ๋กœ, ์ฝ”๋“œ ์—…๋ฐ์ดํŠธ๋ฅผ ์œ„ํ•œ ๋„๊ตฌ๋ฅผ ์ค€๋น„ํ•  ๊ณ„ํš์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋ณ€์ˆ˜๋ฅผ ๋ฒ ์–ด ํฌ์ธํ„ฐ๋กœ ๋Œ€์ฒดํ•˜๊ณ  ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ํฌ์ธํ„ฐ๋ฅผ ์ง์ ‘ ๋Œ€์ฒดํ•  ์ˆ˜ ์—†๋Š” ์ƒํ™ฉ์—์„œ ๋Œ€์ฒด ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: "if(array_pointer)" ๊ตฌ์„ฑ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค). if(span.data) ()")๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค. ์กฐ์ •์€ ๋กœ์ปฌ ๋ณ€์ˆ˜๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํฌ์ธํ„ฐ ์œ ํ˜•์˜ ๋งค๊ฐœ๋ณ€์ˆ˜์—๋„ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : opennet.ru

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