퍼징의 벽을 LLM 코드 직독으로 넘다
퍼저(fuzzer)는 초반에 빠르게 버그를 쏟아내지만, 탐색 공간이 넓어질수록 속도가 떨어지고 동일 버그를 반복 발굴하는 문제에 부딪힌다. Justin은 이 한계를 "LLM에게 컴파일러 소스코드를 직접 읽히는 것"으로 돌파했다. 코드 직독은 인간에게는 사실상 불가능한 작업이지만, LLM 에이전트는 수십만 줄을 훑으며 실질적인 버그를 짚어낸다.
두 가지 접근법: ① 퍼징(fuzzing) — LLM이 정형 무작위 프로그램을 생성하고, 컴파일 전후 동작이 같은지 비교. ② 코드 직독 — 에이전트가 컴파일러 소스(또는 어셈블리)를 직접 읽고 의심스러운 패턴을 찾는다. Anthropic이 보안 취약점 탐색에 쓴 방법과 같다.
퍼징의 세 가지 한계: (1) 탐색 공간이 커질수록 새 버그 발굴 속도 저하, (2) 이미 찾은 버그 패턴을 제외하기가 갈수록 복잡해짐, (3) 알 수 없는 루트콜즈로 인해 "이게 얼마나 큰 버그인가"를 평가하기 어렵다. 이 세 문제가 겹치면서 코드 직독 방식으로 전환하게 됐다.
하네스(harness)의 진화: 2024년 12월~2025년 1월 시도 때는 Codex에서 모델이 버그 한두 개 찾고 "다 했어요"라고 멈추는 일이 잦았다. 이제는 /goal 같은 기능이 에이전트 하네스에 기본 탑재돼 있어, 모델 지능 향상만큼이나 툴링 자체의 성숙이 체감 품질을 끌어올렸다는 게 Justin의 분석이다.
"저는 40건의 버그 목록을 그냥 쭉 가지게 됐고, 그 중 제가 살펴본 네다섯 개는 전부 명확한 버그였어요. max, subtract를 네 번 반복하면 틀린 답이 나오는 식으로요."
쉽게 풀어보기 — 퍼저와 미스컴파일이란?
- 퍼저(Fuzzer)
- 무작위 입력을 대량으로 만들어 프로그램에 던져보고 이상한 반응을 잡아내는 테스트 도구. 여기서는 "잘 구성된 랜덤 코드를 컴파일러에 넣어 결과가 올바른지 확인"하는 방식으로 사용.
- 미스컴파일(Miscompile)
- 컴파일러가 소스 코드를 잘못 번역해, 실행 결과가 원래 의도와 달라지는 현상. 실제 런타임 버그의 숨은 원인이 될 수 있다.
- PTX / PTXAS
- Nvidia GPU용 중간 어셈블리(PTX)를 실제 GPU 기계어로 변환하는 Nvidia 클로즈드소스 컴파일러. 소스가 공개되지 않아 버그를 찾아도 수정은 Nvidia 몫.