Fil-C, 메모리 안전 컨텍스트 전환 구현
원제: Memory Safe Context Switching
왜 중요한가
메모리 안전성 강화는 C/C++ 생태계의 보안 취약점 감소에 핵심적이며, 코루틴 등 동시성 프로그래밍 패러다임의 안정성 기반을 마련한다.
오픈소스 프로젝트 Fil-C가 0.680 버전부터 setjmp, longjmp, ucontext API를 메모리 안전 방식으로 지원한다고 발표했다. 기존 C/C++ 구현에서 발생하던 스택 손상이나 댕글링 포인터 문제를 완전히 차단한다.
Fil-C는 메모리 안전성을 보장하는 C/C++ 호환 프로그래밍 환경으로, 최신 버전에서 컨텍스트 전환 API에 대한 메모리 안전 구현을 완료했다.
setjmp/longjmp와 ucontext API(getcontext, setcontext, makecontext, swapcontext)는 C 프로그램에서 예외 처리와 코루틴/파이버 구현에 광범위하게 사용된다. 예를 들어 Boost 라이브러리는 파이버 구현에 ucontext를 활용한다.
기존 구현에서는 이들 API의 오용으로 인한 심각한 문제가 발생할 수 있었다. 함수 내에서 setjmp나 getcontext로 저장한 컨텍스트를 함수 반환 후 longjmp하면 존재하지 않는 스택 프레임을 복원하게 된다. 또는 스레드 종료 후 컨텍스트를 복원하면 해제된 스택에서 실행되는 댕글링 스택 문제가 발생한다. makecontext로 생성한 컨텍스트의 스택을 해제 후 swapcontext를 호출하거나, swapcontext 인자를 잘못 지정하는 경우도 마찬가지다.
Fil-C는 이러한 모든 경우를 안전하게 처리한다. 댕글링 스택 실행을 원천적으로 불가능하게 만들어 API 오용 시점에서 panic을 발생시키거나, Fil-C의 스택 관리 방식으로 인해 안전한 실행을 보장한다. 이는 기존 구현에서 발생하던 불명확한 크래시나 디버거 스택 트레이스 불가 상황을 완전히 제거한다.