2015-04-29 8 views
7

Comprendo che gli standard MISRA-C sono destinati al firmware incorporato. Quando Linux incorporato è la tua piattaforma di prodotto, è possibile/le applicazioni incorporate essere sviluppate per essere conformi a MISRA-C? Qualcuno ha mai considerato un simile esercizio?MISRA-C è applicabile alle applicazioni Linux

Il mio senso generale è che è necessario prima capire tutte le "regole" e quindi applicarle nella fase di progettazione/codifica. Potrebbero esserci istanze come le chiamate di sistema (pthread_create) e void * che devono essere forzate in conformità, producendo un codice dall'aspetto brutto.

+0

Come da il titolo del documento, MISRA-C si applica a tutti i * sistemi critici * e può essere utilizzato per qualsiasi applicazione oltre tale ambito. Il tuo approccio ad alcune regole (in particolare gli avvisi) può essere più rilassato se usato su codice non incorporato. – Andrew

risposta

4

Mentre MISRA-C è stato originariamente creato come standard solo per applicazioni automobilistiche e safety-critical, questo non è più vero. Oggigiorno MISRA-C è più uno standard generale che può essere usato per qualsiasi programma C in cui non sono desiderati problemi di bug, crash e portabilità.

È necessario chiedersi perché si sta utilizzando MISRA-C. È perché desideri usarlo come standard di codifica per sbarazzarti dei bug, o perché l'applicazione è di natura mission-critical?

Per il caso Linux, il problema principale sarà se si avrà il proprio codice MISRA compatibile, o se si richiederà che questo sia vero per tutte le librerie incluse. E non c'è proprio modo di rendere le librerie del kernel Linux + MISRA conformi, dovresti riscrivere Linux da zero.

Ciò rende Linux inadatto per software mission-critical. Ma se il tuo programma non è di natura mission-critical, dovresti essere in grado di usare Linux. Potresti dover scrivere in anticipo un numero di deviazioni in piedi da MISRA-C, perché ciò che puoi dire causerà problemi.

3

In una parola: No.

MISRA fornisce alcune buone linee guida, ma si sarebbe meglio solo cherry picking regole a cui si desidera aderire (ammesso che abbiate il check-in automatico la vostra analisi build/static).

Scorrendo tra le cose di MISRA-2004, ecco alcune aree problematiche.

Avere tutte le librerie conformi a MISRA è, di per sé, regola MISRA.

Norme in materia di goto, continue e break, funzione ritorna, e l'aritmetica dei puntatori sono violati in letteralmente miliardi di righe di codice sia kernel e userspace, quindi buona fortuna ottenere le librerie (o kernel) in conformità.

Le regole di trasmissione puntatore saranno impossibili da seguire se si utilizzano socket, tra le altre API comuni.

Misra 2004 11.2 conversioni non devono essere eseguite tra un puntatore di opporsi e qualsiasi tipo diverso da un tipo integrale, un altro puntatore a oggetto tipo o un puntatore a void .

2004-20.x sezioni divieto <errno.h>, <stdio.h>, <time.h> e <signal.h>. Segnali di divieto e controllo degli errori promuovono la programmazione BAD di Linux se si scrivono servizi affidabili e di lunga durata.

E nessuna allocazione di memoria dinamica è una regola da qualche parte.

So MISRA ha delle regole che consentono di violare le regole se li documentare (è questo vale per richiesto o semplicemente consulenza ???), ma avrete documentare soooo molte eccezioni che è davvero una sorta di inutile.

Detto questo, se hai un cliente che insiste sulla conformità MISRA (che è l'unica ragione per cui l'ho mai visto usato), potresti probabilmente documentare tutte le violazioni delle regole e fare qualche tentativo a mano di chiamarti MISRA conforme. Quindi potrebbe esserci un caso aziendale per fingere di essere conforme a MISRA su Linux, ma vedo poco o nessun vantaggio tecnico in esso.

ho paura che se si vuole essere veramente conforme e hanno bisogno di un/OS full-optional pesi massimi è meglio sborsare la pasta per QNX, GHS Integrità, VxWorks, ecc

+0

Indipendentemente dal fatto che le librerie debbano essere conformi a MISRA è un po 'discusso. Perché troverai librerie scritte male ovunque, e non solo nella fonte di Linux. Ecco perché penso che sia giusto ignorare le librerie se l'OP vuole semplicemente MISRA-C per migliorare il proprio codice. I programmatori Linux in generale trarrebbero vantaggio dall'adozione di MISRA o di un sottoinsieme di MISRA, in modo che possano apprendere quale potrebbe essere un vero standard di codifica. Invece di pensare che la "guida allo stile di kernal di Linux" a livello di hobbista sia una sorta di canone per una buona pratica di programmazione, anche al di fuori del progetto del kernel. – Lundin

+2

La ragione per cui di solito si usa MISRA-C non è per "clienti", ma perché è necessario conformarsi agli standard di sicurezza del settore per le applicazioni critiche per la sicurezza. IEC 61508 (industria/generico), ISO 26262 (settore automobilistico), DO-178 (avionica) e così via. Questi standard richiedono che si utilizzi un sottoinsieme più sicuro della lingua, con l'analisi statica del codice, lasciandovi praticamente solo MISRA-C e SPARK Ada tra cui scegliere. Ma dato che almeno 61508 e 26262 e tutti gli altri standard SIL sono per lo più pieni di assurdità, suppongo che alla fine potrebbe tornare a "insistenza dei clienti" :) – Lundin

+1

La maggior parte dei requisiti MISRA si basa sullo sviluppo di software altrettanto deterministico il più possibile in tutte le condizioni operative. Non si usa 'malloc' per la stessa ragione per cui CAN, ARINC-428 e MIL-STD-1553 sono (tipicamente) sincroni (rispetto a quelli intrinsecamente asincroni dell'IP). Determinismo. Garantire prestazioni deterministiche è di fondamentale importanza in sistemi hardware in tempo reale (in particolare quelli mission o safety critical), ma spesso * dannoso * per le prestazioni generali del sistema e, pertanto, non appartiene a un sistema operativo generico. –

Problemi correlati