Home MISRA C 2012_02_01 - 도달할 수 없는 코드 삭제
Post
Cancel

MISRA C 2012_02_01 - 도달할 수 없는 코드 삭제

  • MISRA C 2012_02_01 규칙을 소개한다.
  • MISRA C 2012 규칙을 분석 후 해석하여, 원본 내용과 의미가 다를 수 있습니다. 해당 부분 피드백 주시면 반영하겠습니다.

[규칙 요약(위배 원인 -> 수정 방법)]

도달할 수 없는 코드 존재
-> 도달할 수 없는 코드 삭제


[위험 요인]

1. 프로그램 논리 오류가 발생할 수 있음
2. 시스템 성능 저하
  1) 타겟 시스템 메모리 공간 사용량 증간
  2) 도달할 수 없는 코드 주변 jump instruction 실행 시간 증가
  3) 반복문에서 instruction cache 최적화 저하
 

[예외 사항]

-
 

[상세 설명]

도달할 수 없는 코드는 예외(프로그램이 개발자 의도와 다르게 수행되는 경우, 하드웨어 오류 등) 처리를 위한 방어 코드로 사용될 수 있으며, 이는 위배로 검출되지 않는다. 도달할 수 없는 코드는 컴파일러 최적화로 제거될 수 있다. 컴파일러가 switch case 문의 default 구문에 도달 불가능하다고 분석한 경우 해당 코드를 삭제할 수 있다. volatile 키워드를 사용하면 컴파일러가 default 구문을 최적화에서 제외할 수 있다.
에제)
uint16_t x;
switch (x) { // ... }
->
uint16_t x;
switch ( *( volatile uint16_t * ) &x ) { //... }
 

[비고]

* 도달할 수 없는 코드(Unreachable code): 프로그램 소스 코드의 일부지만, 절대로 실행되지 않는 코드
* 방어 코드(Defensive code): 예상하지 못한 입력에도 소프트웨어가 정상 수행하도록 대비하는 코드
전처리기 단계에서 조건부로 제거된 코드는 이후 컴파일 단게에서 존재하지 않으므로, 해당 규칙의 적용을 받지 않는다.
 

[예제 코드]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <stdio.h>
#include <stdint.h>

struct S
{
    uint32_t a : 2;
};

void foo();

void foo(struct S s)
{
    // 구조체 S의 비트 필드 a는 0 ~ 3까지의 값을 가질 수 있다.
    switch (s.a)
    {
    case 0:
        printf("0\n");
        break;
    case 1U:
        printf("1\n");
        break;
    case 2U:
        printf("2\n");
        break;
    case 3U:
        printf("3\n");
        break;
    // 위배: 도달할 수 없는 코드
    case 4U:
        printf("4\n");
        break;
    // 예외: 도달할 수 없는 코드지만, 방어 코드로 예외 가능
    default:
        printf("default\n");
        break;
    }
}

->

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <stdio.h>
#include <stdint.h>

struct S
{
    uint32_t a : 2;
};

void foo();

void foo(struct S s)
{
    // 구조체 S의 비트 필드 a는 0 ~ 3까지의 값을 가질 수 있다.
    switch (s.a)
    {
    case 0:
        printf("0\n");
        break;
    case 1U:
        printf("1\n");
        break;
    case 2U:
        printf("2\n");
        break;
    case 3U:
        printf("3\n");
        break;
    // 수정: 도달할 수 없는 코드 제거

    // 위배: 도달할 수 없는 코드지만, 방어 코드로 예외 가능
    default:
        printf("default\n");
        break;
    }
}
This post is licensed under CC BY 4.0 by the author.

MISRA C 2012_01_03 - 정의되지 않은 행동 및 지정되지 않은 행동 발생 금지

MISRA C 2012_02_02 - 불필요한 코드 삭제

Comments powered by Disqus.

Trending Tags