Bun의 Rust 재작성: "safe Rust에서 UB(Undefined Behavior)를 허용하는 코드베이스"
Bun Rust rewrite: "codebase fails basic miri checks, allows for UB in safe rust"
TL;DR Highlight
Anthropic이 인수한 Bun 런타임이 Zig 코드베이스를 AI로 Rust에 재작성했는데, 가장 기본적인 메모리 안전성 검사(miri)조차 통과하지 못하는 UB(Undefined Behavior)가 발견됐다는 이슈가 제기됐다.
Who Should Read
Bun이나 Deno 같은 JavaScript 런타임을 프로덕션에서 사용 중이거나, AI를 활용한 대규모 코드 마이그레이션을 고려하는 시스템 개발자 및 테크 리드.
Core Mechanics
- Bun은 원래 Zig로 작성된 JavaScript 런타임인데, Anthropic에 인수된 이후 코드베이스 전체를 Rust로 재작성하는 작업을 AI 에이전트를 활용해 단 몇 주 만에 진행했다.
- 제보된 문제는 safe Rust(unsafe 블록 없이도 안전해야 하는 코드)에서 UB(Undefined Behavior, 정의되지 않은 동작)가 발생하는 것이다. 구체적으로 PathString::slice()가 이미 drop(해제)된 메모리를 가리키는 댕글링 레퍼런스(dangling reference)를 반환해서 miri(Rust 코드의 메모리 안전성을 실행 중에 검사하는 인터프리터)가 오류를 잡아낸다.
- 실제 오류 메시지는 'constructing invalid value of type &[u8]: encountered a dangling reference (0x20933[noalloc] has no provenance)'로, 이미 해제된 Box를 가리키는 포인터를 slice로 재구성하는 코드가 문제다.
- 이슈 제보자는 AI가 Rust를 잘 못 쓰는 만큼 '바이브 코딩(vibe coding, 직관과 AI에만 의존해 검증 없이 코드를 생성하는 방식)'을 하지 말고 실제 Rust 전문가를 채용하라고 촉구했다.
- 기존 Zig 코드는 그대로 안정 버전으로 유지 중이고, Rust 재작성 버전은 아직 릴리즈되지 않은 상태라, 실제 프로덕션 사용자에게 직접적인 위험이 당장 생긴 건 아니다.
- miri 같은 검사 도구를 CI/테스트에 처음부터 붙이지 않은 것도 문제로 지적됐다. LLM이 코드를 생성할 때 좋은 테스트와 검증 도구가 있으면 더 나은 결과를 낼 수 있는데, 그 기반이 없었다는 것이다.
- 이슈 자체가 GitHub에 대량으로 올라오면서 소란이 커졌고, 일부 댓글은 아직 개발 중간 단계에 있는 코드를 공개적으로 비판하는 것이 적절한지에 대한 논쟁으로 번졌다.
Evidence
- Zig에서 Rust로 변환하려면 `zig translate-c`와 `c2rust`를 파이프라인으로 연결해 결정론적(deterministic) 변환을 하는 방법도 있었을 텐데, AI 에이전트를 굳이 쓴 이유를 이해하기 어렵다는 의견이 있었다. AI로 변환한 결과는 입력(Zig)보다 신뢰도가 낮은데, 아무도 실제로 코드를 검토하지 않은 상태라는 점에서 더 위험하다는 주장이다.
- 이슈 자체가 오해를 일으킨다는 반론도 있었다. 진짜 문제는 'miri가 잡는 UB가 존재한다'는 것 자체가 아니라, unsafe 코드를 safe API로 잘못 노출해서 외부에서 UB를 유발할 수 있다는 점이고, 이는 초기 포팅 단계에서 충분히 발생할 수 있는 일이라는 것이다. 다만 실제 릴리즈 전에 고쳐야 한다는 것에는 동의하는 분위기였다.
- Anthropic이 Bun을 인수한 이후의 방향성에 대한 신뢰 문제도 제기됐다. 원래 Zig와 Bun을 선택했던 이유가 개발자의 기술적 판단력과 취향을 믿었기 때문인데, 이런 식의 AI 에이전트 전환 결정은 그 신뢰를 깬다는 의견이 나왔다.
- TypeScript 컴파일러와 비슷한 야심의 사이드 프로젝트(tsz.dev)를 만들고 있다는 개발자는, 몇 주 만에 완전히 동작한다는 주장 자체가 놀라웠다고 했다. TypeScript 자체 테스트를 통과한 후에도 버그가 계속 나오는 경험을 하고 있기 때문에, 이 속도로 코드를 생성할 수 있는 지금이야말로 검증(verification)이 100배 더 중요해졌다고 강조했다.
- 동일한 문제가 원래 Zig 코드에도 존재했는지 궁금하다는 의견도 있었다. 만약 Zig에도 같은 버그가 있었다면, Rust 생태계의 miri 같은 도구로 문제를 더 쉽게 발견할 수 있다는 점에서 오히려 Rust 전환의 장점 중 하나로 볼 수도 있다는 시각이다.
How to Apply
- AI 에이전트로 unsafe 언어(C/Zig/C++)를 Rust로 대규모 포팅하는 프로젝트를 진행 중이라면, 포팅 시작 시점부터 `cargo miri test`를 CI에 의무적으로 추가하라. LLM이 생성한 unsafe 블록이나 raw pointer 조작 코드는 사람이 직접 miri 없이 검토하기 매우 어렵기 때문에, 도구를 먼저 붙이면 오류를 자동으로 조기에 잡을 수 있다.
- AI로 생성한 Rust 코드에서 unsafe 코드를 safe API로 감싸는 패턴을 쓴다면, 반드시 해당 API에 대한 소유권(ownership) 경계 테스트를 작성하라. 위 사례처럼 Box가 drop된 이후에도 참조를 유지하는 시나리오를 테스트에 명시적으로 포함시켜야 miri가 댕글링 레퍼런스를 잡아낸다.
- 레거시 코드를 AI로 다른 언어로 마이그레이션할 때, 결정론적 변환 도구(예: `zig translate-c` → `c2rust` 파이프라인)를 먼저 검토하라. AI 에이전트 번역은 유연하지만 검증이 어렵고, 기계적 변환은 입력 코드와 동일한 수준의 보장을 가지면서 재현 가능하다는 장점이 있다.
Code Example
// 문제가 된 코드 패턴 (miri가 UB로 잡아내는 사례)
fn main() {
let test = Box::new(*b"Hello World");
let init = PathString::init(&*test);
drop(test); // test가 해제됨
println!("{:?}", init.slice()); // ← 이미 해제된 메모리를 참조: UB!
}
// miri 실행 방법
// cargo +nightly miri test
// miri 오류 메시지 예시:
// error: Undefined Behavior: constructing invalid value of type &[u8]:
// encountered a dangling reference (0x20933[noalloc] has no provenance)
// --> src/main.rs:97:18Terminology
관련 논문
Claude Design 구독 해지 후 프로젝트 접근 불가 경험담 및 주의사항
Claude Design 구독을 해지했더니 기존 프로젝트에 접근이 완전히 차단됐다는 사용자 경고로, AI 도구에 중요한 작업물을 의존할 때의 리스크를 잘 보여주는 사례다.
TanStack NPM 공급망 공격 사후 분석 (Postmortem)
2026년 5월 11일 TanStack의 42개 npm 패키지가 GitHub Actions cache poisoning과 OIDC 토큰 탈취를 조합한 공격으로 악성 버전이 배포됐으며, 공격 벡터와 대응 과정을 상세히 분석한 글이다.
LLM이 TLA+로 실제 시스템을 제대로 모델링할 수 있을까? — SysMoBench 벤치마크
LLM이 TLA+ 명세를 작성할 때 문법은 잘 통과하지만 실제 시스템과의 동작 일치도(conformance)는 46% 수준에 그친다는 걸 체계적으로 검증한 벤치마크 연구로, AI 기반 형식 검증의 현실적 한계를 보여준다.
Natural Language Autoencoders: Claude의 내부 활성화를 자연어 텍스트로 변환하는 기법
Anthropic이 LLM 내부의 숫자 벡터(활성화값)를 직접 읽을 수 있는 자연어로 변환하는 NLA 기법을 공개했다. AI가 실제로 무슨 생각을 하는지 해석하는 interpretability 연구의 새로운 진전이다.
ProgramBench: LLM이 프로그램을 처음부터 다시 만들 수 있을까?
LLM이 FFmpeg, SQLite, PHP 인터프리터 같은 실제 소프트웨어를 문서만 보고 처음부터 재구현할 수 있는지 측정하는 새 벤치마크로, 최고 모델도 전체 태스크의 3%만 95% 이상 통과하는 수준에 그쳤다.
첫 번째 토큰이 이미 알고 있다: Single-Decode Confidence로 Hallucination 탐지하기
LLM이 답변의 첫 토큰을 생성할 때의 확률 분포만 봐도, 10번 샘플링하는 semantic self-consistency와 맞먹는 hallucination 탐지 성능이 나온다.