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