CppCon 2021 - Misra Parallelism Safety-critical Guidelines for C++11, 17, Then C++20,
영상
MISRA와 C++ Core guidelines의 현재 상태
안전한 프로그래밍이 필요한 곳들은 어디인가? 과거에는 군사용 프로그램들이였지만, 최근에는 로보틱스와 자율주행 프로그램들에서도 필요하게 되었다. 윤리적으로, 기능상의 안전으로, 인공지능의 안전으로… 등등 여러가지 ‘안전한 프로그램’을 만드는 시도가 있다. 이 중에서는 ‘안전한 C++ 프로그램을 만들기‘도 포함된다.
이러한 움직임의 최상단에는 United Nations of Economics Commissions for Europe (UNECE)가 있는데, 이 기관에서 정하는 WP 29 사이버 보안 규제를 통해 아랫단에 위치한 RISC-V, ISO, MISRA 기구들에서 안전 기능을 추가하게 한다. 각각의 기구들은 담당하는 기술 분야에서 사용하는 API들에 적용되는 안전 기능 및 요구사항들을 개발한다. 이러한 요구사항들은 오토체커와 같은 도구를 사용해 컴퓨터가 확인할 수도 있고, 사람이 직접 확인해야 하는 부분들도 있다.
C++ 업계에서 가장 많이 사용되는 안전한 가이드라인은 2개이다.
- JSF: Joint Strike Fighter Air Vehicle C++ Standards for the System Developments and Demonstration Program 2005
- MISRA C++: 2008 Guidelines for the use of the C++ language in critical systems, The Motor Industry Software Reliability Association, 2008.
위 두개의 가이드라인의 특징이라면, 너무 오래전에 만들어져서 모던 C++이 적용되어있지 않다는 것이다. 하지만 사용하고 있는 시스템들이 많아서 그런지 많이들 사용한다. 특히, MISRA C++는 자동차 시스템 개발을 목적으로 만들어졌음에도, 현재 많은 ‘안전한 프로그래밍’이 필요한 분야 (e.g. 드론, 수술로봇) 등에서도 사용된다.
물론 다른 가이드라인들도 있다. C++11,14,17,20을 타겟팅하는 가이드라인들도 있으나, 이러한 가이드라인 중 완벽하게 ‘안전한 프로그래밍’을 지향하는 가이드라인은 없다. AUTOSAR와 같이 C++14에서 안전한 프로래밍을 만들려고 했던 시도도 있으나, 대부분의 아이디어는 MISRA에서 시작한 아이디어들이다. 이 중 가장 유명한 AUTOSAR는 개발이 중단되었고, 현재까지 만들어진 부분은 MISRA의 새로운 모던 가이드라인 개발 파이프라인에 녹아들게 되었다. 아래 이미지는 AUTOSAR와 비교했을 때, MISRA와 C++ core guideline이 얼마나 비슷한지 보여주는 표이다. MISRA와 AUTOSAR는 거의 비슷하다.
C++ Coding guideline
Safety와는 별개로, 가장 유명한 C++ 가이드라인은 C++ 코딩 가이드라인이다.
Bjarne Stroustroup의 토크를 보면, C++ CG가 추구하는 방향은 1. 버그가 없는 코드를 작성하는 방법, 2. 좋은 성능을 보여주는 방법, 3. 보기 좋은 코드를 작성하는 방법 이 잘 아우러지는 가이드라인을 만드는 것이다.
이러한 코드를 만들기 위해 C++ CG는 Meta rule (i.e. 확인은 할 수 없지만 가이드를 주는 룰)과 checkable rules (i.e. 달성/미달성을 확인할 수 있는 룰)을 함께 사용한다. 여기서 checkable rules는 보통 GSL 라이브러리나 CLion 내부에 들어있는 static analysis를 통해 손쉽게 확인할 수 있다.
MISRA guideline
MISRA는 Safety에 초점을 둔 가이드라인이다.
MISRA는 safety를 구현하기 위해 대다수의 룰들을 checkable rules로 만들었고 또 강제성을 가지게 만들었다. 실제로 228개의 MISRA 룰들 중 219는 강제성을 가진다.
MISRA가 코드를 보는 방향은, ‘코드는 아무래도 어쩔 수 없이 버그를 내포한다’ 라는 점이다. 대신 이 버그가 절대로 유저에게 악영향을 끼쳐서는 안되게 룰을 빡빡하게 가져간다 (i.e. Do no harm).
MISRA와 C++ CG에게 부족한 점들
두 가이드라인은 꽤나 성숙함에도 불구하고, 안전한 프로그래밍을 위해서 최신 트렌드를 제대로 반영하지 못한다는 점에 있다. 리스트를 만들자면 다음과 같다.
- Sequential code에 맞춰져있다
- 병렬 프로그래밍에 대해 룰의 수가 너무 적다
- 오염된 데이터에 대해서 병렬 프로그래밍을 할 때에 대해서는?
- 고장난 하드웨어에서 작동할 때에는?
- 동시성/이벤트 프로그래밍에 대해 룰의 수는 더 적다
- 이종 프로그래밍에 대한 부분은 아예 없다.
- 딥러닝에서 필수적이지 않을까?
업계에서는 이미 병렬/동시성/이벤트/이종 프로그래밍을 활발하게 사용하고 있다. 하지만 이에 대한 안전 가이드라인은 업계의 속도를 쫒아오지 못하고 있다. 발표자는 위 내용들에 대한 코딩 가이드라인을 만드는데에 참여하면서 safety도 함께 고려하고 있다고 한다.
Safety를 위한 룰
룰을 만들 때 5가지 종류의 룰이 나올 수 있다.
- 사람이 체크하기 좋은 룰
- 툴이 체크하기 좋은 룰
- 사람과 툴이 둘 다 체크하기 좋은 룰
- 사람과 툴이 둘 다 체크하기 어려운 룰
- 사람만 체크할 수 있는 룰
사람이 체크하기 좋은 룰들은 굉장히 간단한 편이다. 이러한 룰들은 코드 리뷰를 거쳐서 확인할 수 있게 하고, 프로그래머들이 숙지할 수 있도록 만들어져있다.
툴이 체크하기 좋은 룰들은 static scope, 또는 dynamic scope에서 작동한다. Static scope에 대한 분석은 쉽지만, dynamic scope에 대한 분석은 전체 프로그램의 분석이 필요할 수도 있기 때문에 좀 더 어렵다.
사람과 툴이 둘 다 체크하기 좋은 케이스는 대체적으로 쉬운 편이지만, 사람과 툴이 둘 다 체크하기 어려운 케이스는 dynamic scope이면서 전체 프로그램 분석이 필요하기도 하고, 코드 자체의 목적이 쉽게 보이지 않는 경우가 많다.
이 때, CppCG와 MISRA의 특징을 고려했을 때, 사람이 체크하기 좋은 룰들은 CppCG에 많이 있고, 툴이 체크하기 좋은 룰들은 MISRA에 분포해있다. 이 둘을 섞으면 좋은 방식을 만들 수 있지 않을까?
사람만 체크할 수 있는 룰은 meta rules가 있겠다.
MISRA Next
C++11/14/17/20으로 넘어오면서 수많은 병렬/동시성 프로그램이 기능들이 생겼다. 각각의 기능들마다 당연히 safety 가이드라인이 생겨야한다.
위와 같은 기능들을 고려한 가이드라인을 만드는건 사실 새로운 가이드라인을 발명하는거와는 거리가 멀다. 이미 업계에서 많이 사용하고 있는 방법들이 있는데, 거기에 안전을 고려해서 문서화를 할 뿐이다.
하지만 이러한 문서를 만든다고해도, 실제로 업계에서 이 가이드라인에 익숙해지는데에도 시간이 걸리고 피드백을 받아 적절한 수준의 safety를 만드는 데에는 시간이 걸린다.
우선 가장 먼저 만들 MISRA Next는 MISRA 2008 + AUTOSAR가 될 확률이 매우 높으며, C++17을 타겟팅할 예정이다. C++20은 들어가지 않으며, C++17의 기능도 몇개 빼먹을 수도 있다. 하지만 이 가이드라인을 만드는것도 쉽지 않은데, 인력도 부족하고 아직 안전 가이드라인에 대한 경험이 부족하기 때문이다.