“안전한 소프트웨어를 만들고 싶다면 C를 버리고 Rust로 가라.” 최근 몇 년 사이 미국 NSA, 백악관 사이버 보안 전략 보고서까지 이런 방향을 공식 권고하고 있다. Microsoft 역시 내부 신규 프로젝트에서 Rust 채택을 적극 장려해온 곳이다. 그런데 이번에 내놓은 패는 예상과 달랐다.
이미지 출처: Unsplash
Microsoft는 이번 주 lib0xc를 GitHub에 오픈소스로 공개했다. “C 표준 라이브러리 인접 API들을 통해 더 안전한 시스템 프로그래밍”을 목표로 한다는 설명인데, 쉽게 말하면 C를 쓰면서도 흔한 메모리 버그 패턴을 구조적으로 막아주는 보조 라이브러리다. C를 갈아치우는 게 아니라, C를 쓸 수밖에 없는 현실 코드베이스를 위한 안전망을 만들겠다는 접근이다.
C 코드베이스는 쉽게 버릴 수 없다
수십 년 된 운영체제 커널, 임베디드 펌웨어, 게임 엔진 코어처럼 성능과 하드웨어 근접성이 생명인 코드는 아직도 C로 유지되는 경우가 많다. Rust로의 전환은 이상적이지만 수백만 줄 코드를 한 번에 바꿀 수는 없고, 팀 역량과 생태계 도구도 갖춰야 한다. lib0xc는 그 사이 어딘가에 있는 현실적 선택지를 제안한다.
기술 구조는 크게 두 축으로 나뉜다. 표준 라이브러리 확장 쪽(0xc/std/)에는 타입 안전 할당을 위한 alloc.h, FILE 스트림을 대체하는 cursor.h, 오버플로우 발생 시 즉시 트랩하는 정수 변환 int.h, 정적 문자열 함수들이 들어있다. 시스템 프로그래밍 유틸리티 쪽(0xc/sys/)에는 경계 안전 해시 테이블(hash.h), 범위 제한 버퍼(buff.h), 자동 탐색 테스트 프레임워크(unit.h) 등이 포함된다.
이미지 출처: Unsplash
설계 원칙도 눈에 띈다. 동적 할당을 전제하지 않고 고정 크기 데이터 구조를 권장하며, 매크로로 컴파일 타임에 크기 정보를 확보한다. clang의 -fbounds-safety 확장과 완전히 호환되어 포인터 범위를 정적으로 표현할 수 있고, -Wall -Wextra -Werror 같은 엄격한 컴파일러 경고 옵션 아래서도 경고 없이 빌드된다. 기존 표준 라이브러리가 이 조건을 충족하지 못해 진지한 C 프로젝트들이 오랫동안 겪어온 지점을 정확히 파고든 셈이다.
지원 환경은 C11(GNU 확장 포함), clang/gcc, macOS와 Linux의 arm64·x86_64다. Rust로 가기 어려운 레거시 시스템 프로그래밍 팀들에게는 꽤 실용적인 선택지가 될 수 있다. Microsoft가 이 라이브러리를 자사 내부 프로젝트에도 실제로 사용하고 있는지, 그리고 리눅스 커널 기여자 커뮤니티가 어떻게 반응할지가 이 프로젝트의 다음 관전 포인트다.
출처