디시인사이드 갤러리

갤러리 이슈박스, 최근방문 갤러리

갤러리 본문 영역

Rust와 C FFI에서 패닉 전파에 대한 정리

나르시갤로그로 이동합니다. 2025.11.25 19:22:18
조회 68 추천 0 댓글 0

Rust와 C FFI에서 패닉 전파에 대한 정리

Rust와 C를 함께 쓰다 보면 패닉(panic)이 FFI 경계를 어떻게 넘나드는지 헷갈리기 쉽습니다. 최근에 저도 혼동이 있어서 정리해봤습니다.


1. C 함수를 Rust에서 래핑해서 호출할 때

extern "C" {
    fn c_func();
}

fn wrapper() {
    unsafe { c_func(); }
}
  • 여기서 c_func는 C에서 온 함수입니다.
  • 만약 Rust 코드(wrapper) 안에서 패닉이 발생하면, 그 패닉은 Rust 호출자에게만 전달됩니다.
  • C 함수 자체는 단순히 호출된 대상일 뿐이고, Rust 패닉이 C 함수로 거슬러 올라가는 일은 없습니다.
  • 따라서 패닉이 C 함수로 전달될 가능성은 0입니다.

2. Rust로 만든 함수를 C에서 호출할 때

#[no_mangle]
pub extern "C" fn rust_func() {
    panic!("oops");
}
  • 이 함수는 C에서 직접 호출할 수 있습니다.
  • Rust 내부에서 panic!이 발생하면, Rust 런타임은 스택 언와인딩을 시도합니다.
  • 그런데 호출자는 main() 같은 C 코드이므로, Rust 패닉이 C 경계(ABI)를 넘어가게 됩니다.
  • Rust 언와인딩이 C 코드까지 넘어가는 것은 정의되지 않은 동작(UB)입니다.
  • 대부분의 경우 Rust는 안전을 위해 프로세스를 abort합니다. 즉, 프로그램 전체가 종료됩니다.

3. 안전하게 처리하는 방법

Rust 함수를 C에 노출할 때는 반드시 catch_unwind로 패닉을 잡아야 합니다:

use std::panic::{catch_unwind, AssertUnwindSafe};

#[no_mangle]
pub extern "C" fn safe_rust_func() -> i32 {
    let result = catch_unwind(AssertUnwindSafe(|| {
        // 패닉할 수 있는 Rust 코드
        panic!("oops");
    }));

    match result {
        Ok(_) => 0,   // 성공
        Err(_) => -1, // 패닉 발생 → 에러 코드 반환
    }
}

이렇게 하면 Rust 패닉이 C 경계를 넘어가지 않고, C 쪽에서는 단순히 에러 코드로 처리할 수 있습니다.


📌 결론

  • C 함수를 Rust에서 호출할 때 → 패닉은 Rust 호출자에게만 전달, C 함수로는 전달되지 않음.
  • Rust 함수를 C에서 호출할 때 → 패닉이 C 경계를 넘어가면 UB, 보통 abort.
  • 따라서 Rust → C FFI 함수는 반드시 catch_unwind로 패닉을 잡아야 안전합니다.

추천 비추천

0

고정닉 0

0

댓글 영역

