[Rust] panic์ ๋ํด์
Rust์์ Panic์ ์ตํ์ ์ค๋ฅ ์ฒ๋ฆฌ ์๋จ์ด๋ค.
ํ์ค์ ์ผ๋ก ๋ฐ์ํ์ง ์์์ผ ํ๋ ์ํฉ์์ ๋ฌธ์ ๊ฐ ์๊ธธ ๊ฒฝ์ฐ ๋์ง๊ณค ํ๋ค.
ํจ๋์ ๋ฐฐ์ด out of index ๊ฐ์ ์ํฉ์์ ๋จ๊ธฐ๋ ํ์ง๋ง, ์ง์ ๋์ง๊ธฐ๋ ์ฝ๋ค.
์๋์ ๊ฐ์ด panic ๋งคํฌ๋ก๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฐ๋ก ํจ๋์ด ๋ฐ์ํ๊ณ

๊ทธ ํจ๋ ํ ์คํธ์ ๋ฐฑํธ๋ ์ด์ค๊ฐ ๋ก๊ทธ์ ์ฐํ๋ค.

ํจ๋์ ์ข ๋ฅ
Rust์ ํจ๋์๋ 2๊ฐ์ง ์ข
๋ฅ๊ฐ ์๋ค.
unwind์ abort๋ค.
unwind๋ ํจ๋์ด ๋ฐ์ํ์๋ ์คํ์ ์์๋๋ก ํ๋ฉด์ ์์์ ํด์ ํ๋ค. ๊ทธ๋ฆฌ๊ณ ํด์ ๊ฐ ๋ค ๋๋๋ฉด ์ข
๋ฃ๋ฅผ ํ๋ค.
ํ์ง๋ง abort๋ ์ ๋ฆฌ๊ณ ๋ญ๊ณ ๋ค ๋์ง๊ณ ๋ฐ๋ก ์ข
๋ฃ๋ฅผ ํ๋ค.
๋๋ถ๋ถ์ ํ๋ซํผ์์๋ unwind๊ฐ ๊ธฐ๋ณธ์ผ๋ก ํ์ฑํ๋์ด์์ผ๋, ์ผ๋ถ ๋ถ๊ฐ๋ฅํ ํ๋ซํผ์ abort๊ฐ ๊ธฐ๋ณธ๊ฐ์ด๋ค.
unwind๋ ํจ๋ ์ดํ์ ๋์์ ๋ํด์ ๊ณ ๋ คํ ํ์๊ฐ ์๋ ๊ฒฝ์ฐ์๋ ๋งค์ฐ ์ ์ฉํ๋, ๊ทธ๋ ์ง ์์๋๋ ์ฝ๊ฐ์ ์ํด๊ฐ ๋ ์ ์๋ค. unwind ์ฒ๋ฆฌ๋ฅผ ์ํด์ ์ถ๊ฐ์ ์ธ ๋ก์ง์ด ๋ค์ด๊ฐ๋ค๋ณด๋ ๋ฐ์ด๋๋ฆฌ ์ฌ์ด์ฆ๊ฐ ์ข ์ปค์ง๊ธฐ ๋๋ฌธ์ด๋ค.
๊ทธ๋ฐ๊ฑฐ์ ๋ฏผ๊ฐํ๋ฉด abort ๋ชจ๋๋ก ์ฌ์ฉํ๋ฉด ๋๋ค.
cargo.toml์ ์ด๋ฐ๊ฑธ ์ถ๊ฐํ๋ค.
[profile.release]
panic = "abort"
[profile.dev]
panic = "abort"

