[C] ๋กฑ์ ํ”„

[์›๋ณธ ๋งํฌ]

C ํ‘œ์ค€์—๋Š” setjmp๋ผ๋Š” ๊ธฐ๊ดดํ•œ ํ—ค๋”๊ฐ€ ์žˆ๋‹ค.

์ด๊ฑด ํ•จ์ˆ˜๋ฅผ ๋„˜๋‚˜๋“œ๋Š” goto๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

jmp_buf๋ผ๋Š” ๋ณ€์ˆ˜์— setjmp๋กœ ๋ ˆ์ด๋ธ” ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋ฉด, longjmp ํ•จ์ˆ˜๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋•Œ๋ฌธ์— ์•„๋ž˜์™€ ๊ฐ™์€ ์ฝ”๋“œ๋Š” goto๋‚˜ ๋ฐ˜๋ณต๋ฌธ๋„ ์—†์ง€๋งŒ ๋ฌดํ•œ๋ฃจํ”„๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค. image

image

๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ ๊ฐ„์—๋„ ์ ํ”„๋ฅผ ์‹œ๋„ํ•  ์ˆœ ์žˆ์ง€๋งŒ ๊ฒฐ๊ณผ๋Š” UB๋ผ๊ณ  ํ•œ๋‹ค.(C11) ๊ทผ๋ฐ ๋ญ ์Šค๋ ˆ๋“œ๋„ ๊ตฌํ˜„์ด ์•ˆ๋œ ์ƒํƒœ๋ผ์„œ.

์—ฌํŠผ ์ด๋Ÿฐ ํŒŒ๊ฒฉ์ ์ธ ํ–‰์‚ฌ์— ๊ฑธ๋งž๊ฒŒ, ๋งŽ์€ ๋‹จ์ ์ด ์กด์žฌํ•œ๋‹ค.
longjmp๊ฐ™์€ ๊ฒฝ์šฐ์—” ์Šค์ฝ”ํ”„๋ฅผ ์ดˆ์›”ํ•ด์„œ ๊ฑด๋„ˆ๋›ฐ๊ธฐ ๋•Œ๋ฌธ์—, ๋œฌ๊ธˆ์—†์ด ์ž๋™๋ณ€์ˆ˜์—๋„ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ํŠนํžˆ ๊ฐ€๋ณ€๊ธธ์ด๋ฐฐ์—ด์ด ๊ทธ๋ ‡๋‹ค.

๊ทธ๋ž˜๋„ try-catch๋‚˜ ์ฝ”๋ฃจํ‹ด ๋“ฑ์„ ๊ตฌํ˜„ํ•˜๊ธฐ์—” ๊ดœ์ฐฎ์•„๋ณด์ธ๋‹ค.


์ฐธ์กฐ
https://en.cppreference.com/w/c/program/longjmp