CH13. 소프트웨어 구현(코딩 규칙)

김유찬·2023년 6월 14일
0

소프트웨어 공학

목록 보기
12/12
post-thumbnail

■ MISRA-C 코딩 규칙

■ C 표준 환경(규칙 1)

● 규칙 1.1(Required)

  • 프로그램은 C 표준과 사용하는 컴파일러의 번역 제한을 준수

● 규칙1.2(Advisory)

  • 언어 확장 사용 x

● 규칙1.3(Required)

  • 정의되지 않거나 명시되지 않은 행동 x
    ex)
  • 모든 구조체와 union 타입이 완전 한지 검사
  • 함수 매크로 사용시 파라미터와 인자의 개수가 일치하는지 여부 검사
  • #if defined 이후에 identifier, (identifier)의 형태만 사용 가능
  • #if, #elif 이후에 매크로 확장에 의한 defined가 사용 금지
  • 특정 매크로 사용 금지(offsetof)

■ 사용되지 않는 코드(규칙 2)

● 규칙 2.1(Required)

  • 도달할 수 없는 코드가 있으면 안됨

● 규칙 2.2(Required)

  • 죽은 코드가 없어야 함
    -실행 가능하지만 제거하더라도 프로그램의 동작에 영향을 주지 않는 모든 연산
    -프로그램 로직에 오류가 존재할 가능성을 암시
  • 언어 확장에 의한 연산은 항상 프로그램 동작에 영향이 ㅇ있다고 가정하므로 규칙 미위배
  • void로의 변환은 의도적으로 사용되지 않는 값을 기리키므로 규칙 미위배

● 규칙 2.3(Advisory)

  • 사용되지 않은 타입 선언은 없어야 함

● 규칙 2.4(Advisory)

  • 사용되지 않은 tag(struct, union, enum) 선언은 없어야 함

● 규칙 2.5(Advisory)

  • 사용되지 않은 매크로 선언은 없어야 함

● 규칙 2.6(Advisory)

  • 함수 내에 사용되지 않은 레이블 선언은 없어야 함

● 규칙 2.7(Advisory)

  • 함수에서 사용되지 않은 파라미터는 없어야 함

■ 주석(규칙 3)

