Home MISRA C 2012_05_08, 09 외부 및 내부 연결을 가지는 변수와 함수 식별자는 유일해야 한다.
Post
Cancel

MISRA C 2012_05_08, 09 외부 및 내부 연결을 가지는 변수와 함수 식별자는 유일해야 한다.

  • 본 글에서는 MISRA C 2012_05_08, 09 규칙을 소개한다.

  • 외부 및 내부 연결을 가지는 식별자들은 모든 translation unit들에서 유일해야 한다.
  • 외부 연결이 없는 지역 변수는 혼동 위험이 적으므로 유일하지 않아도 된다.
  • 내부 연결을 가지는 식별자들은 연결이 없는 지역 변수 식별자들과도 유일해야 한다.

외부 연결: 모든 translation unit에서 식별자를 사용할 수 있다.

  • 일반 전역 변수
  • 일반 전역 상수(C 파일만 가능)
  • 일반 함수

내부 연결: 현재 translation unit 내에서만 식별자를 사용할 수 있다.

  • 정적 전역 변수
  • 정적 전역 상수
  • 정적 함수
  • 매크로
  • 인라인 함수

출처: http://blog.naver.com/netrance/110141116927


  • 다음은 MISRA_C_2012_05_08 ‘외부 연결을 가지는 변수와 함수 식별자는 유일해야 한다.’ 규칙을 위배하는 예제 코드다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<file1.c>

#include <stdint.h>

const int32_t COUNT; /* 외부 연결 O */

int32_t count; /* 외부 연결 O */

void foo(void) /* 외부 연결 O */
{
       	int16_t index; /* 외부 연결 X */
}


/* file2.c */
#include <stdint.h>

const int32_t COUNT; /* 외부 연결 O, 다른 파일 내 상수와 충돌함 */

static void foo(void) /* 내부 연결 O, 다른 파일 내 함수와 충돌함 */
{
       	int16_t count; /* 외부 연결 X, 다른 파일 내의 변수와 충돌함 */
       	int32_t index; /* 외부 연결 X */
}


  • 다음은 MISRA_C_2012_05_08 ‘외부 연결을 가지는 변수와 함수 식별자는 유일해야 한다.’ 규칙을 위배하지 않는 예제 코드다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<file1.c>
#include <stdint.h>

const int32_t COUNT; /* 외부 연결 O */

int32_t count; /* 외부 연결 O */

void foo(void) /* 외부 연결 O */
{
       	int16_t index; /* 외부 연결 X */
}


/* file2.c */
#include <stdint.h>

const int32_t COUNT2;

static void foo2(void)
{
       	int16_t count2;
       	int32_t index;
}


  • 내부 연결을 가지는 inline 함수는 하나의 헤더 파일에서 정의해서 여러 translation unit에 include하여 사용하는 것은 허용된다. inline 함수는 외부 연결이 불가능하고 내부 연결 만을 허용한다.
  • 다음은 MISRA_C_2012_05_09 ‘내부 연결을 가지는 변수와 함수 식별자는 유일해야 한다.’ 규칙의 예외사항 예제 코드다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<header.h>

inline int add_inline(int a, int b)
{
       	return a + b;
}


/* File: file1.c */
#include <stdio.h>
#include "header.h"

int main() {
       	printf("add_inline: %d\n", add_inline(100, 100));

       	return 0;
}


  • 다음은 MISRA_C_2012_05_09 ‘내부 연결을 가지는 변수와 함수 식별자는 유일해야 한다.’ 규칙을 위배하는 예제 코드다.
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
<file1.c>

#include <stdint.h>

#define NUM 0 /* 내부 연결 O */

static const int32_t COUNT; /* 내부 연결 O */

static int32_t count; /* 내부 연결 O */

static void foo(void) /* 내부 연결 O */
{
       	int16_t count; /* 내부 연결 X, 파일 내 변수와 충돌함 */
       	int16_t index; /* 내부 연결 X */
}

void bar1(void)
{
       	static int16_t count; /* 내부 연결 O, 파일 내 변수와 충돌함 */
       	int16_t index; /* 유일하지 않지만, 연결이 없음 */
       	foo();
}

inline void var1(void) /* 내부 연결 O */
{
       	int16_t index;
       	int32_t num;
}


/* file2.c */
#include <stdint.h>

#define NUM 0 /* 내부 연결 O, 다른 파일의 변수와 충돌 */

static const int32_t COUNT; /* 내부 연결 O, 다른 파일의 상수와 충돌함 */

static int8_t count; /* 내부 연결 O, 다른 파일의 변수와 충돌함 */

static void foo(void) /* 내부 연결 O, 다른 파일의 함수와 충돌함 */
{
       	int32_t index; /* index와 nbytes 변수들은 유일하지 않지만 연결되지 않음 */
       	int16_t nbytes;
}

void bar2(void)
{
       	static uint8_t nbytes; /* 유일하지 않지만 같은 파일 내에 연결이 없음 */
}

inline void var1(void) /* 내부 연결 O, 다른 파일의 변수와 충돌 */
{
       	int16_t index;
       	int32_t num;
}


  • 다음은 MISRA_C_2012_05_09 ‘내부 연결을 가지는 변수와 함수 식별자는 유일해야 한다.’ 규칙을 위배하지 않는 예제 코드다.
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
<file1.c>

#include <stdint.h>

#define NUM 0 /* 내부 연결 O */

static const int32_t COUNT; /* 내부 연결 O */

static int32_t count; /* 내부 연결 O */

static void foo(void) /* 내부 연결 O */
{
       	int16_t count2; /* 내부 연결 X */
       	int16_t index; /* 내부 연결 X */
}

void bar1(void)
{
       	static int16_t count3; /* 내부 연결 O */
       	int16_t index; /* 유일하지 않지만, 연결이 없음 */
       	foo();
}

inline void var1(void) /* 내부 연결 O */
{
       	int16_t index;
       	int32_t num;
}


/* file2.c */
#include <stdint.h>

#define NUM2 0 /* 내부 연결 O */

static const int32_t COUNT2; /* 내부 연결 O */

static int8_t count4; /* 내부 연결 O */

static void foo2(void) /* 내부 연결 O */
{
       	int32_t index; /* index와 nbytes 변수들은 유일하지 않지만 연결되지 않음 */
       	int16_t nbytes;
}

void bar2(void)
{
       	static uint8_t nbytes; /* 유일하지 않지만 같은 파일 내에 연결이 없음 */
}

inline void var2(void) /* 내부 연결 O */
{
       	int16_t index;
       	int32_t num;
}
This post is licensed under CC BY 4.0 by the author.

선언(declartion)과 정의(definition)의 차이

CWE(Common Weakness Enumeration) 개요

Comments powered by Disqus.

Trending Tags