- Ripgrep 15.2.0의 x86_64-unknown-linux-musl 바이너리가 대규모 파일 트리를 높은 동시성으로 검색할 때 간헐적으로
SIGSEGV와 함께 종료됨 - 충돌은
opendir가 호출한calloc내부에서 발생하며, musl mallocng의 힙 메타데이터 무결성 검사 지점이 스택 추적의 최상단에 나타남 - 재현 환경은 약 20GiB·180만 개 파일로 구성된 트리이며, 존재하지 않는 문자열을
rg로 반복 검색함 - 24코어 시스템에서 검색 트리가 커널 블록 캐시에 들어갈 만큼 RAM을 확보하면 일반적으로 약 1분 안에 문제가 발생함
- OpenAI Codex에 포함된
rg뿐 아니라 공식 릴리스와 바이트 단위로 동일한 바이너리에서도 독립적으로 재현돼 Codex 의존성과 무관한 문제로 확인됨
발생 환경
- 사용 버전은 ripgrep 15.2.0 rev
e89fff8이며+pcre2기능을 포함함- 컴파일 시 SIMD:
+SSE2,-SSSE3,-AVX2 - 실행 시 SIMD:
+SSE2,+SSSE3,+AVX2 - PCRE2 10.45와 JIT를 사용할 수 있음
- 컴파일 시 SIMD:
- 운영체제는 OpenSUSE Tumbleweed Linux x86_64임
- 최초 발견된 OpenAI Codex 번들
rg는 공식 x86_64-unknown-linux-musl 릴리스와 바이트 단위로 동일함 - Codex와 별개로 공식 바이너리에서도 재현됐으며, 분석용 바이너리는 다음 명령으로 디버그 심볼을 포함해 빌드함
CROSS_CONTAINER_ENGINE=podman CARGO_PROFILE_RELEASE_DEBUG=true ~/.cargo/bin/cross build --release --target x86_64-unknown-linux-musl
재현 절차
- generate_repro_tree.py는 원래 문제가 발생한 저장소의 통계를 모방한 무작위 파일 트리를 생성함
- 이 프로그램은 LLM으로 작성됨
- 생성 결과는 약 20GiB, 180만 개 파일 규모임
- 생성된 트리의 루트에서 존재하지 않는 임의 문자열을 반복 검색함
while true; do rg tnoheueunotshisnthukoethnsueothnsiuothonesuioseuinth; done
- 충분히 큰 검색 트리가 재현에 필수적인 것으로 관찰됨
- 24코어 시스템에서 트리 전체가 커널 블록 캐시에 들어갈 만큼 여유 RAM이 있으면 일반적으로 약 1분 후 충돌함
충돌 지점
- 실제 결과는 코어 덤프를 남기는
SIGSEGV임 - 스택 추적 최상단은 musl mallocng의
get_meta이며, 힙 메타데이터 무결성 검사 지점에서 충돌함 - 호출 흐름은
opendir가calloc을 호출하고, Rust 표준 라이브러리의 디렉터리 순회와 ripgrepignore::walk작업자로 이어짐get_meta→__malloc_allzerop→calloc→opendirstd::fs::read_dir→ignore::walk::Work::read_dir→ignore::walk::Worker::run
- 분석 자료로 코어 덤프와 해당 rg 바이너리가 첨부됨
기대 동작과 현재 상태
- 기대 동작은 대규모·고동시성 검색에서도 세그멘테이션 오류 없이 실행되는 것임
- 제공된 내용에는 원인 확정, 수정안, 검토 결과 또는 최종 해결 여부가 포함돼 있지 않음