본문 바로가기
소프트웨어 개발(SW Dev)/Rule(MISRA-C)

MISRA C:2012 - Mandatory 목록

by flowhistory 2024. 11. 26.

다음 표는 MISRA C 코딩규칙 필수(Mandatory) 규칙 목록과 설명이다.

C언어 표준 개정에 따라 MISRA C 2012 규칙도 개정(Amendment) 1,2,3,4로 반영되었다.

현재 MISRA C의 최신 표준은 MISRA-C:2023 이다.

 

* MISRA C:2012 Amendment 3 기준

* 비고 설명은 요약하여 기술

Rule
Number
Rule Definition 비고
7.5 정수 상수 매크로의 인수는 적절한 형식을 가져야 합니다. 정수 상수 매크로의 인수는 다음을 충족해야 합니다.
1.     인수(argument)는 접미사가 없는 정수(10진수, 8진수 또는 16진수) 리터럴(literal)이어야 합니다.
2.     인수(argument) 값은 사용된 매크로 이름으로 표시된 동등한 정확한 너비 유형에 대한 제한을 초과해서는 안 됩니다. 예를 들어, UINT16_C에 대한 인수는 부호 없는 16비트 값으로 표현 가능해야 합니다.
9.1 자동 기억 존속 시간(or 자동 저장 기간)을 가진 객체의 값은 설정하기 전에 읽을 수 없습니다. 이 규칙의 목적에 따라 배열 요소 또는 구조체 멤버는 개별 개체로 간주됩니다. 
12.5 sizeof 연산자에는 "array of type"으로 선언된 함수 매개변수인 피연산자가 있어서는 안 됩니다. void f( int32_t A[ 4 ] )의 함수 매개변수 A "array of type"로 선언됩니다.
 
sizeof 연산자를 사용하여 배열 A의 요소(elements) 수를 결정할 수 있습니다.
size_t arraySize = sizeof ( A ) / sizeof ( A[ 0 ] );
 
이는 A "array of type" 타입(type)을 가지므로 배열을 지정하는 식별자인 경우 예상대로 작동합니다.
포인터로 "디제너레이터(degenerate)"되지 않으며 sizeof(A)는 배열의 크기를 반환합니다.
다만, A가 함수 매개변수인 경우에는 그렇지 않습니다.
표준에서는 함수 매개변수가 "array of type" 유형을 갖지 않으며 배열로 선언된 함수 매개변수는 "pointer to type" "디제너레이터(degenerate)"될 것이라고 명시합니다.
, sizeof( A )는 배열의 크기를 반환하지 않는 sizeof( int32_t * )와 동일합니다.
13.6 sizeof 연산자의 피연산자는 잠재적인 부작용이 있는 표현식을 포함해서는 안 됩니다. sizeof 연산자의 피연산자에 나타나는 모든 표현식은 일반적으로 평가되지 않습니다.
이 규칙은 그러한 표현식의 평가가 실제로 평가되는지 여부에 관계없이 부작용을 포함하지 않도록 규정합니다.
17.3 함수는 묵시적으로 선언되어서는 안 됩니다. 프로토타입이 있는 상태에서 함수 호출이 수행되는 경우 제약 조건은 인수 수가 매개변수 수와 일치하고 각 인수가 해당 매개변수에 할당될 수 있도록 보장합니다.
17.4 void가 아닌 반환 유형을 가진 함수의 모든 종료 경로에는 표현식이 포함된 명시적인 반환 문이 있어야 합니다. return 문에 제공된 표현식은 함수가 반환하는 값을 제공합니다.
17.6 배열 매개변수 선언에는 [ ] 사이에 정적 키워드가 포함되어서는 안 됩니다. C99 언어 표준은 프로그래머가 배열 매개변수에 지정된 최소 수의 요소가 포함되어 있음을 컴파일러에 알리는 메커니즘을 제공합니다.
17.9 _Noreturn 함수 지정자로 선언된 함수는 호출자에게 반환되지 않습니다. 정의에 따라 _Noreturn 함수 지정자를 사용하면 함수가 어떤 경로를 통해서든 호출자에게 반환될 것으로 예상되지 않음을 명확하게 나타냅니다.
그러한 함수에서 반환되는 것은 프로그램의 제어 흐름에 오류가 있음을 나타내며, 그 결과 정의되지 않은 동작이 발생합니다.
 
_Noreturn 키워드는 C11에 도입되었습니다.
컴파일러가 적용되는 함수가 호출자에게 반환되지 않는다는 것을 컴파일러에 알립니다.
그러면 컴파일러는 _Noreturn 함수 호출 후의 코드에 접근할 수 없다는 사실을 인식합니다.
19.1 객체는 겹치는 객체에 할당되거나 복사될 수 없습니다. 메모리에 일부 겹치는 두 개체가 생성되고 하나가 다른 개체에 할당되거나 복사되면 동작이 정의되지 않습니다.
 
