česky english Vítejte, dnes je pátek 29. březen 2024

Řízení odchylky od standardu MISRA

DPS 1/2016 | Články
Autor: Fergus Bolger, CTO Programming Research

C a C++ jsou nejrozšířenější jazyky pro vývoj embedded softwaru. Nedávný výzkum VDC ukázal, že jazyk C používá více než 70 % z dotazovaných výrobců embedded systémů a C++ používá 42 % výrobců. V současné době je jazyk C implementován prakticky na každý procesor a i díky tomu je dnes k dispozici široká škála zdrojů a knihoven, podporovaná velkým množstvím nástrojů.

Při programování v jazyce C však mohou vývojáři udělat i řadu chyb. Napsat kód, který může mít za následek selhání celé aplikace či její nedefinované chování, je až příliš snadné. Nejběžnějším příkladem je kód, který přistupuje k paměti mimo hranice pole, nebo aritmetické operace, které mají za následek přetečení celého čísla.

Filozofie Coding Standards

Obecným trendem k eliminaci kritických míst v kódu je používání tzv. Coding Standard. Zjednodušeně řečeno se jedná o definici souboru ustálených kódových standardů. Přestože použití jednotného stylu zápisu může být v rámci jednoho daného projektu užitečné, nijak to neřeší další důležité atributy kvality softwaru, jakými jsou spolehlivost, přenositelnost a další udržovatelnost kódu. Základní úlohou kódových standardů je definovat soubor pravidel, která eliminují vznik rizikových struktur.

Kódové instrukce MISRA tyto principy bezpečného vývoje integrují a po celém světě jsou akceptovány jako standard pro návrh bezpečného kódu v jazycích C a C++. Jejich širokému rozšíření pomohla rovněž jejich přehledná a dobře čitelná struktura. Nedávný průzkum provedený na 500 respondentech (Ganssle, 2014) ukázal některé zajímavé údaje o míře použití kódových standardů. V první řadě to bylo zjištění, že asi 60 % všech používaných kódových standardů vychází právě ze standardu MISRA. Rovněž bylo zajímavé zjištění, že pravidla kódování na bázi MISRA zásadně využívá až 75 % vývojových týmů, zatímco v případě jiných pravidel je to méně než 50 %.

 

Princip odchylky

Kódové standardy MISRA obsahují obecně akceptované pokyny pro vývoj v jazycích C a C++. Tyto pokyny se zaměřují především na otázky, které jsou důležité při vývoji kritických softwarových systémů. V některých situacích je však striktní použití standardů MISRA nevhodné, nebo dokonce nemožné, a tak je občas nutné se od některých pravidel odchýlit. V případě takové odchylky se uvádí důvod, proč není v souladu s konkrétním kódovým pravidlem a jaké okolnosti k tomu vedly. Součástí je i zdůvodnění a popis, do jaké míry nebylo konkrétní pravidlo dodrženo, a obsahuje správně sestavené opatření, které zmírňuje účinky způsobené odchýlením se od pravidel.

Pokud by rozsah nedodržení standardu nebyl pečlivě popsán, mohla by být odchylka špatně pochopena, nebo dokonce zneužita a v konečném důsledku by pak ohrozila celkovou účinnost dodržení standardu.

Omezené použití odchylek

Tak jako vytvoření kódových standardů vyžaduje objektivní a dobře srozumitelný přístup, důvody pro odchýlení se od těchto pravidel vyžadují rovněž správnou interpretaci a přesně definovaný rozsah jejich použití. Při řešení tohoto úkolu měl a stále má dominantní úlohu automobilový průmysl. Jak asociace MISRA (Motor Industry Software Reliability Association), tak také Japonská automobilová asociace výrobců (JAMA), zahájily proces pro přesné stanovení podmínek, za kterých lze akceptovat určité odchylky od standardu MISRA.

Hlavním cílem je přitom definovat soubor možných odchylek a jejich pravidel, které budou mít pevně definovaný rozsah. Prvním a zároveň nejdůležitějším krokem je potřeba roztřídění široké škály důvodů pro odchylky od pouhého nedodržování pravidel.

Řízení odchylky od standardu MISRA

Důvody pro použití odchylek

