코드 품질, 프로그래밍, 디버깅, Embedded DevOps

언어 전환 없이 메모리 안전 C/C++ 개발 지원

<span id="hs_cos_wrapper_name" class="hs_cos_wrapper hs_cos_wrapper_meta_field hs_cos_wrapper_type_text" style="" data-hs-cos-general-type="meta_field" data-hs-cos-type="text" >언어 전환 없이 메모리 안전 C/C++ 개발 지원</span>

최근 업계에서는 특히 제품의 보안 및 안전과 관련하여 임베디드 공간에서 메모리 안전 언어 및 개발의 가치에 대해 많은 논의가 이루어지고 있습니다.

메모리 안전성이 부족하면 제품에 보안 취약점이 발생하여 제품의 안전과 보안이 모두 위험해질 수 있습니다.

수년 동안 많은 임베디드 팀과 함께 일해 온 저는 이러한 문제가 실제 프로젝트에서 어떻게 나타나는지 직접 목격했습니다. 그래서 저는 IAR 플랫폼에 내장된 런타임 코드 검사기를 사용하여 C 및 C++ 코드에서 메모리 안전 문제를 발견하여 전통적으로 메모리 안전하지 않은 언어를 훨씬 더 안전하게 작업할 수 있는 방법을 공유하고 싶었습니다.

메모리 안전성이란 무엇인가요?

메모리 안전성은 일반적으로 두 가지 범주로 나뉩니다:

  • 공간 메모리 안전: 건드려서는 안 되는 메모리 공간을 읽거나 쓰는 연산을 만들 수 있나요?
  • 시간적 메모리 안전: 일시적인 메모리 사용이 전체 메모리 관리에 안전하지 않은 방식으로 영향을 미치는가?

C 언어에서 첫 번째 문제는 특정 크기의 배열을 선언한 다음 배열의 범위를 벗어난 요소에 액세스할 때 발생할 수 있으며, 이는 C와 C++에서는 완전히 합법적입니다.

두 번째 문제는 힙 메모리 할당과 관련된 것으로, 일반적으로 malloc() 및 free() 쌍 호출을 사용하여 수행됩니다. 할당된 블록을 해제하지 않고 너무 많은 malloc() 호출을 수행하면 메모리 누수가 발생하거나 힙을 벗어난 액세스가 전역 변수와 같은 다른 메모리를 덮어쓰는 상황이 쉽게 발생할 수 있습니다.

C++는 일부 경우에 자동 처리를 제공하지만, 여전히 수동으로 메모리를 할당할 수 있어 동일한 종류의 위험에 노출될 수 있습니다.

이러한 동작을 어떻게 확인할 수 있나요?

바로 이 부분에서 IAR 임베디드 워크벤치 및 광범위한 IAR 플랫폼의 역할이 중요합니다.


이 도구는 메모리 배열의 범위를 벗어난 연산 트래핑과 힙 오버플로우를 비롯한 여러 가지 위험한 동작을 검사하여 실시간 디버그 중에 C 또는 C++ 코드 메모리를 안전하게 만드는 데 도움이 되는 이상적인 솔루션으로, 런타임 코드 검사기를 제공합니다.

C-RUN의 설정 화면은 라이브 디버그 세션에서 수행할 수 있는 다양한 검사를 보여주며, 완전히 통합된 IAR 플랫폼 환경의 일부인 단일 인터페이스 내에서 모두 설정할 수 있습니다.

C-RUN picture 1

이 그래픽은 모든 옵션이 활성화된 프로젝트 옵션에서 C-RUN의 설정을 보여줍니다.
강조 표시된 상자는 C-RUN이 활성화되어 있고 힙 사용량과 배열 경계 검사가 모두 켜져 있음을 나타냅니다.
이 설정은 C 및 C++ 코드에서 가장 일반적인 메모리 안전 오류의 두 가지 원인을 실시간으로 검사할 수 있도록 합니다.

또한 C-RUN은 설정 창의 오른쪽에서 산술 오류 조건을 확인할 수 있습니다. 이러한 검사는 코드 무결성을 검증하는 데도 유용하지만 이 설명에서는 다루지 않겠습니다.

실시간 디버그 결과

IAR C-SPY 디버거 내에서 실행할 때, C-RUN으로 계측된 코드는 메모리 누수 조건과 배열 범위 외 액세스가 실행되어 시스템 동작에 영향을 미칠 수 있는 기회를 갖기 전에 이를 모두 포착할 수 있습니다.

C-RUN picture 2

예를 들어, 프로그램에서 각 요소에 인덱스 값이 미리 로드된 100개의 값으로 구성된 배열을 만들 수 있습니다.
이 경우 터미널 I/O 창은 사용자에게 배열 인덱스로 사용할 100보다 작은 값을 입력하라고 지시합니다.

사용자가 102 값을 입력하면 프로그램은 정의된 범위를 벗어나 배열에 액세스를 시도합니다.
이 경우 디버거는 작업이 수행되기전에문제가 되는 줄에서 실행을 중단하고 발견한 내용을 설명하는 자세한 메시지를 C-RUN 메시지 창에 표시합니다.

C-RUN picture 3a

구체적으로, 디버거는 요소 0~99만 있는 배열의 요소 102에 대한 범위를 벗어난 배열 액세스를 수행하려는 코드 줄에서 멈춥니다.

C-RUN picture 3b

