C programming - minsuk-jang/teamproject GitHub Wiki

C ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ์ˆ ๊ณผ Neovim ํŠน์ • ์ง€์นจ

ํฌ๊ธฐ

sizeof(<var>) vs sizeof(<type>)

์—ฌ๋Ÿฌ๋ถ„์€ ์ •๋ง๋กœ ์ฃผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค : ๋ฐฐ์—ด๊ณผ ํฌ์ธํ„ฐ์˜ ์ฐจ์ด [...] ๋ณ€์ˆ˜๊ฐ€ simple (int, long, ...)์ด๋ฉด 'sizeof (variable)'๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๋ณ€์ˆ˜๊ฐ€ complex (struct, pointer-to-pointer)๋ผ๋ฉด 'sizeof (the_actual_type )`๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ฒ”์œ„

๋‚ด๋ถ€ ๋ฒ”์œ„์—์„œ ํ• ๋‹น ๋œ ํฌ์ธํ„ฐ์— ์ ‘๊ทผ ํ•˜๋Š”๊ฒƒ์€ ** ์ •์˜๋˜์ง€ ์•Š์€ ๋™์ž‘ **์ž…๋‹ˆ๋‹ค.

๊ตฌ์„ฑ ๊ตฌ์กฐ

https://github.com/neovim/neovim/pull/656#issuecomment-41905534

TODO: legacy Vim struct hack์— ๋Œ€ํ•œ ํ† ๋ก  ๋งํฌ

Unsigned or signed? ์ •์ˆ˜ overflow / underflow

๋ถ€ํ˜ธ์žˆ๋Š” ์œ ํ˜•๊ณผ ๋ถ€ํ˜ธ์—†๋Š” ์œ ํ˜•์„ ์„ ํƒํ•˜๋Š” ๋™์•ˆ ์œ ์˜ํ•ด์•ผ ํ•  ๋ช‡ ๊ฐ€์ง€ ์ค‘์š”ํ•œ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ฒซ์งธ, unsigned overflow๊ฐ€ ์ •์˜๋˜๊ณ  ** signed overflow๋Š” ์ •์˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ถˆํ–‰ํ•œ ์—ญ์‚ฌ์  ์‹ค์ˆ˜๋กœ์„œ, signed ์ •์ˆ˜๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ์ด ๋ฌด์—‡์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์€ ๋•Œ๋กœ๋ถ€ํ„ฐ ์œ ๋ž˜ํ•ฉ๋‹ˆ๋‹ค. C ํ‘œ์ค€์€ ๊ฐ ํ‘œํ˜„์ด ๋‹ค๋ฅธ ๋™์ž‘์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— signed ์ •์ˆ˜๊ฐ€ overflows ๋  ๋•Œ ์–ด๋–ค ์ผ์ด ๋ฐœ์ƒํ• ์ง€๋ฅผ ์ง€์ •ํ•ด์„œ๋Š” ์•ˆ๋˜๋ฉฐ / ์ง€์ •ํ•  ์ˆ˜ ์—†์–ด์•ผ ํ•œ๋‹ค๊ณ  ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ˜„๋Œ€์—์„œ๋Š” ๋ถ€ํ˜ธ์žˆ๋Š” ์ •์ˆ˜๊ฐ€ ํ•ญ์ƒ 2์˜ ๋ณด์ˆ˜ ํ˜•์‹์œผ๋กœ ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค. ์ด ํ˜•์‹์€ ๋งŽ์€ ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํฅ๋ฏธ๋กœ์šด ์ ์€ gcc์™€ clang์ด passing the -fwrapv flag์„ ์‚ฌ์šฉํ•˜์—ฌ signed overflow๋ฅผ ์ •์˜๋œ ๋Œ€๋กœ ๋ณผ ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ถˆํ–‰ํ•˜๊ฒŒ๋„ ๋น„ํ‘œ์ค€ ์ž…๋‹ˆ๋‹ค.

