대규모 프로그램 검증을 위한 런타임 오류 유도 사양 합성 프레임워크 Preguss
초록
Preguss는 정적 분석이 제시한 잠재 런타임 오류(RTE) 경고를 기반으로 프로그램을 검증 단위로 분할하고, 각 단위에 대해 LLM을 활용해 전후조건·루프 불변식 등 인터프로시저 사양을 자동 생성한다. 이 방식은 1 000 줄 이상 규모의 C 프로그램에 대해 인간이 직접 작성해야 하는 사양을 80 % 이상 감소시키며, 실제 우주선 제어 시스템에 적용해 6개의 실제 RTE를 발견했다.
상세 분석
본 논문은 대규모 C 프로그램의 런타임 오류‑프리 검증을 목표로, 두 단계의 divide‑and‑conquer 전략을 제시한다. 첫 번째 단계에서는 Frama‑C/Eva와 같은 추상 해석 기반 정적 분석기가 보고하는 잠재 RTE 경고(예: 나눗셈 0, 정수 오버플로, 널 포인터)를 수집하고, 이 경고들을 그래프 형태의 의존 관계에 매핑한다. 경고가 발생한 위치를 기준으로 함수 호출 그래프를 역추적해 최소한의 검증 단위(verification unit)를 정의하고, 경고의 심각도와 호출 빈도 등을 고려해 우선순위를 매긴다. 이렇게 구성된 단위는 서로 독립적인 서브프로그램으로 간주될 수 있어, LLM에게 전달하기에 충분히 작은 컨텍스트를 제공한다.
두 번째 단계에서는 LLM(예: GPT‑4‑Turbo)을 프롬프트 엔지니어링하여 각 검증 단위에 필요한 인터프로시저 사양을 생성한다. 프롬프트는 (1) 해당 단위의 함수 시그니처와 변수 선언, (2) 정적 분석이 삽입한 RTE 가드 어설션, (3) 이전 단계에서 도출된 전제(precondition)와 목표(postcondition) 형태의 메타데이터를 포함한다. LLM은 전제‑후조건, 루프 불변식, 그리고 함수 호출에 대한 계약을 동시에 출력한다. 중요한 점은 LLM이 생성한 사양이 정형화된 ACSL 형식으로 바로 Frama‑C/Wp에 전달될 수 있다는 점이다.
생성된 사양은 Frama‑C/Wp에 의해 자동으로 검증된다. 검증이 성공하면 해당 단위는 RTE‑free로 판정되고, 실패하거나 “unknown” 상태가 나오면 피드백을 통해 LLM에게 재요청하거나 인간 전문가가 개입한다. 이 피드백 루프는 사양의 정밀도를 점진적으로 향상시키며, 전체 프로그램에 대한 증명 가능성을 높인다. 실험 결과, 기존 LLM‑기반 사양 합성 도구에 비해 성공적인 검증 비율이 30 % 이상 상승했으며, 1 000 줄 규모 프로그램에서 인간이 직접 작성해야 할 사양 수를 평균 86 % 감소시켰다. 또한, 우주선 제어 시스템(1 280 줄, 48 함수)에서 실제 RTE 6건을 정확히 찾아내어 실용적 가치를 입증했다.
이 접근법의 핵심 통찰은 “잠재 오류를 사양 합성의 가이드라인으로 활용한다”는 점이다. 정적 분석이 제공하는 구체적 오류 위치와 조건은 LLM이 무작위로 사양을 생성하는 대신, 필요한 전제와 후조건을 정확히 목표화하도록 만든다. 결과적으로 LLM의 장점인 자연어‑코드 이해와 추론 능력을, 정적 분석의 보증된 오류 탐지와 결합해 확장성을 확보한다. 또한, 검증 단위 기반 모듈화는 LLM의 컨텍스트 제한을 회피하고, 증명 담당 툴과의 인터페이스를 단순화한다는 부수 효과를 낳는다.
댓글 및 학술 토론
Loading comments...
의견 남기기