C-RUN 메시지 창에서 오류가 main.c 소스 파일의 21번째 줄에서 발생했음을 명시적으로 표시하고 8번째 줄의 배열 선언을 다시 가리킵니다( ).

C-RUN picture 4

코드가 계속 실행되면 시스템이 즉시 충돌하지는 않지만 인덱스 102의 배열이 잘못된 값 134229899 을 반환하게 됩니다.

C-RUN picture 5

또한 C-RUN은 힙 할당에 대해서도 보고합니다. 예를 들어 힙 공간이 0x2000 바이트로 설정되어 있고 루프가 각 malloc() 호출마다 0x800 바이트를 할당하는 경우, C-RUN은 6228 바이트가 할당된 후 네 번째 malloc() 작업을 트래핑하여 힙이 오버플로되지 않도록 합니다.
이렇게 하면 메모리 블록이 힙이 아닌 메모리에 액세스하는 포인터를 반환하는 안전하지 않은 동작을 피할 수 있습니다.

실시간 디버깅에서 자동화까지: 메모리 안전 검사 확장

C-RUN을 사용한 실시간 디버깅은 개발 중오류를 포착하는 데 매우 효과적이지만 , 오늘날의 빠르게 진행되는 임베디드 프로젝트에서는 더 많은 것을 요구합니다. 팀은 더 이상 하나의 제품 변형이나 하나의 테스트 설정만 다루는 것이 아니라 여러 소프트웨어 버전, 하드웨어 구성 및 릴리스 브랜치를 촉박한 마감일 안에 처리해야 합니다.

바로 이 지점에서 자동화가 필수적입니다.

모든 빌드와 모든 대상에서 메모리 안전성을 수동으로 확인하는 것은 더 이상 확장성이 없습니다. 지속적 배포의 요구 사항을 충족하기 위해 팀은 CI/CD 워크플로우의 일부로 메모리 안전성 검사를 자동화해야 하며, 바로 이 부분에서 C-RUN의 잠재력을 최대한 발휘할 수 있습니다.

C-RUN을 통한 CI/CD 워크플로 자동화 지원

최신 임베디드 개발은 더 이상 수동 디버깅 세션에 국한되지 않습니다. 빠르게 변화하는 릴리스 주기를 따라잡고 대규모로 제품 품질을 보장하려면 팀에 자동화가 필요하며 C-RUN은 이를 위해 만들어졌습니다.

C-RUN은 일괄 모드에서 IAR C-SPY 디버거 내에서 실행하여 자동화된 테스트 파이프라인에 원활하게 통합됩니다.
이를 통해 다음을 수행할 수 있습니다:

  • 사전 정의된 규칙 및 설정을 빌드 전체에 자동으로 적용
  • 중앙 집중식 추적을 위해 로그 파일 또는 외부 보고 도구로 출력 리디렉션
  • 메모리 안전 검사를 지속적 통합(CI) 파이프라인에 직접 통합할 수 있습니다.

C-RUN picture 6

이를 통해 C-RUN은 확장 가능한 테스트를 지원하여 모든 버전 또는 구성에 걸쳐 모든 소프트웨어 변경 사항이 프로덕션에 적용되기 전에 메모리 안전성을 검증할 수 있도록 보장합니다.

오늘날 팀이 C와 C++를 더 안전하게 만드는 데 방해가 되는 요소는 무엇일까요?

이 예는 전체 IAR 플랫폼의 일부로 제공되는 C-RUN 런타임 코드 검사기가 안전하지 않은 메모리 연산에서 C 및 C++ 코드를 효과적으로 정리하는 방법을 보여줍니다.

이 통합 접근 방식을 사용하면 팀은 다른 문제를 야기하거나 기존 개발 주기를 방해할 수 있는 "메모리 안전" 언어로 전환할 필요가 없습니다.

C-RUN은 10년 넘게 IAR 툴체인의 일부로 사용되어 왔으며, 팀이 익숙한 C 및 C++ 환경을 사용하여 메모리 안전 코드를 생성할 수 있도록 지원하는 입증되고 신뢰할 수 있는 방법입니다.

임베디드 개발자에게 중요한 것은 개별 도구가 아니라 개발자의 워크스테이션부터 자동화된 CI/CD 파이프라인에 이르기까지 전체 개발 프로세스에서 안전, 보안 및 코드 품질을 개선하기 위해 모든 것을 하나로 통합하는 포괄적인 플랫폼을 갖추는 것입니다.

C/C++에서 메모리 안전 문제를 해결할 준비가 되셨나요?

버퍼 오버플로 또는 힙 오용과 같은 메모리 문제로 인해 팀의 속도가 느려지거나 안전 및 보안 위험이 발생한다면, 문제를 해결하기 위해 언어를 전환할 필요가 없습니다.

실제 사례를 보고 싶으신가요? 온디맨드 웨비나 'DevOps 팀 없이 살아남기'를 시청하세요 :임베디드 팀을 위한 CI/CD, 디버깅 및 컨테이너에서 런타임 검사, 자동화 및 최신 워크플로를 통해 소규모 팀도 더 안전한 임베디드 소프트웨어를 제공하는 데 어떻게 도움이 되는지 알아보세요.

확장 가능한 DevSecOps 접근 방식을 찾고 계신가요? CI/CD 병목 현상 해결하기를확인하세요 :컨테이너 및 자동화를 통한 임베디드 DevSecOps 확장, 에서 C-RUN을 자동화된 테스트 워크플로에 통합하는 방법을 알아보세요.