A Tale of 1001 LoC: Potential Runtime Error-Guided Specification Synthesis for Verifying Large-Scale Programs

본 논문은 정적 분석과 LLM 기반 추론을 결합한 모듈형 프레임워크인 Preguss 를 통해 대규모 프로그램의 잠재적 런타임 오류를 기반으로 인터프로시저 명세를 자동 생성 및 정제함으로써, 기존 LLM 기반 접근법보다 우수한 확장성을 보이며 수천 줄 규모의 프로그램에 대한 검증 노력을 80.6%~88.9% 감소시킨다고 제안합니다.

Zhongyi Wang, Tengjie Lin, Mingshuai Chen, Haokun Li, Mingqi Yang, Xiao Yi, Shengchao Qin, Yixing Luo, Xiaofeng Li, Bin Gu, Liqiang Lu, Jianwei Yin

게시일 Wed, 11 Ma
📖 3 분 읽기☕ 가벼운 읽기

Each language version is independently generated for its own context, not a direct translation.

🏗️ 비유: 거대한 성을 지어보는 건축가

상상해 보세요. 여러분이 **1,000 개가 넘는 벽돌 (코드 라인)**로 이루어진 거대한 성을 짓고 있습니다. 이 성이 무너지지 않고 안전하게 작동하려면, 모든 벽돌이 제자리에 있고, 문이 제대로 닫히며, 다리가 무너지지 않는지 확인해야 합니다. 이를 **'프로그램 검증'**이라고 합니다.

하지만 문제는 이 성이 너무 크다는 것입니다. 한 번에 전체를 다 살펴보는 것은 인간에게도, 최신 인공지능 (LLM) 에게도 불가능합니다.

1. 기존 방법의 문제점: "눈이 멀고, 기억력이 짧은 거인"

기존의 인공지능 (LLM) 은 이 거대한 성을 한 번에 보려고 하면 두 가지 치명적인 약점이 있습니다.

  • 기억력 부족 (Context Limit): 성 전체를 한 번에 보려고 하면 인공지능의 '기억 창 (Context Window)'이 꽉 차서 중요한 부분을 놓칩니다.
  • 혼란: 성의 각 부분 (함수) 이 서로 복잡하게 연결되어 있는데, 인공지능은 "어디서부터 시작해야 하지?"라고 헤매며 엉뚱한 부분만 지적하거나, 너무 많은 가정을 만들어냅니다.

2. 프레구스 (Preguss) 의 혁신: "위험 신호를 쫓는 탐정"

프레구스는 이 문제를 해결하기 위해 두 가지 전략을 사용합니다.

① 분할 정복 (Divide and Conquer): "작은 조각으로 나누기"
프레구스는 성 전체를 한 번에 보지 않습니다. 대신, **자동화된 검사기 (정적 분석기)**를 먼저 돌려서 "여기서 다리가 무너질 수 있어!"라고 경고하는 **위험 신호 (Runtime Error Assertions)**를 찾아냅니다.

  • 비유: 성 전체를 다 보지 않고, "이 벽돌이 흔들리는구나!"라고 경고하는 특정 지점만 집중적으로 봅니다.
  • 이 위험 신호들을 바탕으로 검증해야 할 **작은 단위 (V-Unit)**들을 만들어냅니다. 마치 거대한 성을 작은 방 (Verification Unit) 들로 쪼개는 것과 같습니다.

② 협력 (Synergy): "인공지능과 수사의 팀워크"
이제 인공지능 (LLM) 이 등장합니다. 하지만 그냥 "이 성을 검증해 줘"라고 하는 게 아닙니다.

  • 위험 신호를 가이드로: "여기서 다리가 무너질 수 있다는 신호가 왔어. 이 다리가 무너지지 않게 하려면 어떤 조건이 필요할까?"라고 인공지능에게 물어봅니다.
  • 상호작용: 인공지능이 "아, 이 다리가 무너지지 않으려면 저 벽돌이 튼튼해야 해 (전제조건)"라고 답하면, 검증 도구가 이를 확인합니다. 만약 틀리면 인공지능에게 "틀렸어, 다시 생각해 봐"라고 피드백을 주고, 인공지능이 다시 수정합니다.
  • 연쇄 반응: 한 방의 다리가 튼튼해지면, 그 방을 연결하는 복도도 튼튼해집니다. 이렇게 작은 단위 하나하나를 검증하며 성 전체의 안전을 증명해 나갑니다.

🚀 프레구스가 이룬 성과

이 논문은 프레구스가 실제로 얼마나 강력한지 증명했습니다.

  1. 거대한 프로젝트도 가능: 1,000 줄이 넘는 실제 소프트웨어 (우주선 제어 시스템, 암호화 모듈 등) 를 검증했습니다. 기존 방법들은 이 정도 규모에서는 아예 작동조차 안 했지만, 프레구스는 성공했습니다.
  2. 인간의 노동을 90% 줄임: 예전에는 전문가들이 수개월 동안 수동으로 코드를 확인해야 했지만, 프레구스는 인간의 개입을 80~90% 이상 줄여주었습니다.
  3. 실제 버그를 찾아냄: 단순히 "안전하다"고 말하는 것을 넘어, 실제 우주선 제어 시스템에서 **6 가지의 치명적인 버그 (초기화되지 않은 변수 접근 등)**를 찾아내어 개발자들이 수정할 수 있게 했습니다.

💡 핵심 요약

  • 문제: 너무 큰 프로그램을 검증할 때, 인공지능은 기억력이 부족하고 복잡한 연결고리를 이해하지 못합니다.
  • 해결책 (프레구스):
    1. **위험 신호 (Runtime Error)**를 찾아내어 검증할 대상을 작은 조각으로 나눕니다.
    2. 인공지능에게 **"이 특정 위험을 막으려면 어떤 조건이 필요한가?"**라고 구체적으로 물어봅니다.
    3. 검증 도구의 피드백을 받아 인공지능이 **조건 (명세)**을 수정하고, 이를 반복하며 성 전체를 안전하게 만듭니다.

한 줄 요약:

"거대한 성을 한 번에 다 보려 하지 말고, 위험한 곳을 찾아내어 조각조각 나누어 인공지능과 함께 하나하나 안전하게 다지는 새로운 검증 방법입니다."

이 기술은 앞으로 우리가 사용하는 스마트폰 앱, 자율주행차, 우주선 등 매우 안전이 중요한 소프트웨어를 자동으로 검증하는 데 큰 역할을 할 것으로 기대됩니다.