Skip to main content
Témakör:

Eltérések kezelése MISRA-megfelelőségi környezetben

Megjelent: 2015. július 21.

MISRA 2A szoftverfejlesztés ma az ipari fejlesztés szerves része. A beágyazott rendszerek programozására a legtöbb szoftverfejlesztő a C nyelvet vagy valamilyen származékát használja. Ezek­ben a nyelvi környezetekben létfontosságú a programozási szabályok alkalmazása, és az a jó szabály, amely önmaga tartalmazza a szabálytól való eltérés módját és lehetőségét is.

 

Bevezetés

A C és a C++ messze a legszélesebb körben használt programnyelv a beágyazott szoftverfejlesztésben. A VDC[1] közelmúltban végzett kutatása szerint a beágyazott szoftverek fejlesztésével foglalkozó cégek 70%-a használja a C, 42%-a a C++ programnyelvet. A C nyelvet gyakorlatilag minden processzoron megvalósították, és széles választékban kínál könyvtárakat és más erőforrásokat, és a fejlesztést is nagyszámú szoftvereszköz támogatja.
Mindkét említett nyelv – de különösen a C – lehetőséget teremt arra, hogy a fejlesztő számos olyan megoldást is alkalmazzon, amelyek alapvetően helytelenek. Túlságosan is könnyű olyan programkódot írni, amely megfelel ugyan a nyelv követelményeinek, de mégis programhibát (például rendszerösszeomlást vagy definiálatlan viselkedést) eredményez. Közismert példa erre az olyan programkód, amely egy definiált tömbváltozó határain kívül próbálkozik memória-hozzáféréssel, vagy az olyan aritmetikai művelet, amely valamely egész típusú változó túlcsordulását okozza.

A kódolási szabványok filozófiája

Ahhoz, hogy ezekkel a kockázatokkal megbirkózhassunk, az ipari szinten elfogadott módszer valamely kódolási szabvány alkalmazása a fejlesztés során. Ezek legegyszerűbb formája lényegében a kódolási szabályoknak egy olyan készlete, amelyek alkalmazása ellentmondásmentes programok készítésére vezet. Bár a programozási stílus egységessége értékes tulajdonság egy szoftverfejlesztési projektben, ez nem garantál olyan fontos szoftverminőségi tulajdonságokat, mint a megbízhatóság, a hordozhatóság vagy a karbantarthatóság. Lényegesebb kódolási szabvány például a programnyelvi elemek egy biztonságosabb részhalmazának körülhatárolása olyan szabályokkal, amelyek kiküszöbölik a kockázatosnak minősített nyelvi konstrukciók használatát.
A MISRA[2] kódolási irányelv ezt a „biztonságos részhalmazra” vonatkozó elvet testesíti meg, és jelenleg világszerte elfogadott a biztonságkritikus C és C++ nyelvű programfejlesztés minősítése terén. A széles körű elfogadottság oka, hogy szabályrendszere tömör és olvasható, és a lényeges kérdésekre helyezi a hangsúlyt. Egy friss véleménykutatás (Ganssle, 2014) 500 válaszadó körében vizsgálta az érdeklődést valamilyen kódolási szabvány elfogadottságának mértéke iránt. Az eredményekből kitűnik, hogy az általuk alkalmazott kódolási szabványok 60%-a MISRA-alapú. Az elfogadottság „szigorúságáról” tettek egy másik érdekes megfigyelést: a MISRA-alapú kódolási szabályrendszereknek a fejlesztőcsapatokon belüli elfogadottsága elérte a 75%-ot, míg az eltérő elvű szabályrendszerek fejlesztőcsapaton belüli elfogadottsága 50% alatt maradt.

A megengedett eltérések elve

A MISRA kódolási szabvány széles körben elfogadott irányelveket fogalmaz meg a C és C++ nyelvű programok fejlesztéséhez. Ezek az irányelvek azokra a problémákra összpontosítanak, amelyek minőségkritikus szoftverrendszerek fejlesztése során merülnek fel.
A MISRA azt is elismeri, hogy bizonyos szituációkban értelmetlen – vagy akár lehetetlen is – ragaszkodni a szabályrendszer alkalmazásához, ezért szükséges, hogy bizonyos szabályoktól eltérjen a fejlesztő. Az „eltérés” annak az oknak a pontos megfogalmazása, hogy egy bizonyos kódolási szabályt egy bizonyos alkalmazási környezetben miért nem érdemes vagy nem lehet követni. Az eltérés[3] meghatározásának tartalmaznia kell

  • az eltérés alapvető okát,

  • alkalmazásának hatókörét, amelyen belül az adott kódolási szabálytól eltér a fejlesztő,

  • egy helyesen konstruált, biztonságos helyettesítő megoldást, továbbá

  • azon hatások meghatározását, amelyek a szabály alkalmazásának enyhítésekor keletkeznek.

Az adott szabálytól való eltérés hatókörének gondos megfogalmazása hiányában viszont az eltérést félreérthetően is lehet alkalmazni, sőt, azzal vissza is lehet élni, amely alááshatja az irányelvek hatékony alkalmazását.