● 규칙 3.1(Required)

  • 문자열 /*와 //는 주석 안에서 사용하지 말아야 함

● 규칙 3.2(Required)

  • 행 접합은 // 주석 안에서 사용하면 안됨
    -// 주석을 포함하는 소스라인이 \ 문자로 끝나는 것

■ 글자 및 어휘 협약(규칙 4)

● 규칙 4.1(Required)

  • 8진수, 16진수 escape 시퀀스에 다른 escape 시퀀스 외에는 붙이면 안됨
    -8,16 진수 escape 시퀀스 뒤에 다른 문자열이 붙으면 혼동 야기
    -escape 시퀀스끼리만 붙여 사용

● 규칙 4.2(Advisory)

  • Trigraph는 사용하면 안됨
    -두 개의 물음표 뒤에 문자가 하나 더 붙어서 생성

■ 식별자(규칙 5)

● 규칙 5.1(Required)

  • 외부 식별자는 구별되어야 함
    -대부분 컴파일러들은 외부 식별자 구분을 최소 31자 이상, 대소문자 구분하여 비교했을 때 구별될 경우로 이해

● 규칙 5.2(Required)

  • 같은 scope 혹은 name space에 선언된 식별자는 구별되어야 함
    -두 식별자가 중요 문자 안에서 차이가 없을 경우, 정의하지 않은 행동 야기

● 규칙 5.3(Required)

  • 안쪽 scope의 식별자를 바깥 scope의 식별자가 가리면 안됨

● 규칙 5.4(Required)

  • 매크로의 식별자는 구별되어야 함

● 규칙 5.5(Required)

  • 식별자는 매크로 이름과 구별되어야 함
    -매크로 정의 시, 그 이름이 다른 정의된 매크로 혹인 자신의 파라미터 이름들과 구별 필요
    -하나의 함수형 매크로에서 파라미터 이름들끼리의 구별 필요

● 규칙 5.6(Required)

  • typedef 이름은 유일한 식별자여야 함
    -이름으로 타입을 정의하고, 그 헤더 파일을 여러 파일에서 include 해서 사용할 경우는 제외
    -typedef struct list {…};처럼 tag 선언 시 동일한 이름으로 typedef하는 경우는 제외

● 규칙 5.7(Required)

  • tag(struct, union, enum) 이름은 유일한 식별자여야 함

    -typedef struct list {…};처럼 tag 선언 시 동일한 이름으로 typedef하는 경우는 제외

● 규칙 5.8(Required)

  • 외부 연결을 갖는 식별자는 어떤 name space나 translation unit에서도 다른 목적 사용 금지(extern)

● 규칙 5.9(Advisory)

  • 내부 연결을 갖는 변수나 함수 식별자는 유일해야 함(static)

■ 타입(규칙 6)

● 규칙 6.1(Required)

  • bit-field는 올바른 타입으로 선언되어야 함
    -bit-field 타입의 기본 타입이 signed int 혹은 unsigned int이어야 함

● 규칙 6.2(Required)

  • single-bit로 표현된 이름 있는 bit-field는 singed면 안됨

■ 리터럴 및 상수(규칙 7)

● 규칙 7.1(Required)

  • 8진수 상수는 사용하면 안됨

● 규칙 7.2(Required)

  • unsigned integer 상수에는 접미사 u나 U를 붙여야 함

● 규칙 7.3(Required)

  • 소문자 접미사 l은 사용하면 안 됨

● 규칙 7.4(Required)

  • 문자열을 const char* 타입이 아닌 객체에 할당하면 안 됨

■ 선언 및 정의(규칙 8)

● 규칙 8.1(Required)

  • 타입은 명시적으로 입력해야 함

● 규칙 8.2(Required)

  • 함수는 이름 있는 파라미터로 구성된 프로토타입 형태여야 함

● 규칙 8.3(Required)

  • 동일한 객체 또는 함수의 모든 선언은 같은 이름과 타입 한정자를 사용해야 함
    -함수의 선언과 정의에서 리턴 타입과 파라미터의 타입이 일치하는지 검사 (alias 허용: OFF)
    -함수의 선언마다 반환 타입이 호환되는지 검사 (alias 허용: ON)
    -함수의 선언마다 타입이 호환되는지 검사 (alias 허용: ON)

● 규칙 8.4(Required)

  • 객체나 함수의 정의 또는 호출 이전에 호환가능한 선언이 존재해야 함
    -함수의 선언과 정의에서 리턴 타입과 파라미터의 타입이 일치하는지 검사 (alias 허용: OFF)

● 규칙 8.5(Required)

  • 외부 연결을 갖는 객체나 함수는 오직 하나의 파일에서만 선언되어야 함
    -외부 함수를 여러 파일에 중복 선언 금지 (한 파일 내의 중복 선언은 허용함)

● 규칙 8.6(Required)

  • 외부 연결 식별자는 하나의 외부 정의를 가져야 함
    -외부 연결을 가지는 함수의 정의 존재 검사

● 규칙 8.7(Advisory)

  • 함수나 객체가 하나의 번역 단위에서 참조된다면 외부 참조로 정의되면 안 됨

● 규칙 8.8(Required)

  • 내부 연결을 갖는 모든 객체 또는 함수는 static을 이용해야 함

● 규칙 8.9(Required)

  • 단일 함수에만 쓰이는 객체는 해당 블록 범위에서 정의되어야 함

● 규칙 8.10(Required)

  • 인라인 함수는 static으로 정의되어야 함

● 규칙 8.11(Advisory)

  • 배열에 대한 외부 연결 선언 시, 그 크기를 명시적으로 해야 함

● 규칙 8.12(Required)

  • 열거자 리스트 내에서 묵시적으로 지정된 열거형 상수의 값은 유일해야 함

● 규칙 8.13(Advisory)

  • 가능하다면 포인터는 const로 한정된 타입을 가리켜야 함

● 규칙 8.14(Required)

  • restrict는 사용 금지

■ 초기화(규칙 9)

■ Essential 타입(규칙 10)

■ 포인터 타입 변환(규칙 11)

■ 표현식(규칙 12)

■ Side Effect(규칙 13)

■ 제어문 표현식(규칙 14)

■ 제어 흐름(규칙 15)

■ Switch문(규칙 16)

■ 함수(규칙 17)

■ 포인터와 배열(규칙 18)

■ 오버랩 저장(규칙 19)

■ 전처리 지시자(규칙 20)

■ 라이브러리(규칙 21)

■ 리소스(규칙 22)

profile
eukddan

0개의 댓글