์ •์˜๋œ ๊ฒƒ๊ณผ ์ •์˜๋˜์ง€ ์•Š์€ ๊ฒƒ์€ ๋ฌด์—‡์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ? unsigned ์ •์ˆ˜๊ฐ€ overflows๋˜๋ฉด 0์œผ๋กœ ๋˜๋Œ๋ฆฝ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ signed ์ •์ˆ˜๊ฐ€ overflows๋˜๋Š” ๊ฒฝ์šฐ $ ์‹  (็ฅž)์€ ์ผ์–ด๋‚  ์ผ๋งŒ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋” ๊ตฌ์ฒด์ ์œผ๋กœ : ์šฐ๋ฆฌ๋Š” 2๊ฐœ์˜ ๋ณด์ˆ˜ signed ์ •์ˆ˜๊ฐ€ overflow ๋  ๊ฒฝ์šฐ ์–ด๋–ค ์ผ์ด ๋ฒŒ์–ด์ง€๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์ง€๋งŒ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ํ‘œ์ค€์ด ์ •์˜๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์›ํ•˜๋Š”๋Œ€๋กœ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ, ์ตœ์ ํ™” ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ข…์ข… unsigned ์ •์ˆ˜๊ฐ€ overflow ํ•  ์ˆ˜ ์—†๋‹ค(mahkoh์˜ ์ •์˜๋˜์ง€ ์•Š์€ ๋™์ž‘ ์˜ˆ์ œ๋ฅผ ์—ฌ๊ธฐ์— ์‚ฝ์ž…ํ•˜์‹ญ์‹œ์˜ค)๋ผ๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ์ผ๋ถ€ ๋ถ„๊ธฐ ๋˜๋Š” ๋น„๊ต๋ฅผ ์ตœ์ ํ™” ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋™์ž‘์œผ๋กœ ์ธํ•ด ๋ฃจํ”„๊ฐ€ ์˜๊ตฌ์ ์œผ๋กœ ์‹คํ–‰๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์กฐ๊ฑด์ด ์ฃผ์˜ ๊นŠ๊ฒŒ ์“ฐ์—ฌ์ง€์ง€ ์•Š๋Š”๋‹ค๋ฉด, unsigned ์ •์ˆ˜์˜ ์ž˜ ์ •์˜๋œ wraparound overflow๊ฐ€ ๋น„ ์ข…๊ฒฐ ๋ฃจํ”„ (non-terminating loops)๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์— ์œ ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. '(U) INTX_MAX / MIN`์€ ์—ฌ๋Ÿฌ๋ถ„์˜ ์นœ๊ตฌ์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ unsigned ์‚ฐ์ˆ ์€ over ๋ฐ underflow๋ฅผ ์ •์˜ํ–ˆ์œผ๋ฏ€๋กœ ์šฐ์ˆ˜ํ•˜๋‹ค๊ณ  ํŒ๋‹จ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ํ•ญ์ƒ ์‚ฌ์‹ค์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋งŽ์€ ์–ธ์–ด (์˜ˆ : Java)๊ฐ€ unsigned ์œ ํ˜•์„ ๋…ธ์ถœ์‹œํ‚ค์ง€ ์•Š๋Š” ๋ฐ๋Š” ์ข‹์€ ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ค๋ฅ˜๋ฅผ ๋ฐœ๊ฒฌํ•˜๊ธฐ๊ฐ€ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. *ํ๋ฆ„์˜ ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ํ˜•ํƒœ๋Š” unsigned ์‚ฐ์ˆ ์—์„œ์˜ underflow์ž…๋‹ˆ๋‹ค. unsigned int num = 0;์—์„œ 1์„ ๋บ€ ๊ฒƒ์€ UINT_MAX๋กœ ๊ฐ์‹ธ์ค๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๋” ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์ด์œ ๋งŒ์œผ๋กœ๋„ ๋ณดํ†ต int๋ฅผ uint32_t/size_t/... ๋˜๋Š” ๋‹ค๋ฅธ unsigned ํƒ€์ž… ๋Œ€์‹ ์— ๋ฃจํ”„ ์นด์šดํ„ฐ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค. **. ์ˆ™๋ จ ๋œ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋ผ๋„ ์ผ๋ถ€ ๊ฒฝ์šฐ underflow๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š” unsigned ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์„ ํ”ผํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ** ๋ฌธ์ œ ** : ์˜ฌ๋ฐ”๋ฅธ ์„œ๋ช… ๋œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ๋” ์‰ฝ์ง€๋งŒ 'size_t'์™€ ๋น„๊ตํ•  ๋•Œ casts๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. (sizeof, strlen ๋“ฑ์˜ ๋ฐ˜ํ™˜ ์œ ํ˜•์ด๋ฏ€๋กœ ์ž์ฃผ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค). casts๋Š” ์ถ”์•…ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋Šฅํ•˜๋ฉด ํ”ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” ์–ด๋””์—์„œ๋‚˜ ๊ทธ๊ฒƒ๋“ค์„ ํ”ผํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. ๊ฐ€๋” trade-off๊ฐ€ ์ด๋ฃจ์–ด์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ๋Š” ์ด์ „ -Wconversion PRs๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

