정적코드분석/코딩표준

JSF Air Vehicle C++ Coding Standards 소개

F-35 사진

이번 포스팅은 전투기로 유명한 JSF(Joint Strike Fighter)의 소프트웨어를 개발하기 위한 코딩 표준인 JSF Air Vehicle C++ Coding Standards 에 대한 글입니다.

날로 중요해지는 소프트웨어

과거와 달리 일상에서 사용하는 기기의 대부분이 전자기기화 되어가고 있고 그 중심에는 소프트웨어가 자리하고 있습니다. 스마트폰으로 대표되는 전화기, 아이팟으로 대표되는 MP3 플레이어는 물론이거니와 일상에서 타고 다니는 자동차도 이미 수 많은 소프트웨어가 사용되고 있습니다. 일례로 쉐보레 볼트에는 1천만 줄의 코드가 들어있습니다. 전투기도 이러한 추세에서 예외일 순 없습니다. 미군에서 전투기, 폭격기, 지상공격기를 대체하기 위한 JSF(Joint Strike Fighter) 프로그램의 일환으로 개발하고 있는 F-35 라이트닝 II에도 많은 소프트웨어가 사용되고 있습니다.

F-35 사진
F-35 사진

JSF에 사용되는 소프트웨어는 C++로 작성되었는데 소스코드의 크기는 명확하지 않습니다. 인터넷 상에 600만, 1500만, 2000만 라인의 코드가 사용되었다고 합니다. 하지만 가장 신빙성 있는 자료는 GAO(미국 연방회계감사원)에서 2012년 발표한 자료에서 추정한 1160만 줄입니다. 이 값은 Effective Lines of Code입니다. 한 줄을 모두 차지하는 중괄호({, })나 괄호, 빈 줄, 주석을 제거한 줄 수가 이 정도입니다. GAO에서는 현재 SLOC(Source code Lines of Code)는 1800만 라인이 될 것으로 추정하고 있습니다. 600만이건 1160만 라인이든 상관없이 전투기 역사 이래 소프트웨어가 가장 많이 사용되었음에는 반론의 여지가 없습니다. F/A-18 E/F에는 약 110만 라인의 소스코드가 사용되었고 F-22A 역시 고작 220만 라인의 소스코드가 사용되었을 뿐이니까요.

문제는 소프트웨어의 안정성과 신뢰성입니다. 결함이 하나도 없는 소프트웨어는 존재하지 않습니다. 하지만 PC에서 결함이 발생해서 운영체제가 멈춰버리는 것과 전투기의 소프트웨어가 멈춰버리는 것과는 그 결과가 하늘과 땅 차이입니다. 전자는 그냥 껐다 켜거나 잠깐의 불편을 겪고 말지만, 후자는 국방을 지키는 중요 임무 뿐만 아니라 조종사 목숨까지 쥐락펴락할 문제이기 때문이죠. 그렇다고 소프트웨어를 사용하지 않을 수는 없으니 최대한 신뢰성있고 안전한 소프트웨어를 만들고자 고심한 결과가 바로 JSF Air Vehicle C++ Coding Standards 입니다.

JSF Air Vehicle C++ Coding Standards : Safety-Critical 코드 개발을 위한 코딩 표준

JSF Air Vehicle C++ Coding Standards 는 프로그래머가 버그를 발생시키지 않도록 안전을 우선시하는(Safety-Critical) 코드를 작성할 수 있게 도와주는 가이드 문서로 만들어졌습니다. 이 가이드는 프로그래머가 보다 올바르고, 신뢰성있고, 유지보수하기 쉬운 코드를 작성하도록 상세히 안내하고 있습니다. 이를 위해 JSF Air Vehicle C++ Coding Standards 는 코딩 스타일에 대한 가이드라인, 이식성 이슈를 해결하기 위한 가이드라인, 산술 오류나 문법 오류와 같은 일반적인 에러가 발생하지 않기 위한 코딩 가이드라인에 대해서 기술해놓았으며, 더불어 이해하기 쉽고 다른 프로그래머가 유지보수 하기 쉬운 코드를 작성하도록 안내하고 있습니다.

참고 문서와 JSF Air Vehicle C++ Coding Standards

JSF Air Vehicle C++ Coding Standards 에서 새로 지정한 규칙도 있지만, 기존의 문헌을 그대로 수용하거나 변경해서 사용한 것도 많습니다. 인용한 참고문헌 15가지 중에서, 특히 많이 인용한 문서는 ‘MISRA-C:1998 Guidelines for the Use of the C Language in Vehicle Based Software’ 입니다. C++의 문법이 클래스와 템플릿 부분을 제외하고는 C와 크게 다르지 않고 MISRA-C 역시 안전한 코딩 가이드에 그 존재 목적을 두었기 때문에 C++ 안에서 C의 특성을 가진 문법(Function, Variables, Definitions, Type 등)은 MISRA-C를 많이 사용한 편입니다.

반면, C++ 고유의 문법(Class)은 C++의 창시자인 Bjarne Stroustrup 와 ‘Effective C++’의 저자 Scott Meyers의 저서를 많이 참조해서 만들었습니다.

JSF Air Vehicle C++ Coding Standards 규칙의 분류

JSF Air Vehicle C++ Coding Standards에서는 총 221개의 규칙을 정의했습니다. 97번, 97.1번과 같이 추가적인 규칙을 더하면 총 229개입니다. 규칙은 3개의 분류로 나눌 수 있습니다.

– Should : 반드시 지켜야 하는 규칙은 아니나, 지킬 것을 강하게 권고하는 규칙.
– Will : 반드시 지켜야 할 규칙. 그러나 검증을 요하진 않습니다. 이 규칙은 명명 규칙(naming convention)과 같이 안전과 직결되지 않으며 검증하기 쉽지 않은 규칙로 한정됩니다.
– Shall : 반드시 지켜야하는 규칙. 사람이 직접 하던지 정적코드분석을 통해서든 반드시 코드 검증을 해야합니다.

추가로 Must도 있는데 위의 3가지 분류에 대한 설명(AV Rule 4,5)입니다.Should 는 42개, Will은 66개, Shall은 119개이며 Must 2개 이렇게 총 229개의 규칙이 있습니다.

JSF Air Vehicle C++ Coding Standards 검증 방법

규칙이 229개나 되는데다가 JSF Air Vehicle C++ Coding Standards 를 검증하려고 하는 소스코드는 100~200줄이 아닌 수 만 ~수 백만 줄의 매우 큰 소스 코드이기 때문에 사람에 의한 코드 리뷰는 불가능에 가깝습니다. 보통 정적 코드 분석 도구를 사용하여 JSF Air Vehicle C++ Coding Standards 규칙을 검사하는데요, 이를 지원하는 도구는 LDRA Test Suite, PRQA의 QAC++, Parasoft C/C++ 등이 있습니다.

JSF Air Vehicle C++ Coding Standards 문서는 여기에서 무료로 다운로드 받을 수 있습니다. 관심있으신 분들은 한 번 보시는 것을 추천합니다.