전체 댓글 0
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 뛰어난 운동 신경으로 남자와 싸워도 이길 것 같은 여자 스타는? 운영자 25/11/24 - -
AD 따뜻한 겨울나기! 방한용품 SALE 운영자 25/11/27 - -
2905214 ❤✨☀⭐⚡☘⛩☃나님 시작합니당☃⛩☘⚡⭐☀✨❤ ♥멘헤라냥덩♥갤로그로 이동합니다. 11.28 31 0
2905212 죽어가는 국민의힘 되살리는 기초의회 ‘2인 선거구’, 더 늘어나나 발명도둑잡기(39.7) 11.28 43 0
2905211 재명이 존나 찐따같네;; 카메라 보이니까 왕따 아닌척 발악;; [5] ♥멘헤라냥덩♥갤로그로 이동합니다. 11.28 69 0
2905210 진보당, 무주택자·세입자·청년의 ‘감당 가능한 주거’ 7대 정책 제안 [1] 발명도둑잡기(39.7) 11.28 45 0
2905208 경력기술서쓰는데 궁금한거 있음 [7] 프갤러(58.76) 11.28 84 0
2905207 미국 음반 시장 순위 조작을 위한 사재기 있나 발명도둑잡기(39.7) 11.28 105 0
2905203 <하우스 오브 다이너마이트> 인기래서 생각나는 예전 글 발명도둑잡기(39.7) 11.28 40 0
2905200 오늘의 소설, 영화 실마리: 초코파이 재판과 노조원 이야기 발명도둑잡기(39.7) 11.28 37 0
2905195 이익 배분 게임과 지능의 상관관계 [1] 발명도둑잡기(39.7) 11.28 72 0
2905193 넷마블 해킹 SQL 인젝션 추정 [1] ㅇㅇ(175.197) 11.28 87 0
2905191 넥스트 N.EX.T-Dear America 무삭제 발명도둑잡기(39.7) 11.28 39 0
2905190 아니 잼미니 미친년 지맘대로 배포 해버리네 ㅋㅋ 프갤러(218.236) 11.28 62 0
2905187 슈베르트-마왕 발명도둑잡기(39.7) 11.28 32 0
2905186 제리케이-마왕 발명도둑잡기(39.7) 11.28 32 0
2905185 요즘 어셈으로 짤 일이 많아서 그런가 [1] 루도그담당(58.233) 11.28 70 0
2905184 수이 블루비드 다녀옴 [1] 따당갤로그로 이동합니다. 11.28 66 0
2905181 나님 콧대가 그렇게 이뽀..? 따당갤로그로 이동합니다. 11.28 85 0
2905179 독도 간접 언급한 中, 포털사이트·AI도 “독도는 한국 땅” 발명도둑잡기(39.7) 11.28 42 0
2905178 페이커닮은 개발자 찾습니다 [2] 프갤러(106.101) 11.28 92 0
2905177 언리얼 메뉴얼 진짜 거지같네 [4] 프갤러(114.205) 11.28 77 0
2905175 개발하냐고 글 쓸 시간도 없고 ㅁㅌ겠네 ㅠㅠ [4] 나르시갤로그로 이동합니다. 11.27 58 0
2905174 세계최초의 최상위 수준 C API 래핑 설계 패턴인가? 나르시갤로그로 이동합니다. 11.27 64 0
2905173 N-Arity 제네릭 래퍼 + 중앙 집중식 예외 매퍼' 아키텍처 나르시갤로그로 이동합니다. 11.27 36 0
2905172 Clair 라이브러리: 예외 처리 C 바인딩 아키텍처 [1] 나르시갤로그로 이동합니다. 11.27 66 0
2905171 옛날에 nuri.net이 뭐였더라 발명도둑잡기(39.7) 11.27 45 0
2905170 중국 딥시크가 미국 AI 압살하는중 ㄷㄷ [4] ㅇㅇ갤로그로 이동합니다. 11.27 99 0
2905169 ‘성폭력 발언’ 이준석 불송치에…“막말 자유권은 없다” 반발 봇물 발명도둑잡기(39.7) 11.27 50 0
2905168 민주당, '2인선거구로 쪼개기'에 합세한다면 내란본당 국민의힘 부활 발명도둑잡기(39.7) 11.27 47 0
2905167 뭔가 소화가 잘 안된느낌 [2] ♥멘헤라냥덩♥갤로그로 이동합니다. 11.27 75 0
2905166 [애니뉴스] YxD Labs - 유튜브 링크 공유 ㅇㅇ(121.172) 11.27 39 0
2905165 MS 엣지브라우저 msn에 중요 노출되는 극우 황색지들 발명도둑잡기(39.7) 11.27 36 0
2905164 이세돌이 바둑 은퇴한거 이제 실감난다 [1] 프갤러(110.70) 11.27 64 0
2905163 컴퓨터로 일하는데 싸구려컴 쓰는 이유가 뭐임? [5] 에이도비갤로그로 이동합니다. 11.27 88 0
2905162 핫딜 놓쳐서 월급 10% 날림 실화? 프갤러(117.111) 11.27 67 0
2905161 안타까운 점은 대충 아는 애들이 확신에 차있다는거임 [14] 박민준갤로그로 이동합니다. 11.27 116 3
2905160 50위권 밖에 있는 언어들은 대체 왜 만든거냐? [2] 두정갑(221.149) 11.27 67 0
2905157 에구궁 피궁타 ♥멘헤라냥덩♥갤로그로 이동합니다. 11.27 57 0
2905156 Go 개발환경은 LiteIDE와 VS-Code 둘 중 어느 게 나음? [2] 두정갑(221.149) 11.27 63 0
2905155 여자아이 팬티냄새 맡고싶네 류류(121.160) 11.27 43 0
2905150 몇 시간 전부터 내 방 두번째 공유기가 재부팅 해도 발명도둑잡기(39.7) 11.27 39 0
2905149 나씻주준⭐+ ♥멘헤라냥덩♥갤로그로 이동합니다. 11.27 56 0
2905148 자바가 러스트보다 좋은 부분 나르시갤로그로 이동합니다. 11.27 51 1
2905144 ㅊㅗ큼만 더 ♥멘헤라냥덩♥갤로그로 이동합니다. 11.27 50 0
2905142 백엔드 퇴사하고 국비 클라우드 인프라 과정 어떤가요 [5] 프갤러(115.23) 11.27 85 0
2905141 하긴 지금이야 러이브러리 차원에서 많이들 크로스 os 지원하는거지 [1] 프갤러(110.8) 11.27 53 0
2905140 그러니까 이 자바 이식성도 개소린게 [5] 프갤러(110.8) 11.27 76 0
2905139 님들 기획서 쓸때 프로그램 머씀? 뉴진파갤로그로 이동합니다. 11.27 30 0
2905138 님들 기획서 쓸때 프로그램 머씀? [2] 뉴진파갤로그로 이동합니다. 11.27 49 0
2905137 틀렸다. 힙 메모리 64mb로 제한해도 여전히 280mib처먹는다. [2] 프갤러(110.8) 11.27 63 0
2905135 진정하자. jvm도 메모리 할당 옵션이 있겠지 [3] 프갤러(110.8) 11.27 68 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

디시미디어

디시이슈

1/2