Rust에서 안전하게 C를 호출하는 extern "fil-c" 제안

1 day ago 6

Rust의 C FFI는 unsafe 경계 너머의 계약을 강제하지 못하므로, 기존 C/C++ 코드를 Fil-C의 런타임 메모리 안전성 아래에서 호출하는 새 FFI가 필요함 초기 버전은 스칼라 값, 복사된 문자열·슬라이스, 불투명 핸들만 지원하며, 전체 C 의존성 그래프를 Fil-C로 컴파일해 일반 C로 빠지는 경로를 차단함 Fil-C는 C 소스와 호환되지만 ABI는 호환되지 않아 단순한 bindgen 옵션으로 구현할 수 없으며, 보장을 유지한 채 값을 교환하는 새 Rust 브리지가 필요함 filnix는 100개가 넘는 nixpkgs 패키지를 Fil-C 플랫폼으로 이식했고, Zig도 전체 C/C++ 의존성 트리에 런타임 메모리 안전성을 적용하는 선택적 fil ABI를 제안함 기존 C는 포인터 검사와 가비지 컬렉션의 런타임 비용을 내는 안전한 호환 경로가 되며, 병목을 Rust로 재작성할수록 그 비용이 사라져 마이그레이션 유인이 커짐 Rust와 Fil-C를 잇는 안전한 FFI Rust의 C FFI는 수십 년간 축적된 소프트웨어를 활용하게 해주지만, unsafe 경계를 넘으면 어느 언어도 강제할 수 없는 계약을 C 라이브러리가 지킨다고 신뢰해야 함 Fil-C는 C와 C++를 Capability, 런타임 검사, 동시성 가비지 컬렉터와 함께 다시 컴파일함 메모리 안전성 위반은 익스플로잇으로 이어지는 대신 패닉을 발생시킴 기존 소프트웨어는 소스 변경이 거의 또는 전혀 필요하지 않을 수 있지만, 런타임 안전성 비용을 부담함 제안된 extern "fil-c"의 초기 범위는 의도적으로 제한됨 스칼라 값, 복사된 문자열과 슬라이스, 불투명 핸들을 지원함 안전한 Rust 래퍼를 생성하고 전체 C 의존성 그래프를 Fil-C로 컴파일함 일반적인 unsafe C로 돌아가는 탈출구는 제공하지 않음 공유 메모리는 Fil-C에 부여한 Capability를 Rust가 확실히 회수할 수 있을 때 이후 단계에서 추가할 수 있음 Fil-C는 C와 소스 호환되지만 의도적으로 ABI와 호환되지 않으며, 일반 Rust의 extern "C"는 Fil-C가 Yolo-C라고 부르는 ABI를 사용함 따라서 새 FFI는 bindgen 옵션 하나만으로 추가할 수 없음 Rust나 Fil-C 또는 양쪽에서 생성한 스텁이 Fil-C의 보장을 잃지 않고 값을 교환해야 함 생태계 기반과 마이그레이션 유인 filnix는 Fil-C를 Nix 교차 컴파일 플랫폼으로 패키징하며, ...

Read Entire Article