21.13 <ctype.h>의 함수에 전달된 모든 값은 unsigned char로 표현되거나 EOF 값이 되어야 합니다. <ctype.h>의 관련 함수는 예상 값이 unsigned char범위에 있거나 EOF에 해당하는 음수 값인 int 인수를 취하도록 정의됩니다.
다른 값을 사용하면 정의되지 않은 동작이 발생합니다.
21.17 <string.h>의 문자열 처리 함수를 사용하면 해당 포인터 매개변수(pointer parameter)에 의해 참조되는 개체의 경계를 넘어서는 액세스(access)가 발생해서는 안 됩니다. <string.h>의 관련 문자열 처리 함수는 다음과 같습니다.
strcat, strchr, strcmp, strcoll, strcpy, strcspn, strlen, strpbrk, strrchr, strspn, strstr, strtok
 
위에 나열된 함수를 잘못 사용하면 매개변수로 전달된 객체의 범위를 넘어서는 읽기 또는 쓰기 액세스가 발생하여 정의되지 않은 동작이 발생할 수 있습니다.
21.18 <string.h>의 함수에 전달된 size_t 인수(argument)는 적절한 값을 가져야 합니다. <string.h>의 관련 함수는 다음과 같습니다.
memchr, memcmp, memcpy, memmove, memset, strncat, strncmp, strncpy, strxfrm
 
위에 나열된 함수를 잘못 사용하면 매개변수로 전달된 객체의 범위를 넘어서는 읽기 또는 쓰기 액세스가 발생하여 정의되지 않은 동작이 발생할 수 있습니다.
21.19 표준 라이브러리 함수 localeconv, getenv, setlocale 또는 strerror에 의해 반환된 포인터는 const 한정 유형에 대한 포인터가 있는 것처럼 사용됩니다. localeconv 함수는 struct lconv * 유형의 포인터를 반환합니다.
이 포인터는 const struct lconv * 유형을 가진 것처럼 간주됩니다.
struct lconv 객체에는 char * 유형의 포인터가 포함되어 있으며 getenv, setlocale strerror 함수는 각각 char * 유형의 포인터를 반환합니다.
이러한 포인터는 문자열(char 유형의 null로 끝나는 배열)에 액세스하는 데 사용됩니다.
이 규칙의 목적에 따라 이러한 포인터는 const char * 유형을 가진 것으로 간주됩니다.
21.20 표준 라이브러리 함수 asctime, ctime, gmtime, localtime, localeconv, getenv, setlocale 또는 strerror에 의해 반환된 포인터는 동일한 함수에 대한 후속 호출 후에 사용되지 않습니다. setlocale을 호출하면 이전에 localeconv에서 반환된 포인터를 통해 액세스할 수 있는 값이 변경될 수 있습니다.
따라서 이 규칙의 목적에 따라 setlocale localeconv 함수는 동일한 함수인 것처럼 처리됩니다.
 
표준 라이브러리 함수 asctime, ctime, gmtime, localtime, localeconv, getenv, setlocale strerror는 표준 라이브러리 내의 개체에 대한 포인터를 반환합니다.
21.22 <tgmath.h>에 선언된 모든 유형 일반 매크로에 대한 모든 피연산자 인수는 적절한 필수 유형을 가져야 합니다. <tgmath.h>에 정의된 유형 일반 매크로에 전달된 피연산자 인수는 본질적으로 부호 있는, 본질적으로 부호 없는 또는 본질적으로 부동(본질적으로 실수 부동 또는 본질적으로 복잡한 부동) 유형을 가져야 합니다.
22.2 메모리 블록은 표준 라이브러리 함수를 통해 할당된 경우에만 해제됩니다. 할당되지 않은 메모리를 해제하거나 동일한 할당 메모리를 두 번 이상 해제하면 정의되지 않은 동작이 발생합니다.
22.4 읽기 전용으로 열린 스트림에 쓰기를 시도하면 안 됩니다. 표준은 읽기 전용 스트림에 쓰려고 시도하는 경우의 동작을 지정하지 않습니다.
이러한 이유로 읽기 전용 스트림에 쓰는 것은 안전하지 않은 것으로 간주됩니다.
22.5 FILE 객체에 대한 포인터는 역참조(dereference) 되지 않습니다. FILE 객체에 대한 포인터는 직접적으로나 간접적으로(: memcpy 또는 memcmp 호출을 통해) 역참조될 수 없습니다.
22.6 FILE에 대한 포인터 값은 연관된 포인터 이후에 사용되어서는 안 됩니다. 표준에서는 스트림에 대한 닫기 작업 후에 FILE 포인터의 값이 불확실하다고 명시합니다.

 

 

 

 

 

 

728x90

댓글