Az eltérések korlátozott használata

Ahogy a kódolási szabványok maguk is igénylik létrehozásuk céljának és a helyesen értelmezett alapvető okának megfogalmazását, a kódolási szabálytól való eltérés okainak meghatározásánál szükséges érthetően és kölcsönösen megállapodott módon megfogalmazni alkalmazásuk pontos hatókörét is. Ez a követelmény az autóiparban, a MISRA eredeti és máig legfontosabb alkalmazási területén merült fel először. Mind maga a MISRA, mind pedig egy nemzeti szakmai szervezet, a japán autógyártók szövetsége (Japanese Automotive Manufacturers Association – JAMA) elkezdte azt a folyamatot, amely meghatározza a MISRA-megfelelőség szabályai­tól való eltérés módját.
E munka hajtóerejét az adja, hogy meghatározzák a szabályoknak egy olyan rendszerét, amelyek hatóköre szigorúan korlátozott. E folyamat igen fontos első lépése, hogy kategóriákba sorolják a megfelelőségi szabályoktól való eltérés fő okait.

Az eltérések okainak besorolása

Azáltal, hogy az eltéréseket az alábbiak szerint kategóriákba soroljuk, csökkennek a megfelelőség garantálásának gyakorlati nehézségei, ráadá­­sul ez a kategorizálás véd a nem megfelelő eltérések létrehozása ellen.

Minőség. Talán különösnek és nem magától értetődőnek tűnik a minőséget a helyes programozási gyakorlattól való eltérés okaként megnevezni, de egy – a való életben is előforduló – szituációval érzékeltethetjük ennek szükségességét (1. ábra).

 

mirsa 1

1. ábra Példa egy ellenőrzött eltérésre

 

Külső (harmadik féltől származó) kód használata. Ez a kategória foglalja magában a szabadon elérhető könyvtárak alkalmazását, az automatikusan generált programkódokat, a belső használatú, „hagyományos” (legacy) kódmodulokat, sőt még azokat az összetett funkciókat is, amelyek egy kulcsfontosságú algoritmus programkörnyezetét jelentik. Azok, akik egy adott alkalmazási területre szánt, nyilvánosan elérhető könyvtárakat tartják karban, ritkán motiváltak a MISRA vagy másfajta kódolási szabvány betartásában. Az automatikusan generált programkódok – az ISO 26262 funkcionális biztonsági szabványnak megfelelők kivételével – ugyancsak nagy valószínűséggel tartalmaznak a MISRA kódolási szabványnak nem megfelelő megoldásokat. A legacy kódmodulok akár a MISRA bevezetését megelőző időből is származhatnak. Ezeknek a MISRA-szabályok szerinti újraírásnak hatáselemzését is figyelembe kell venni. Az említett esetekben alkalmazható biztonsági követelményeket a „használat során bizonyított biztonság” (qualified through use) elve és az adott esetre kidolgozott, specifikus minőségi intézkedések révén lehet teljesíteni.

Konfigurációépítés. Az autóipar sajátossága, hogy az automotív beszállítók által tervezett szoftveralkalmazásokat a felhasználói igényekhez igazodva egyetlen alapkód számos változatában kell elkészíteni. Ahelyett, hogy a programozás során minden igényre egyedi kódváltozatokat készítenének, a különféle változatokat konfigurációs mechanizmusok beépítésével különböztetik meg egymástól. Ennek következtében a MISRA-megfelelőség csorbát szenved a redundáns kódok beépülése, a minden esetben azonos eredményt adó kifejezések újraszámolása és ezek globális következményei miatt.

Hardverhozzáférés. Annak érdekében, hogy a beágyazott szoftver fejlesztője regiszterekhez férhessen hozzá, abszolút memóriacímzést használhasson vagy megszakításokat kezelhessen, a C nyelv fordítóprogramtól függő kiterjesztéseit kell alkalmaznia, amely a MISRA-nak nem megfelelő programkódot eredményez. Ezekben az esetekben a biztonság követelményeinek teljesítését rendszerint gondos, egyedi teszteléssel kell ellenőrizni.

Defenzív kódolás. Mivel a C nyelvben nincs robusztus kivételkezelés, védekező programozási fogások alkalmazása válhat a program előre nem látható viselkedéséből adódó problémák elkerülésének eszközévé. A teljes képességű programelemző szoftvereszközök emiatt soha nem változó logikai feltételek vizsgálatát, illetve soha le nem futó programrészleteket találhatnak. A biztonsági elemzésnek kényszerített módon kell az ilyen végrehajtási útvonalakra és feltételvizsgálatokra is kiterjednie.

Nyelvi sajátosságok. Lehetnek olyan valós kódolási megfontolások, amelyek újabb keletű nyelvi konstrukciók alkalmazását tehetik szükségessé (pl. Boolean vagy long long típusok, esetleg inline funkciók). Ezek miatt szükségessé válhat az eltérés egyes régebbi MISRA-verzióktól. Ilyen esetben a biztonsági problémát az jelenti, hogy még olyan 15 éves, C99-változatú nyelvi konstrukciók is létezhetnek, amelyeket nem minden fordítóprogram támogat.