catch_unwind๋ก ํจ๋ ์ก๊ธฐ
ํจ๋์ ์ก์์ ์์ธ์ฒ๋ฆฌ๋ฅผ ํ ์๋ ์๋ค.
ํจ๋์ผ๋ก try-catch๋ฅผ ํ๋๊ฑด ๊ถ์ฅ๋๋ ์ฌํญ์ ์๋๋, ์ข
์ข
์์คํ
์ ์์ ์ฑ์ ์ํด ์ฌ์ฉํด์ผํ ๊ฒฝ์ฐ๋ ์๋ค.
์ผ๋จ, ์ด ๊ธฐ๋ฅ์ unwind ๊ธฐ๋ฅ์ ์ฌ์ฉํ ๋๋ง ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค. abort ๋ชจ๋์์๋ ํจ๋์ด ๋ฐ๋ก ํ๋ก์ธ์ค๋ฅผ ๋ ๋ ค๋ฒ๋ฆฌ๊ธฐ ๋๋ฌธ์ ๋ญ ์ก์ ํ๋ ์๊ธฐ ๋๋ฌธ์ด๋ค.
์ฌ์ฉ๋ฒ์ ๋๋ต ์ด๋ ๋ค.
ํจ๋์ด ๋ฐ์ ๊ฐ๋ฅํ ์์ญ์ ํด๋ก์ ๋ก ๋ฌถ์ด์ ํจ์์ ๋์ ธ์ฃผ๋ฉด ๋๋ค.
๊ทธ๋ผ ์คํจ ๊ฒฐ๊ณผ์ ๋ฐ๋ผ์ Result๋ก ๋ง์๋ค๊ฐ ๋์ ธ์ฃผ๋๋ฐ
ํจ๋์ด ๋จ๋ฉด ์ด๋ ๊ฒ ๋ ๋ผ์จ๋ค.
์ ์ ํ ๋ฐ์์ ์ฒ๋ฆฌํ๋ฉด ๋๋ค.
UnwindSafe
๊ทผ๋ฐ ๋ง์ฝ ์ด๋ฐ Foo ํ์ ์ ์ ์ํด์ catch_unwind์ ๋๊ฒจ๋ณด๋ฉด,

์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค. UnwindSafe๊ฐ ๋ฐ์ํ๋ค๊ณ ํ๋ค.
์ด UnwindSafe๋ ํธ๋ ์์ ํด๋น ํ์
์ด ํจ๋ ํ๊ฒฝ์์๋ ์์ ํ๋ค๋ ๊ฒ์ ์ฆ๋ช
ํ๋ ํน์ํ ๋ง์ปค ํ์
์ด๋ค.
์๋๋ ๋๋ถ๋ถ์ ํ์
์ ์๋ ๊ตฌํ๋๋ ํธ๋ ์์ธ๋ฐ, Any๋ RefCell, &mut T ๊ฐ์ ํ์
์ ๋ํด์๋ ์ ์ฉ์ด ๋์ง ์๋ ๋ชจ์์ด๋ค.
๋๋ ์์ง์ ์์ ํ ์ ์ดํด๋์ง๋ ์๋๋ฐ, ์ด๋ฐ๊ฒ ๋๋ฌธ์ ์กด์ฌํ๋ค๊ณ ํ๋ค.
-
์ค๋ ๋ ํจ๋์ด ๋ฐ์ํ๋ฉด ๋ฐ์ดํฐ ๊ตฌ์กฐ๊ฐ ์ผ์์ ์ผ๋ก ์ ํจํ์ง ์์ ์ํ๊ฐ ๋ ์ ์๋ค.
-
์ด๋ฐ ๊นจ์ง ๋ถ๋ณ์ฑ(broken invariant)์ ๋์ค์์ผ ๊ด์ฐฐ๋ ์ ์๋ค.
์ด๋ฐ๊ฒ ๋๋ฌธ์ ๋
ผ๋ฆฌ์ ๋ถ๋ณ์ฑ์ด ๊นจ์ ธ์ ๋ญ์ง๋ ๋ชจ๋ฅด๊ฒ ์ง๋ง ๋ฒ๊ทธ๊ฐ ๋ฐ์ํ ์ ์๋จ๋ค.
๊ทธ๋์ UnwindSafe๋ผ๋ ๊ฑธ ํตํด์ ์์ ์ฑ์ ์ ํํ๋๋ฐ, ์ด๊ฒ ์๋ค๊ณ ํด์ unsafeํ๊ฑด ๋ ์๋๋ผ๋ ๋ญ๋ผ๋... ๊ทธ๋ฅ ๊ถ๊ณ ์ฌํญ ์ ๋์ง ๊ทธ๋ ๊ฒ ํฐ ์ํ์ ์๋๊ฑฐ๊ฐ๋ค. ๋ญ์ด๋ฆฌ ์ ๋งคํ๊ฒ ๋ง๋ค์๋์ง
์ด๊ฑฐ ๊ด๋ จํด์๋ ๊ฐ์ ๋ฐฉ์์ด ์ ์๋๊ณ ์๊ณ , ๊ณ์ํด์ ๊ฐ๋ฐ์ค์ธ ๋ถ๋ถ์ด ๋ง์ ๊ฒ ๊ฐ๋ค.
์๋ฌดํผ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด UnwindSafe ํธ๋ ์์ ๋์ ํ์ ์ ์ ์ฉํด์ฃผ๋ฉด ๋๋ค.
๊ทธ๋ผ ๋์์ ์ ํ๋ค.
์ค๋ ๋์์์ ํจ๋
๋ฉ์ธ์ค๋ ๋์์ ๋ฐ์ํ ํจ๋์ ํ๋ก๊ทธ๋จ์ ํต์งธ๋ก ํฐ๋จ๋ฆฌ์ง๋ง, ์๋ธ์ค๋ ๋์์ ๋ฐ์ํ ํจ๋์ ํฐ ๋ฌธ์ ๊ฐ ๋์ง๋ ์๋๋ค.
๊ทธ๋์ ์ด๋ ๊ฒ ํจ๋์ ๋์ ธ๋

