(MISRA-C 4๊ฐ•) ์ œ์–ด ํ๋ฆ„๊ณผ ์กฐ๊ฑด๋ฌธ ๊ทœ์น™

๐Ÿš— MISRA-C: 2012 4๊ฐ• ์ œ์–ด ํ๋ฆ„๊ณผ ์กฐ๊ฑด๋ฌธ ๊ทœ์น™

“์ฝ”๋“œ๊ฐ€ ์–ด๋””๋กœ ๊ฐ€๋Š”์ง€, ๊ผญ ์•Œ์•„์•ผ ํ•œ๋‹ค!”


๐Ÿ˜Ž ๋“ค์–ด๊ฐ€๋ฉฐ

C ์–ธ์–ด์—์„œ ์ œ์–ด ํ๋ฆ„(control flow) ์€ ํ”„๋กœ๊ทธ๋žจ์˜ ๋ฐฉํ–ฅํƒ€์ž…๋‹ˆ๋‹ค.
๋ฐฉํ–ฅํƒ€๊ฐ€ ์ž˜๋ชป๋˜๋ฉด? ๐Ÿšข → ์•”์ดˆ ์งํ–‰!
MISRA-C์—์„œ๋Š” if, switch, for, while ๊ฐ™์€ ์ œ์–ด๋ฌธ์— ์•ˆ์ „ ์šด์ „ ๊ทœ์น™์„ ๊ฑธ์–ด
์˜ˆ์ธก ๋ถˆ๊ฐ€๋Šฅํ•œ ์‚ฌ๊ณ ๋ฅผ ๋ฏธ์—ฐ์— ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ›‘ ์ œ์–ด๋ฌธ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋Œ€ํ‘œ ์‚ฌ๊ณ 

1. ์กฐ๊ฑด ๋ˆ„๋ฝ ์‚ฌ๊ณ 

if (status = READY) // ๐Ÿ˜ฑ '='๋Š” ๋Œ€์ž…, '=='๊ฐ€ ๋น„๊ต
{
    startEngine();
}
  • ์˜๋„: READY์ผ ๋•Œ๋งŒ ์‹คํ–‰
  • ์‹ค์ œ: status์— READY ๋Œ€์ž… ํ›„ ํ•ญ์ƒ ์ฐธ → ๋ฌด์กฐ๊ฑด ์‹คํ–‰

MISRA ๋ฐฉ์–ด์ฑ…: ์กฐ๊ฑด๋ฌธ์—์„œ ๋Œ€์ž… ๊ธˆ์ง€, ๋น„๊ต ์—ฐ์‚ฐ ํ•„์ˆ˜ ํ™•์ธ


2. switch ๋ฌธ์—์„œ์˜ ์ถ”๋ฝ ์‚ฌ๊ณ 

switch (mode)
{
    case 1:
        accelerate();
    case 2:
        brake();
        break;
}
    • case 1 ๋’ค์— break๊ฐ€ ์—†์–ด 2๋ฒˆ case๋กœ ์ถ”๋ฝ(Fall-through)
    • ๋•Œ๋กœ๋Š” ์˜๋„์ ์ด์ง€๋งŒ, MISRA์—์„œ๋Š” ๋ช…์‹œ ์ฃผ์„ ์—†์œผ๋ฉด ๊ธˆ์ง€

/* fall-through intentional */ ์™€ ๊ฐ™์ด ํ‘œ์‹œ


3. ๋ฐ˜๋ณต๋ฌธ ํƒˆ์ถœ ์‹คํŒจ

while (1)
{
    if (stopSignal)
        break;
}
  • break๊ฐ€ ์œ ์ผํ•œ ํƒˆ์ถœ ์ˆ˜๋‹จ์ด๋ฉด ๋ฌดํ•œ ๋ฃจํ”„ ๊ฐ€๋Šฅ์„ฑ↑
  • MISRA๋Š” ์ข…๋ฃŒ ์กฐ๊ฑด์ด ๋ช…ํ™•ํ•˜๊ณ  ์œ ํ•œํ•ด์•ผ ํ•œ๋‹ค๊ณ  ๊ถŒ๊ณ 

๐Ÿ“Œ MISRA-C์˜ ์ œ์–ด ํ๋ฆ„ ์•ˆ์ „ ๊ทœ์น™