๊ฒฐ๋ก :

  • underflow๊ฐ€ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๊ฑฐ๋‚˜ ๋ฌธ์ œ์˜ ๋ฃจํ”„๊ฐ€ ์ž‘์œผ๋ฉด (์ •ํ™•ํ•˜๊ฒŒ '2 ^ 31'ํ•ญ๋ชฉ๋ณด๋‹ค ์ž‘์Œ), ๋ฃจํ”„ ์•ž์— signed ์‚ฐ์ˆ ๊ณผ guards๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.
  • ๋งŒ์•ฝ overflow์˜ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค๋ฉด, unsigned ์‚ฐ์ˆ ๊ณผ ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด guards๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.
  • underflow์™€ overflow์˜ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ๋งค์šฐ ์กฐ์‹ฌํ•˜์‹ญ์‹œ์˜ค.

Guarded casting

๊ณ ์ • ํฌ๊ธฐ vs. ์ผ๋ฐ˜ ์œ ํ˜•

char,short,int,long ์™ธ์—๋„ (u) intX_t์™€ ์นœ๊ตฌ๋“ค์„ ์‚ฌ์šฉํ•ด์•ผ ํ• ๊นŒ์š”? ...

  • size_t: ...
  • rsize_t :์ด ํ˜•์‹์€ C11 ํ‘œ์ค€์—์„œ ์ƒˆ๋กœ ์ถ”๊ฐ€ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์ง€๋งŒ ๊ทธ ๋’ค์—์žˆ๋Š” ์ถ”๋ก ๊ณผ ์‚ฌ์šฉ๋ฒ•์€ ํฅ๋ฏธ๋กญ์Šต๋‹ˆ๋‹ค. rsize_t ํƒ€์ž…์˜ ๋ณ€์ˆ˜๊ฐ€ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ์‹ค์ œ ์ตœ๋Œ€๊ฐ’์€ RSIZE_MAX ๋Œ€์‹  ** less ** ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ์ž‘์—…์„ ๊ณ„์†ํ•˜๊ธฐ ์ „์— val <= RSIZE_MAX์ธ์ง€ ํ™•์ธํ•˜๊ณ  ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฒซ๋ฒˆ์งธ ์œ ์šฉํ•œ ์†์„ฑ์€ :RSIZE_MAX์— ๋Œ€ํ•œ ๊ฐ’์€ ๋Œ€๊ฐœ ๋„ˆ๋ฌด ์ปค์„œ ์–ด์จŒ๋“  ์œ ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. rsize_t๊ฐ€ 64 ๋น„ํŠธ๋ผ๋ฉด ๋ˆ„๊ฐ€ ๋ง‰๋Œ€ํ•œ ์–‘์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๊นŒ? ๋…ผ๋ž€์˜ ์—ฌ์ง€๋Š” ์žˆ์ง€๋งŒ ์ž‘์—… ์ˆ˜ํ–‰์„ ๊ฑฐ๋ถ€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ ์œ ์šฉํ•œ ์†์„ฑ์€ unsigned ์‚ฐ์ˆ ์ด underflow ๋ฌธ์ œ์— ๋œ ์ทจ์•ฝํ•˜๊ฒŒ ๋งŒ๋“œ๋Š”๋ฐ ์ข‹์Šต๋‹ˆ๋‹ค. rsize_t val = -4์€ ๊ฐ์‹ธ์กŒ๊ธฐ ๋•Œ๋ฌธ์— RSIZE_MAX๋ณด๋‹ค ํด ๊ฒƒ์ž…๋‹ˆ๋‹ค. RSIZE_MAX์— ๋Œ€ํ•ด bounds-check๋ฅผ ํ•˜๋Š” ํ•จ์ˆ˜๋Š” ๊ทธ ๊ฐ’์„ ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ cast(rsize_t๋Š” ์„œ๋ช…์ด ์—†์–ด์•ผ ํ•จ)์—†์ด unsigned ์ฝ”๋“œ์™€ ์ƒํ˜ธ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ข‹์€ ๋ฐฉ๋ฒ•์ธ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋ฉฐ signed ์‚ฐ์ˆ ์˜ ์•ˆ์ „ ์ด์ ์„ ์—ฌ์ „ํžˆ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋„๊ตฌ ๋ฐ ๊ธฐ์‚ฌ

Neovim๊ณผ ๊ฐ™์ด ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ์ƒ์„ฑ, ์œ ์ง€ ๋ฐ ๋ณ€ํ™˜ํ•˜๋Š” ๋™์•ˆ ๋„์›€์ด ๋˜๋Š” ์œ ์šฉํ•œ ๋„๊ตฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€ ๊ธฐ์‚ฌ :

โš ๏ธ **GitHub.com Fallback** โš ๏ธ