Embedded-codering beheersen: Bewezen gewoontes om fouten te reduceren en veiligheid te verhogen
De afgelopen decennium is embedded-software uitgegroeid van enkele honderdduizend regels code naar meer dan 100 miljoen in een typisch voertuig. De overstap naar 32-bit processors en overvloedig geheugen heeft ongekende functionaliteit ontgrendeld, maar ook het risico op subtiele bugs vergroot die veiligheid en beveiliging bedreigen.
Om voorop te lopen, moeten ontwikkelaars een systematische aanpak hanteren die fouten voorkomt voordat ze de codebase betreden. Twee primaire foutcategorieën verdienen speciale aandacht:
- Coderingsfouten – bijv. out-of-bounds array-toegang. Deze zijn detecteerbaar via statische analyse.
- Applicatiefouten – alleen te vangen wanneer het gedrag van de software gevalideerd wordt tegen de eisen.
Het implementeren van een strikte coderingsstandaard, zoals MISRA C/C++, gecombineerd met eis-gedreven testen, biedt een krachtige "ounce of prevention". Deze strategie vermindert debugtijd, strakt schema's en beschermt uiteindelijk uw ROI.
Waarom preventie belangrijk is
Menselijke fouten zijn onvermijdelijk – ingenieurs schieten op, overzien details of interpreteren complexe datastromen verkeerd. Maar als software groter en meer geïntegreerd wordt, kunnen deze eenvoudige fouten cascaderen tot kritieke falen. Een gedisciplineerde coderingsstandaard helpt veel van deze vallen te detecteren en elimineren voordat ze opduiken.
In het C/C++-ecosysteem komt ongeveer 80% van de defecten voort uit misbruik van slechts 20% van de taal. Door de problematische constructies te verbieden of te beperken, verhoogt een standaard de codekwaliteit dramatisch.
Overweeg het ongedefinieerde gedrag dat ontstaat wanneer een signed integer rechts wordt geshift. Afhankelijk van de compiler kan het resultaat verschillen, wat leidt tot inconsistente programmagevolg. Evenzo kan een functie die een circulair buffer leest, waarden in een onverwachte volgorde retourneren op sommige compilers. Deze nuances worden in de onderstaande figuren benadrukt.

Figuur 1. Compiler-afhankelijk gedrag in C/C++-constructies. Bron: LDRA

Figuur 2. Onbepaald gedrag in een circulair buffer-voorbeeld. Bron: LDRA
MISRA C/C++ benutten
MISRA, voor het eerst gepubliceerd in 1998 voor de automobilindustrie, blijft de gouden standaard voor embedded C/C++-codering. Het specificeert:
- Waarom elke regel bestaat, met gedetailleerde uitzonderingen.
- Duidelijke voorbeelden van ongedefinieerd, onbepaald en implementatie-gedefinieerd gedrag.
- Richtlijnen over welke regels "Beslisbaar" (tool-verifieerbaar) en welke "Onbeslisbaar" zijn.
In 2016 breidde MISRA uit naar beveiligingskritieke code, met 14 nieuwe richtlijnen. Richtlijn 4.14 verbiedt bijvoorbeeld expliciet constructies die tot ongedefinieerd gedrag kunnen leiden, wat de beveiligingshouding versterkt.

Figuur 3. MISRA-richtlijnen over ongedefinieerd en onbepaald gedrag. Bron: LDRA

Figuur 4. De rol van Richtlijn 4.14 bij het voorkomen van ongedefinieerd gedrag. Bron: LDRA
Van code naar applicatie: De rol van eisen en testen
Zelfs foutloze code kan falen als deze niet voldoet aan het beoogde doel. Traceerbaarheid van eisen en unit-testen zijn essentieel om te verifiëren dat de software zich gedraagt zoals ontworpen.
Bidirectionele traceerbaarheid koppelt elke functie terug aan haar laag-niveau eis en omhoog naar systeemdoelen. Deze mapping onthult ontbrekende of overbodige functionaliteit vroegtijdig.

Figuur 5. Bidirectionele traceerbaarheid van functie naar systeemeis. Bron: LDRA
Zodra laag-niveau eisen gedefinieerd zijn, ontstaan testcases van nature. Het uitvoeren van deze testen – ideaal met geautomatiseerde unit-testtools – bevestigt dat de code haar contract nakomt.

Figuur 9. Resultaten van geautomatiseerde unit-testen. Bron: LDRA
Nieuwe coderingsgewoontes aannemen
Moderne embedded-ontwikkeling vereist een holistische aanpak:
- Implementeer een bewezen coderingsstandaard (MISRA, CERT, etc.).
- Volg metrics – defectdensiteit, codecoverage, nalevingspercentages.
- Dwing eistraceerbaarheid en geautomatiseerde regressietesten af.
Deze praktijken leveren schonere, beter onderhoudbare code op, vereenvoudigen het toevoegen van functionaliteit en verlagen lange-termijn onderhoudskosten – voordelen die gelden voor zowel veiligheidskritieke als niet-kritieke domeinen.
Het aannemen van deze gewoontes is niet optioneel als u een concurrentievoordeel nastreeft. Het verschil tussen een codebase die constant branden moet blussen en een die soepel evolueert, is vaak slechts een gedisciplineerd proces.
Origineel artikel van EDN.
Ingebed
- GE Digital Lanceert Predictive Asset Management Software, Shift Van Reactief Naar Proactief Onderhoud
- CMMS-training meesteren: teams betrekken en retentie verhogen
- Saelig onthult Impact-D 100AL: krachtige, compacte embedded PC met 15-jarige levensduur
- Drie bewezen stappen om uw software supply chain te beveiligen
- Tekststrings: Een verborgen kwetsbaarheid in embedded-software
- SOAFEE: Een cloud-native architectuur die software-gedefinieerde automotive-platforms empowert
- Pixus introduceert robuuste 6U OpenVPX frontplaten met verbeterde structurele integriteit
- Kontron onthult COM HPC: een nieuwe high-performance embedded-computing-standaard
- Congatec onthult 10 nieuwe COM Express Type‑6 modules aangedreven door Intel Coffee Lake H Processors
- Open-Source Software in IoT Beveiligen: Software Risico's Mitigeren
- DevOps Inzetten om Uitdagingen in Embedded Software te Overwinnen