[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 ๊ฐ™์€ ํƒ€์ž…์— ๋Œ€ํ•ด์„œ๋Š” ์ ์šฉ์ด ๋˜์ง€ ์•Š๋Š” ๋ชจ์–‘์ด๋‹ค.

๋‚˜๋„ ์•„์ง์€ ์™„์ „ํžˆ ์ž˜ ์ดํ•ด๋˜์ง€๋Š” ์•Š๋Š”๋ฐ, ์ด๋Ÿฐ๊ฒƒ ๋•Œ๋ฌธ์— ์กด์žฌํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.

  1. ์Šค๋ ˆ๋“œ ํŒจ๋‹‰์ด ๋ฐœ์ƒํ•˜๋ฉด ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๊ฐ€ ์ผ์‹œ์ ์œผ๋กœ ์œ ํšจํ•˜์ง€ ์•Š์€ ์ƒํƒœ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค.

  2. ์ด๋Ÿฐ ๊นจ์ง„ ๋ถˆ๋ณ€์„ฑ(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