๋ฉ์ธ์ค๋ ๋๋ ๊ทธ๋๋ก ๋์ํ๋ค.
ํจ๋ ๊ฐ๋ก์ฑ๊ธฐ
ํจ๋ ๋ฐ์์ ๊ฐ๋ก์ฑ์ ํจ๋ ๋ฉ์ธ์ง๋ฅผ ์ปค์คํ
ํ๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ค.
์ด๊ฑด abort, unwind ๋๋ค ์ฌ์ฉ๊ฐ๋ฅํ๋ค.
์ด๋ฐ์์ผ๋ก set_hook ๊น๊ณ ํ์ค ์ถ๋ ฅ์ ๋ด๋ณด๋ด๋ฉด

๊ทธ๊ฒ ํจ๋ ๋ฉ์ธ์ง๊ฐ ๋๋ค.
(์ฌ์กฑ) ํจ๋ ๋ด๋ถ๋์ ๊น๋ณด๊ธฐ
์ด๊ฑด ์ฌ์กฑ์ด๋ค. ๊ถ๊ธํ์ง ์๋ค๋ฉด ์ฌ๋๋ค.
๋ณ ์๋ฏธ๋ ์๊ณ , ์ข ๊ถ๊ธํด์ ๊น๋ณด๋๊ฑธ ๋์ถฉ ๋ชจ์๋ ๊ฒ์ด๋ค.
ํจ๋ ๋งคํฌ๋ก๋ฅผ ๊น๋ณด๋ฉด
๋นํธ์ธ ๋์์ด๋ผ ๋ญ๊ฐ ์๋ค๊ณ ๋ง ํ๋ค.
๊ทธ๋์ ํจ๋ ๋ฐ์์์ ๋์ง๋ ๋จธ์ ์ฝ๋๋ฅผ ์ถ์ ํด๋ณด๋ฉด
begin_panic_handler๋ผ๋ ๋
์์ด ํธ์ถ๋๋๊ฑธ ํ์ธํ ์ ์๋ค.
https://github.com/rust-lang/rust/blob/master/library/std/src/panicking.rs#L593

๊ทธ๋ฆฌ๊ณ ์ ๊ฑด rust_panic_with_hook์ด๋ ํจ์์ ์ฒ๋ฆฌ๋ฅผ ์์ํ๋๋ฐ
์ด๊ฑด panic_count::increase์ ๋์ด๋ ๊ฐ์ ๋ฐ๋ผ์ abort๋ฅผ ๋๋ฆด์ง ๋ง์ง๋ฅผ ๊ฒฐ์ ํ๋ค.
์ panic_count๋ cfg ๋งคํฌ๋ก๋ฅผ ํตํด ์ปดํ์ผํ์ ๋ถ๊ธฐ๋ฅผ ํ๊ฒ ๊ตฌ์ฑ๋์ด์๋ค.
์ด๊ฑด ์๋ง abort ํ๋๊ทธ๊ฐ ํ์ฑํ๋์์๋

์ด๊ฑด unwind๊ฐ ํ์ฑํ๋์์ ๋์ mod์ธ๊ฑฐ๊ฐ๋ค.
์ฐธ์กฐ
https://doc.rust-lang.org/book/ch09-01-unrecoverable-errors-with-panic.html
https://rustc-dev-guide.rust-lang.org/panic-implementation.html
https://doc.rust-lang.org/cargo/reference/profiles.html#panic
https://github.com/rust-lang/rust/blob/master/library/std/src/panicking.rs#L593
https://doc.rust-lang.org/rust-by-example/error/abort_unwind.html
https://doc.rust-lang.org/std/panic/trait.UnwindSafe.html
https://github.com/rust-lang/rfcs/blob/master/text/1236-stabilize-catch-panic.md