Az ellenőrzött eltérések szerkezete

A programozási szabályoktól való eltéréseknek okaik szerinti elkülönítése az első lépés a megfelelően korlátozott hatókörű eltérés szerkezetének felépítésében. Ez természetesen az eltérés összes ismert, specifikus eseteinek a szabályok és kategóriák szerinti kidolgozásával folytatódik. A MISRA és a JAMA az ipari szereplők részvételével dokumentálja a szabályoktól való eltérések készletét létjogosultságuk és a biztonsági megfontolások megadásával.
Ezek a kezdeményezések az automotív iparágon kívül is jelentősek. A MISRA kódolási szabvány ugyan az autóiparból ered, de az első évektől kezdve már felfedezhető volt a hajlandóság arra, hogy a fogyasztási cikkektől az orvostechnikán és az ipari irányitástechnikán át az elektronikai tervezés automatizálásáig sok más, beágyazott környezetben is alkalmazzák. Ugyanígy az ellenőrzött eltérések szerkezete is fontos mindegyik, a kódolási szabványt elfogadó iparág vagy szervezet számára.

Automatizált eszköztámogatás

Egy olyan kódolási szabvány, amelynek nem szerzünk érvényt automatizált módszerekkel, valamint nem ruházzuk fel gazdag auditálási és jelentéskészítési képességekkel, amelyre nem nagyon hivatkozunk és alig követjük, csupán a könyvespolcot díszíti. Egy értelmes statikus analizáló szoftvereszköznek (2. ábra) pontos diagnosztikai kimenetet kell generálnia, világosan érthető magyarázatot kell adnia minden felmerült problémára, valamint részletes jelentést kell előállítania a szoftverprojekt minden verziójához.

 

MISRA 2

2. ábra Példa az ellenőrzött eltérés szoftvereszközzel kényszerített alkalmazására


Ám még egy olyan környezet használata is óvatosságot igényel, amely automatizált eszközökkel kényszeríti ki az elfogadott eltérési szabályok használatát, még akkor is, ha a teljes megfelelőség elérésének egyik akadályát szünteti is meg. Mind a kódolási szabályoknak, mind az eltérések kezelési szabályainak kényelmeseknek kell lenniük a fejlesztők, azok irányítói és a vezetők számára, és meg kell könnyítenie a részletes minőségbiztosítási jelentések elkészítését. Egy alapvető eltéréskezelési rendszernek össze kell kapcsolnia a szabályok felfüggesztését a szükséges eltérésekkel, és fenn kell tartania ezt a csatolást a forráskód érvényességének egész időtartama alatt. A követelmények azonban ennél bonyolultabbak, ha ellenőrzött eltérésről van szó. Az érvényes kódolási szabályok bármilyen enyhítésének szigorúan korlátozni kell a hatókörét, és semmilyen enyhítés nem megengedett az ellenőrzött eltérésben meghatározottakon kívül. Ha kiválasztunk egy bizonyos kódhelyet, ahol a diagnosztikát enyhíteni kell, a fejlesztőknek azt az ellenőrzött eltérésben megengedett tartományon belülre kell korlátozniuk.

Összefoglalás

The MISRA C kódolási szabvány nem más, mint a C nyelv biztonságos és defenzív használata a beágyazott alkalmazások körében és azon kívül egyaránt. Még ha a C nyelvet széles körben korlátozó módon használjuk is, az ellenőrzött eltérések rendszere szükségszerűnek tűnik, amint azt a különféle szakágak és közösségek arra irányuló erőfeszítései szemléltetik, hogy pontosan meghatározzák ennek a korlátozásnak a módjait. Ebben a cikkben meghatároztuk az eltérések lehetséges kategóriáit, és láttuk, hogy bizonyos okok hogyan jogosítanak fel az eltérések alkalmazására. Ez a módszer megérett az ipari felhasználásra. Ma már az ellenőrzött eltérések kifinomult és automatizált eszköztámogatása, jelentéskészítési lehetőségek és más elemek állnak rendelkezésre a programok megfelelőségének garantálására.

 

Szerző: Fergus Bolger – CTO Programming Research Ltd.

 

Irodalom
Ganssle, J. (2014, August 4). The Ganssle Group: http://www.ganssle.com/tem/tem266.html.

 


[1] A hálózati kommunikáció és szoftverfejlesztés piackutatásával foglalkozó vállalat (vdcresearch.com) – A ford. megj.

[2] MISRA: Motor Industry Software Reliability Association, a motorgyártó iparág szoftver­megbízhatósággal foglalkozó szakmai szövetsége (www.misra.org), de a betűszó sokkal ismertebb jelentése a szövetség által kidolgozott és e cikkben is tárgyalt szoftverkódolási szabályrendszer. – A ford. megj.

[3] Az „eltérés” (deviation) szót a szerző a továbbiakban ebben a pontosan definiált értelemben használja. – A szerk. megj.

 

www.programmingresearch.com

 

Címkék: MISRA | beágyazott rendszer | programozás