- MISRA C 2012_01_01 규칙을 소개한다.
- MISRA C 2012 규칙을 분석 후 해석하여, 원본 내용과 의미가 다를 수 있습니다. 해당 부분 피드백 주시면 반영하겠습니다.
[규칙 요약(위배 원인 -> 수정 방법)]
[위험 요인]
프로그램이 개발자 의도와 다르게 컴파일될 수 있음
[예외 사항]
-
[상세 설명]
1. C90 또는 C99 표준에 명시된 C언어 특성과 라이브러리만 사용하며, 문법 및 제한사항 위배 금지
C언어 표준과 해당 규칙에서는 컴파일러가 언어 확장 제공을 허용한다.
대부분의 임베디드 컴파일러는 하드웨어에 의존적인 코드를 효율적으로 개발하기 위한 언어 확장을 제공하며, 언어 확장은 표준에서 명시하지 않는 추가적인 특성들인 경우가 많다.
예시) C90 표준에서는 inline 키워드를 지원하지 않지만, 일부 C90 컴파일러는 inline 키워드를 지원한다. 또한 변수 타입의 메모리 영역을 한정하는 __near와 __far와 같은 키워드를 제공한다.
2. 프로그램은 컴파일러 번역 제한 초과 금지
만약 번역 제한을 초과한 경우, 컴파일 오류는 아니지만 경고가 출력될 수 있다. 해당 경우 컴파일하면 실행 파일이 생성되지만, 프로그램이 개발자 의도와 다르게 실행될 수 있다.
C99 표준, C11 표준에서 명시하는 번역 제한은 다음과 같다.
- 문장 블록 중첩 수: 127
- #if...#else 중첩 수: 63
- 하나의 선언에서 포인터, 배열, 함수 선언 조합 수: 12
- 하나의 선언에서 괄호 선언 중첩 수: 63
- 하나의 수식에서 괄호 수식 중첩 수: 63
- 내부 식별자 혹은 매크로 이름의 significant character 수: 63
- 외부 식별자의 significant character 수: 31
- 하나의 번역 단위에서 외부 식별자 수: 4095
- 하나의 문장 블록에서 선언되는 식별자 수: 511
- 하나의 번역 단위에서 정의되는 매크로 식별자 수: 4095
- 하나의 함수 정의에서 매개변수 수: 127
- 하나의 함수 호출에서 인자 수: 127
- 하나의 매크로 정의에서 매개변수 수: 127
- 하나의 매크로 호출에서 인자 수: 127
- 하나의 논리적 코드 라인에 문자 수: 4095
- 하나의 문자열 상수에 문자 수: 4095
- 객체 바이트 크기(호스트 환경에서만 유효): 65535
- #include 중첩 수: 15
- 하나의 switch 문에서 case 수: 1023
- 하나의 구조체, 공용체에서 필드 수: 1023
- 하나의 열거형에서 열거자 수: 1023
- 하나의 구조체 선언에서 struct, unit 정의 중첩 수: 63
[비고]
ISO/IEC 9899:201x: 5.2.4.1 Translation limits
[원문]
-
Comments powered by Disqus.