if-else ๊ทœ์น™

  • ๋ชจ๋“  if๋Š” ๋ช…ํ™•ํ•œ ์กฐ๊ฑด๊ณผ ์ค‘๊ด„ํ˜ธ ์‚ฌ์šฉ
  • ์ค‘์ฒฉ if๋Š” ์ตœ์†Œํ™” → ์ฝ๊ธฐ ์–ด๋ ค์šด "ํ”ผ๋ผ๋ฏธ๋“œ ์ฝ”๋“œ" ๋ฐฉ์ง€

switch ๊ทœ์น™

  • ๋ชจ๋“  case์— break ๋˜๋Š” ๋ช…์‹œ์  fall-through ์ฃผ์„ ํ•„์ˆ˜
  • default case ํ•„์ˆ˜ → ์˜ˆ๊ธฐ์น˜ ๋ชปํ•œ ๊ฐ’ ์ฒ˜๋ฆฌ

๋ฐ˜๋ณต๋ฌธ ๊ทœ์น™

  • for/while ์ข…๋ฃŒ ์กฐ๊ฑด์€ ๋ฐ˜๋“œ์‹œ ๊ฒฐ์ •์ ์ด์–ด์•ผ ํ•จ
  • ๋ฌดํ•œ ๋ฃจํ”„๋Š” ์˜ˆ์™ธ์  ์ƒํ™ฉ์—์„œ๋งŒ ์‚ฌ์šฉ, ์ข…๋ฃŒ ๊ฒฝ๋กœ ๋ช…ํ™•ํžˆ ๋ช…์‹œ

๐Ÿ“Š ์•ˆ์ „ ์ œ์–ด๋ฌธ ๊ทœ์น™ ํ•œ๋ˆˆ์— ๋ณด๊ธฐ

์ œ์–ด๋ฌธ ์œ„ํ—˜ ์‚ฌ๋ก€ MISRA ์•ˆ์ „ ๋Œ€์ฑ…
if-else =์™€ == ํ˜ผ๋™ ์กฐ๊ฑด๋ฌธ ๋Œ€์ž… ๊ธˆ์ง€
switch break ๋ˆ„๋ฝ break ๋˜๋Š” fall-through ์ฃผ์„
for/while ์ข…๋ฃŒ ์กฐ๊ฑด ๋ถˆ๋ช…ํ™• ๊ฒฐ์ •์  ์กฐ๊ฑด ํ•„์ˆ˜

๐Ÿ’ก ์‹ค๋ฌด ํŒ

  • ์ •์  ๋ถ„์„ ๋„๊ตฌ๋ฅผ ์“ฐ๋ฉด switch ๋ˆ„๋ฝ์ด๋‚˜ ์กฐ๊ฑด ๋Œ€์ž… ์‹ค์ˆ˜๋ฅผ ์ž๋™ ๊ฒ€์ถœ
  • ํ•˜์ง€๋งŒ ๋„๊ตฌ๋งŒ ๋ฏฟ์ง€ ๋ง๊ณ  ์ฝ”๋“œ ๋ฆฌ๋ทฐ ํ•„์ˆ˜!
  • ํŠนํžˆ ์ œ์–ด๋ฌธ์€ ์ฝ”๋“œ ํ๋ฆ„๋„(flow chart) ๋กœ ๊ทธ๋ ค๋ณด๋ฉด ๋ฒ„๊ทธ๊ฐ€ ๋ˆˆ์— ์ž˜ ๋•๋‹ˆ๋‹ค

๐Ÿ“ข ๋‹ค์Œ ํšŒ์ฐจ ์˜ˆ๊ณ 

 ํฌ์ธํ„ฐ ์‚ฌ์šฉ ์ œํ•œ๊ณผ ์•ˆ์ „ํ•œ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ
C ์–ธ์–ด์˜ ๊ฐ•๋ ฅํ•œ ๋ฌด๊ธฐ์ด์ž ์–‘๋‚ ์˜ ๊ฒ€, ํฌ์ธํ„ฐ!
MISRA-C๊ฐ€ ์–ด๋–ป๊ฒŒ ํฌ์ธํ„ฐ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์“ฐ๋„๋ก ์ œํ•œํ•˜๋Š”์ง€ ์•Œ์•„๋ด…๋‹ˆ๋‹ค.

๋ฐ˜์‘ํ˜•