Rozdělením odchylek do následujících kategorií se stávají problémy s dodržením standardu více zřejmé. Tato kategorizace navíc chrání standardní zaměření kódu před použitím nevhodné odchylky a oslabení kódové struktury.

  1. Výkon: Může se zdát divné a neintuitivní označit výkon jako důvod pro nedodržení ověřené praxe kódování, ale následující situace z reálné aplikace ukazuje, že je to možné (obr. 1).
  2. Externí kód (kód třetí strany): Tato kategorie zahrnuje běžné knihovny, automaticky generované kódy a starší interní kódy modulů, nebo dokonce jen komplexní funkce zahrnující klíčové aplikační algoritmy. Správci veřejných a doménových knihoven, vzhledem k jejich široké aplikační doméně, zřídka kdy mají skutečnou motivaci ke splnění kódových standardů MISRA i jiných. Stejně tak automaticky generovaný kód, pokud splňuje funkční bezpečnostní normu, jakou je ISO 26262, bude pravděpodobně obsahovat inherentní nesoulad s MISRA. Původní kód přitom mohl v minulosti vycházet z projektu podle standardů MISRA. Analýza dopadu možných změn s cílem splnit pravidla MISRA může sama o sobě vznést pochybnosti o tomto konání. Ve všech těchto případech je založena na „kvalifikovaném znovupoužití“ a spoléhá na kombinaci s dalšími konkrétními opatřeními.
  3. Konfigurace sestavení: Specifickým rysem automobilových aplikací jednotlivých dodavatelů je produkce mnoha variant jednoho základního kódu, upraveného dle potřeb zákazníka. Spíše než sestavení daného kódu na nejvyšší úrovni, jsou zavedeny konfigurační mechanismy řízení funkcí pro každou variantu. V důsledku toho může kód utrpět porušením některých zásad MISRA, především pokud jde o redundantní kód, invariance ve výrazech a další související řešení globálních problémů.
  4. Přístup k hardwaru: Pro přístup k registrům, adresám paměti či pro řízení přerušení potřebují mít vývojáři embedded aplikací přístup k rozšířeným vlastnostem kompilátoru specifickým pro jazyk C, což má opět za následek nedodržení standardů MISRA. V případě bezpečnostních aplikací je vyžadováno pečlivé zajištění všech testů jednotky.
  5. Ochranný kód: Vzhledem k absenci robustního zpracování výjimek v C lze použít praktiky defenzivního kódování, např. programovou ochranu proti nepředvídatelnému chování aplikace. Plně vybavený analytický nástroj bude schopen ve výsledku správně rozpoznat neměnné podmínky a nedostupný kód. Bezpečnostní opatření musí zahrnovat vynucené spuštění testu jednotky.
  6. Vlastnosti jazyka: Existují oprávněné důvody z pohledu kvality kódu k použití „posledních“ úprav programovacího jazyka, např. booleovských nebo „long“ typů, případně vložených funkcí. Tyto kódy mohou ovšem vyžadovat odchylky od starších verzí MISRA. Problémem je, že 15 let stará úprava C99 negarantuje, že bude podporována všemi kompilátory.

Struktura řízených odchylek

Kategorizace různých důvodů pro použití odchylek je prvním krokem k vytvoření řádné struktury kódu. To vede přirozeně k vypracování všech konkrétních známých případů odchylek řazených podle pravidel a podle kategorií. MISRA a JAMA jsou dobře zdokumentované, popisující sadu pravidel omezení rozsahu působnosti, vždy s podrobným odůvodněním a připojenou bezpečnostní dokumentací.

Tyto iniciativy jsou důležité dokonce i mimo automobilový průmysl. Kódový standard MISRA byl sice původně určen pro automobilový průmysl, ale od svého vzniku se rozšířil i v mnoha jiných embedded systémech, od spotřebitelských produktů po lékařská zařízení, průmyslové řídicí systémy až po EDA. Zavedení řízené odchylky je však stejně tak důležité pro udržení struktury kódu i ve všech jiných standardizačních organizacích, které je přijaly.

Automatizované nástroje

Standardní způsob kódování bez použití automatizovaných nástrojů, správného auditu a tvorby zpráv produkuje obvykle dále nevyužívané knihovny. Výchozím bodem pro příslušné automatizované nástroje statické analýzy musí být přesnost diagnostického výstupu, srozumitelnost a zodpovězení každé položené otázky a také podrobná evidence kroků každé další verze softwarového projektu.

Ale i prostředí s použitím automatizovaného nástroje potřebuje mít informace o aplikaci schválených odchylek. Obě pravidla pro kódování a řízení odchylek musí být vhodná pro vývojáře, důvěryhodná pro vedení týmu a musí usnadňovat podrobné vykazování QA.

Základní systém řízení odchylky bude vázat každé porušení pravidel na daný typ odchylky, která je podporována, přičemž zachová toto uspořádání po celou dobu životnosti příslušného zdrojového kódu. Požadavky jsou náročnější v případě, kdy se jedná o řízené, kontrolované odchylky. Každá změna příslušných kódovacích pravidel musí vzít v potaz platnost přísnějších omezení a v rámci kontrolovaného nastavení odchylek nemůže dojít k dalšímu potlačení pravidel. Při výběru konkrétního místa kódu, kde má být potlačeno diagnostické hlášení, musí být vývojář omezen pouze na potlačení v rámci povoleného rozsahu řízených odchylek.

Shrnutí

Kódové standardy MISRA C jsou synonymem pro bezpečné a defenzivní použití jazyka C v mnoha embedded systémech i mimo ně. Při komplexním a rozsáhlém restriktivním využívání jazyka C se systém řízení odchylky jeví jako akceptovatelná nutnost. V tomto článku jsme zkoumali kategorie odchylek a přiblížili si, jak oprávněné jsou specifické důvody pro jejich použití v průmyslu. Dnes jsou k dispozici plně sofistikované a automatizované nástroje pro podporu řízení odchylek, stejně jako možnosti generování hlášení a další elementy pro řešení shody se standardy.

O autorovi a PRQA

Fergus Bolger je CTO ve společnosti Programming Research Ltd (PRQA). Získal tituly B.E. a Masters of Engineering na University College Dublin. Vztah společnosti PRQA ke standardům MISRA sahá téměř 20 let do minulosti. Hlavní pravidla obou standardů, MISRA-C i MISRA-C++, byla odvozena z vlastních kódových standardů firmy PRQA a její odborníci zůstávají i nadále klíčovými členy pracovních skupin MISRA-C a MISRA-C++.