한국정보기술진흥원
한국정보기술신문
thumbnail

정보기술 ·

AI 코딩 어시스턴트로 C++ 메모리 안전성 도구 개발...15년 숙원 해결

발행일
읽는 시간3분 14초

시스템 연구자, 클로드 코드 활용해 Rust 스타일 C++ 정적 분석기 제작

[한국정보기술신문] 15년간 C++로 시스템 연구를 수행해온 한 개발자가 AI 코딩 어시스턴트를 활용하여 메모리 안전성 문제를 해결하는 정적 분석기를 개발했다. 이 프로젝트는 AI 기술이 복잡한 소프트웨어 개발 영역에서 어떻게 활용될 수 있는지를 보여주는 사례로 주목받고 있다.

해당 개발자는 자신의 블로그를 통해 Rust 스타일의 C++ 정적 분석기인 rusty-cpp를 공개했다. 이 도구는 C++ 코드에서 발생할 수 있는 메모리 누수, 댕글링 포인터, use-after-free 등의 문제를 사전에 검출한다.

개발자는 C++로 작업하면서 세그멘테이션 폴트와 메모리 손상으로 인한 수많은 실패를 경험했다고 밝혔다. 최근에도 홀수로 끝나는 포인터 문제로 며칠간 잠을 설쳤으며, 한 달간 추적했지만 찾지 못한 메모리 버그도 있었다고 전했다.

Rust의 메모리 안전성을 C++에

Rust는 메모리 안전성을 언어 차원에서 보장하는 프로그래밍 언어다. 하지만 기존 C++ 코드베이스를 Rust로 전환하는 것은 현실적으로 어렵다. 개발자는 C++와 Rust 간의 상호운용성 개선을 기대했지만, Rust 위원회의 논의를 지켜본 결과 가까운 시일 내에 실현되기 어렵다고 판단했다.

Circle C++와 같은 기존 시도들도 있었다. Circle C++는 Rust의 borrow check 규칙을 C++에 구현하여 개발자의 요구사항을 거의 충족했다. 그러나 폐쇄 소스 컴파일러에 의존하고, C++ 문법 변경을 요구하며, C++ 위원회에서 거부된 후 개발이 중단된 것으로 보인다는 한계가 있었다.

개발자는 언어 자체를 수정하는 대신 정적 분석기를 작성하기로 결정했다. 개념적으로는 어렵지 않지만, Rust의 프론트엔드를 복제하는 것과 같은 방대한 엔지니어링 작업이 필요했다. 교수직을 수행하며 이를 직접 구현할 시간이 없었고, 박사과정 학생을 고용하려 했으나 자금도 부족했고 학생들의 관심도 끌지 못했다.

AI 코딩 어시스턴트의 등장

전환점은 올해 AI 코딩 어시스턴트의 발전과 함께 찾아왔다. 개발자는 클로드 코드를 시험 삼아 사용해보다가 Rust 스타일 C++ 정적 분석기 아이디어를 제시했다. 클로드는 실행 가능하다고 답변하며 합리적인 계획을 제시했다.

프로토타입 작성과 테스트를 반복하는 과정에서 일부 테스트는 성공했고 일부는 실패했다. 클로드는 계속해서 프로토타입을 수정했고, 개발자는 더 많은 테스트를 요청했다. 이러한 반복 과정은 더 이상 버그를 검출하는 테스트를 작성할 수 없을 때까지 계속됐다.

개발자는 Mako 프로젝트의 RPC 컴포넌트에서 이 도구를 테스트했다. 리팩토링 과정에서 더 많은 버그를 발견하고 수정하는 반복 작업이 이어졌으며, 현재는 안정적이고 사용 가능한 상태에 도달했다고 밝혔다.

AI의 급속한 발전

개발자는 AI 코딩 기술의 빠른 발전을 직접 목격했다고 전했다. 초기에는 Sonnet 3.7을 사용했는데 1학년 학생처럼 많은 오류를 발생시켰다. Sonnet 4.5로 업그레이드하면서 허위 답변이 줄어들었지만 복잡한 문제는 여전히 어려워했다. Opus 4.5에서는 이러한 문제가 크게 감소했으며, 완전 자율 코딩도 시도할 수 있게 됐다.

개발자는 AI가 자신의 대부분 박사과정 학생들보다, 아마도 자신보다도 더 강력한 엔지니어링 능력을 보여준다고 평가했다. 컴파일러 전문가가 아닌 자신이 직접 구현했다면 낙관적으로 봐도 몇 년이 걸렸을 것이라고 밝혔다.

다만 이러한 발전에 대한 우려도 표명했다. AI가 이런 속도로 계속 성장한다면 시스템 엔지니어링 시장의 미래 모습이 걱정된다고 했다. 언젠가는 고도로 훈련된 시스템 해커가 필요 없어지고, 개념적으로 이해하고 코드를 읽을 수 있는 사람만 있으면 될 수도 있다는 것이다.

기술적 설계 특징

rusty-cpp는 모든 C++ 컴파일러와 호환되도록 주석 기반 문법을 사용한다. 새로운 문법을 도입하지 않고 @safe와 @unsafe 주석으로 함수를 표시한다. 주석이 없는 모든 코드는 기본적으로 @unsafe로 처리된다.

규칙은 간단하다. @safe 코드는 다른 @safe 코드만 직접 호출할 수 있다. STL, 외부 라이브러리, 주석 없는 레거시 코드를 호출하려면 @unsafe 블록으로 감싸야 한다. 이는 명확한 감사 경계를 만든다.

C++의 const와 non-const는 Rust의 가변성과 완벽하게 일치한다. const 변수와 const 멤버 함수는 불변이며, non-const는 가변이다. 차이점은 기본값이 반대라는 것뿐이다.

핵심 기능은 Rust 스타일 borrow checking이다. 여러 개의 불변 참조는 가능하지만, 여러 개의 가변 참조나 가변과 불변 참조를 혼합할 수 없다. libclang을 파싱에 사용하며, Rust의 Box, Arc, Option 등에 해당하는 C++ 타입도 구현했다.

기본 사용법은 간단하다. rusty-cpp-checker 명령으로 파일을 분석하면 위반 사항을 찾아낸다. 대규모 프로젝트의 경우 CMake가 생성하는 compile_commands.json을 사용할 수 있으며, CMake 통합도 지원한다.

개인적 의미와 전망

개발자는 이 프로젝트가 자신에게 15년간의 숙원을 해결한 것이라고 밝혔다. 컴파일러 엔지니어 팀을 고용하지도, C++ 위원회의 메모리 안전성 채택을 기다리지도 않고, 단지 AI와의 대화를 통해 반쯤 구운 아이디어를 실제 작동하는 코드로 만들었다.

6개월 전만 해도 상상할 수 없었던 일이라고 전했다. 앞으로 몇 번의 아이폰 같은 순간을 경험할 것으로 예상했지만, 이런 방식일 줄은 몰랐다며, 자신의 모든 프로그래밍 기술이 더 이상 필요하지 않을 수도 있는 미래를 보여준다고 덧붙였다.

프로젝트는 깃허브에서 오픈소스로 공개됐으며, 개발자는 더 많은 사용자가 자신의 코드베이스에서 시도해보기를 권장했다. 신비로운 세그폴트에 대한 마음의 평화를 얻을 수 있을 것이라고 전했다.

한국정보기술신문 정보기술분과 전호재 기자 news@kitpa.org

한국정보기술신문