Software Engineering/MISRA-C

MISRA-C:2023 개요 (소프트웨어 코딩룰 준수)

habana4 2024. 8. 24. 14:52
728x90
반응형

출처: https://misra.org.uk

 

MISRA-C:2023은 임베디드 시스템을 위한 C 언어 코딩 표준의 최신 버전으로, 안전성, 보안성, 신뢰성을 개선하기 위한 규칙들을 포함하고 있습니다. 이 버전은 이전 버전(MISRA C:2012) 및 그 수정 사항들을 통합한 종합적인 업데이트이며, C 언어의 최신 버전인 C11과 C18을 지원합니다. 이 표준은 주로 자동차, 의료기기, 항공우주 등 고신뢰성 산업에서 많이 사용됩니다.



      MISRA-C 주요 특징:

      • C 언어의 최신 버전 지원: C11과 C18에서 추가된 기능에 대한 규칙이 포함되었으며, 멀티스레딩 및 원자적 연산과 같은 현대적인 프로그래밍 이슈를 해결하기 위한 규칙들이 추가되었습니다.
      • 멀티스레딩 지원: C11에서 도입된 멀티스레딩을 위한 새로운 규칙들이 추가되었으며, 이를 통해 경쟁 조건, 데드락 등의 문제를 방지할 수 있습니다.
      • 보안성 강화: 최신 버전에서는 보안성을 더욱 강화한 규칙이 포함되었습니다. 예를 들어, 외부 입력을 처리할 때 발생할 수 있는 잠재적 보안 취약점을 예방하기 위한 지침이 있습니다.
      • 220개 이상의 지침: MISRA C:2023은 총 221개의 규칙과 지침을 포함하고 있으며, 이를 통해 코드의 안전성을 높이기 위한 다양한 가이드라인을 제공합니다. 이 중 일부는 이전에 포함되지 않았던 C11과 C18의 기능을 다루고 있습니다.
      • 포인터와 메모리 관리: 포인터 연산의 안전성, 메모리 누수 방지, 그리고 동적 메모리 할당의 제한과 같은 메모리 관련 규칙들이 강화되었습니다.

      MISRA-C:2023에서 변경된 사항들:

      MISRA C:2023은 기존의 규칙 외에도 C11과 C18의 새로운 언어 기능을 반영한 규칙들을 추가했습니다. 특히 멀티스레딩을 다루는 규칙과 함께 원자적 연산에 대한 규칙이 추가되어 병렬 프로그래밍에서 발생할 수 있는 문제들을 해결하는 데 중점을 두고 있습니다. 또한 임베디드 시스템이나 실시간 시스템과 같이 오류가 치명적일 수 있는 환경에서 사용되며, 이를 통해 코드의 신뢰성을 극대화할 수 있습니다.

       

      MISRA-C를 지원하는 도구들:

      도구 기능 특징
      Polyspace
      by MathWorks
      Polyspace는 정적 분석 도구로, MISRA 규칙 위반을 찾아내고 코드의 안전성과 신뢰성을 확인합니다. 또한 코드 검증 및 인증에 많이 사용됩니다. 코드에 오류가 없는지 확인하며, MISRA 위반, 오버플로우, 메모리 접근 문제 등을 분석합니다.
      그러나 메모리 및 포인터 연산에 대한 규칙에서 일부 한계를 보일 수 있습니다. 특히 미확정 동작(Undefined behavior) 또는 실행 시 발생하는 문제에 대한 일부 규칙은 정적 분석만으로 검출하기 어렵습니다.
      LDRA
      (LDRA Testbed)
      LDRA는 정적 및 동적 분석 도구로, MISRA 규칙 준수를 위한 강력한 지원을 제공합니다. 특히 자동차 및 항공 산업에서 많이 사용됩니다. 코드 커버리지 분석, 코딩 표준 준수 확인, 그리고 MISRA 규칙 위반 사항을 보고합니다.
      그러나 LDRA는 실행 시간에 발생하는 일부 규칙(예: 런타임에서의 스택 오버플로우 또는 동적 메모리 관리와 관련된 규칙)에 대해 제한적 지원을 제공합니다.
      PC-lint Plus PC-lint Plus는 정적 코드 분석 도구로, MISRA-C 규칙을 지원하며 코드의 결함을 찾아냅니다. 여러 MISRA-C 버전을 지원하며, 코드의 가독성을 개선하고 규칙 위반 사항을 간편하게 보고합니다.
      그러나 PC-lint는 일부 복잡한 멀티스레딩 관련 규칙에서 제한을 가질 수 있습니다. 특히 스레드 간의 자원 공유 및 원자적 연산과 관련된 분석은 정적 분석 도구로 완벽히 지원되지 않을 수 있습니다.
      Helix QAC
      by Perforce
      Helix QAC는 정적 분석 도구로, C 및 C++ 코드를 분석하여 MISRA-C 규칙 준수 여부를 점검합니다. 코드 품질 개선을 위한 세부 리포트 제공, 코드 복잡성 분석 및 자동화된 규칙 검사 기능을 제공합니다.
      그러나 Helix QAC는 정적 분석 도구이기 때문에, 실행 중에 발생하는 동적 문제(예: 메모리 누수, 동적 할당 문제 등)에 대해 완벽한 검출을 할 수 없습니다.
      Parasoft C/C++
      test
      Parasoft C/C++test는 정적 분석과 동적 테스트 기능을 결합한 도구로, MISRA-C 규칙 준수 여부를 분석합니다. 코드 품질과 안전성 보장, 코드 커버리지 분석 기능을 포함하며, 다양한 MISRA-C 버전을 지원합니다.
      그러나 이 도구는 주로 코드 흐름 및 메모리 관리 규칙에서 일부 제한이 있을 수 있습니다.
      QA·C
      by PRQA (Perforce)
      QA·C는 C 언어의 MISRA 규칙을 준수하는지 분석하는 정적 분석 도구로, 코드의 잠재적 결함을 찾아내고 고품질의 안전한 소프트웨어를 작성할 수 있도록 돕습니다. 정확한 MISRA 규칙 준수 분석과 코드 복잡성 평가, 성능 문제 예측 기능을 제공합니다.
      그러나 그러나 몇 가지 규칙들은 QA·C에서도 완벽히 지원하지 않거나, 제한적으로 지원될 수 있습니다. 이러한 제한은 주로 정적 분석 도구의 특성상 발생하며, 특히 런타임 동작이나 동적 메모리 관리, 멀티스레딩 관련 규칙에서 나타납니다.
      Coverity
      by Synopsys
      Coverity는 정적 분석 도구로, C 언어 코드를 분석하여 MISRA-C 규칙 위반 사항을 자동으로 검출합니다. 대규모 코드베이스를 빠르게 분석하며, 보안 문제와 성능 문제를 동시에 점검할 수 있습니다.
      그러나 Coverity는 런타임에서 발생하는 오류를 다루는 일부 규칙을 완벽히 지원하지 않을 수 있습니다.

       

      주요 MISRA-C 룰 중 지원되지 않는 항목들:

      1. 동적 메모리 관리 규칙:

      동적 메모리 할당(malloc, free)과 같은 문제는 주로 런타임에서 발생하는 문제로, 정적 분석 도구가 이를 완벽하게 감지하지 못합니다.

      Rule 21.22: 동적 메모리 할당 및 해제를 금지하는 규칙입니다. 동적 메모리 사용 시 발생할 수 있는 메모리 누수나 할당 오류는 런타임에서 발생하므로, 정적 분석만으로는 이러한 문제를 충분히 검출할 수 없습니다.
      • Polyspace: 메모리 누수 같은 동적 문제는 정적 분석으로 검출되지 않음.
      • LDRA: 동적 메모리 할당 문제를 런타임 분석 없이 완벽히 감지하지 못함.
      • PC-lint Plus: 메모리 누수 문제는 정적 분석만으로는 완전한 분석이 어려움.

      2. 멀티스레딩 및 동기화 규칙:

      멀티스레딩 환경에서 발생하는 경쟁 조건이나 스레드 동기화 문제는 런타임에서 동적으로 발생하는 문제들입니다.

      • Rule 22.11-22.20: 멀티스레딩 환경에서의 자원 접근 및 동기화를 다루는 규칙입니다. 스레드 간의 충돌이나 경쟁 조건은 정적 분석 도구로는 완전하게 감지하기 어렵습니다.
      • Helix QAC: 멀티스레딩과 동기화 문제를 정적 분석으로 완벽히 지원하지 못함.
      • PC-lint Plus: 멀티스레딩 관련 문제를 정적 분석으로는 완전히 해결할 수 없음.
      • LDRA: 멀티스레딩 환경에서 발생하는 경쟁 조건과 동기화 문제를 감지하는 데 한계가 있음.

      3. 재귀 호출 관련 규칙:

      재귀 호출은 프로그램의 런타임 스택에 영향을 미쳐, 스택 오버플로우와 같은 문제를 일으킬 수 있습니다. 이러한 문제는 런타임에서 발생하므로 정적 분석만으로는 모든 경우를 완벽히 처리할 수 없습니다.

      • Rule 14.2: 재귀 호출을 금지하는 규칙입니다. 재귀 호출로 인해 발생할 수 있는 스택 오버플로우는 런타임에서 발생하기 때문에, 정적 분석만으로는 이를 감지하기 어렵습니다.
      • Parasoft C/C++test: 재귀 호출을 감지할 수 있으나, 스택 오버플로우 같은 런타임 문제를 완벽히 지원하지 못함.
      • Helix QAC: 재귀 호출로 인한 런타임 문제는 정적 분석만으로 감지하기 어렵습니다.
      • LDRA: 재귀 호출에 의한 스택 문제는 런타임 문제로, 정적 분석으로는 이를 완전하게 처리하지 못함.

      4. 포인터 연산 및 배열 접근 규칙:

      포인터 연산 및 배열 접근은 메모리 경계를 벗어나는 접근으로 인해 문제를 일으킬 수 있습니다. 이러한 문제는 주로 런타임에 발생하는 오류로, 정적 분석 도구로는 모든 경로를 분석하기 어렵습니다.

      • Rule 18.x: 포인터 연산 및 배열 접근에서 발생할 수 있는 오류를 다루는 규칙입니다. 메모리 경계 외 접근은 런타임에서만 정확히 감지할 수 있습니다.
      • Polyspace: 포인터 연산의 모든 가능성을 정적으로 분석하는 데 한계가 있음.
      • Helix QAC: 배열 접근과 포인터 연산 오류는 정적 분석으로 완벽하게 감지하기 어려움.
      • Parasoft C/C++test: 포인터 연산 문제는 정적 분석으로는 한계가 있음.

       

       

      MISRA Compliance 2020: 어떻게 MISRA를 준수할 수 있을까? (MISRA 준수 방법)

      1. MISRA 준수를 위한 소프트웨어 개발 프로세스: 핵심 요소와 도구 관리MISRA 규칙 준수는 안전하고 신뢰성 있는 소프트웨어를 개발하는 데 중요한 기준입니다. 소프트웨어 개발 과정에서 MISRA 규

      habana4.tistory.com

       

       

      MISRA 준수를 위한 프로세스 및 도구 체크리스트

      MISRA 준수를 달성하려면 정확한 절차와 적절한 도구를 일관되게 사용하는 것이 필수적입니다. 프로세스 및 도구 체크리스트는 이러한 과정에서 발생할 수 있는 누락을 방지하고, 각 단계가 올바

      habana4.tistory.com

       


      마치며...

      MISRA-C는 안전성과 신뢰성이 중요한 소프트웨어, 특히 임베디드 시스템에서 C 언어를 사용하는 개발자들을 위한 필수적인 규칙 집합입니다. 자동차, 항공우주, 의료기기 등 고안전성 산업에서 광범위하게 사용되며, 코드의 잠재적 오류를 줄이고 예측 가능한 동작을 보장하는 데 중점을 둡니다. MISRA-C는 주로 정적 분석 도구를 통해 규칙 준수 여부를 검증하며, Polyspace, LDRA, PC lint Plus, Helix QAC, Parasoft C/C++test와 같은 도구들이 널리 사용됩니다.

      그러나 각 도구마다 동적 메모리 관리, 멀티스레딩 및 런타임 문제에 대한 분석에는 제약이 있을 수 있어, 실제 실행 환경에서의 테스트와 병행하는 것이 권장됩니다. 이로써, MISRA-C는 시스템의 안정성과 보안성을 극대화하는 데 중요한 역할을 하고 있습니다.

       

       

      728x90
      반응형