Kritik

>... anbei eine kritische Diskussion von MISRA C.
>http://www.schellong.de/htm/misra.htm

>Ich denke die Grundidee ist gut, die Umsetzung
>aber weit über das Ziel hinausgeschossen!

Mal davon ab, dass einige Punkte mit MISRA2012 obsolet wurde, sind
einige Punkte schlicht (absichtlich?) falsch dargestellt.
Andere Punkte sind definitiv falsch.
Besonders zeigen einige Beispiele des Authors, die er _gegen_ MISRA listet
gerade auf, dass die Regel durchaus Sinn macht.
Gerade seine Komma-Kritik wird durch die Beispiele konterkariert, zumal
der Kontrollausdruck der for-Schleife damit schnell völlig unleserlich ist.
Hier ist es sehr viel sinnvoller auf eine gescheite Quelltextformatierung
zu setzen, indem man z.B. vor die Schleife mit Setup eine Leerzeile
oder einen Kommentar (Zeilenkommentar, hier stimme ich ihm klar zu) setzt.

Ein schönes Beispiel ist auch 6.3, wo er allen Ernstes völlig willkürliche
Typennamen für feste Int-Breiten vorschlägt, anstatt (wie auch MISRA es nicht macht)
stdint.h zu nehmen, die ja gerade das angesprochene Problem angehen.

Was implizite Typ-Konvertierungen angeht, so können moderne Compiler hier
durchaus mehr leisten, wenn man z.B. Konstanten sehr wohl als unsigned markiert.

Andere Punkte dagegen sind durchaus nachvollziehbar, wenn z.B. continue oder break
gefordert werden. Bei default dagegen schlägt der Author in eine ähnliche
Kerbe wie MISRA, ignoriert aber, dass es bei enum-switches durchaus sinnvoller
ist, default komplett wegzulassen, um dem _Compiler_ die automatische Prüfung
zu ermöglichen (was zumindest der gcc leisten kann).

Fazit: Lustiges Gemisch von berechtigter Kritik, Rant aus Bequemlichkeit
und schlechtem Programmierstil.

Das Problem mit MISRA habe ich insofern, als dass ich (laut Kundenfeedback)
ein sehr guter Programmierer bin, der eben auch von sich aus leserlichen
Code schreibt.
Ich würde durch MISRA definitiv massiv ausgebremst und der Code würde
unleserlicher mit, als nach meinen eigenen Regeln.
MISRA ist die Anwort von Managern auf die Frage, wie programmier-unerfahrene
Ingenieure fehlerarmen C-Code schreiben können.
Das Dilemma: es geht nicht!
Leider begreifen die Verantwortlichen das einfach nicht, oder nutzen
den Microsoft-Effekt aus: wenn der PC muckt unter Windows, kann man die Schuld
auf Microsoft abladen und man selbst ist fein raus;
wenn man dagegen Linux nutzt, ist man selber Schuld, wenn es mal Probleme gibt.
Genau _so_ "verkauft" sich MISRA.
Letztlich können nur gute _embedded_ Programmierer guten Code schreiben.
Die brauchen dann aber auch kein MISRA, sondern gescheite Style Guides.
Damit kann man auch einige extrem nützliche Extensions moderner Compiler
wie GCC erlauben, die gerade auch zur Qualtität des Codes massiv beitragen
können (Stichworte "gcc plan9-extensions").
MISRA stammt immerhin aus einer Zeit, als die meisten embedded Compiler
noch K&R-C implementierten und moderne Programmiertechniken (also der 70er Jahre!)
den Auto-Ingenieuren völlig unbekannt waren.
Das gilt leider auch für die Leute, die MISRA erst definiert hatten.
Inwieweit das mit MISRA-2012 anders ist, kann man leider aufgrund
der Paywall nicht so einfach feststellen.


>Toll finde ich ja auch seinen Kommentar von zum Verbot von rekursiven Funktionen, >gerade im Automotive Embedded Bereich, wo wir ja auch soooo große Stacks haben. Ok, Rekursion habe ich bislang nun wirklich nicht vermisst (und das, wo ich bislang um MISRA drum rum kam. >Ich glaube, der hat nie in einem Automotive Embedded Bereich geschafft, wenn ich >seine Kommentare so lese. Ich auch ned, wundere mich aber dauernd über die - trotz MISRA - häufingen Liegenbleiber und Rückrufe wegen Softwarefehlern in Steuergeräten. Und das ausgerechnet in den "Premium" Mühlen. Wie gesagt: erfahrene SW-Entwickler brauchen MISRA bestenfalls anfangs als Liste möglicher Pitfalls (dafür ist es tatsächlich ok, wenn auch (MISRA-2004) massiv unvollständig). Und schlechte Progger werden mit MISRA nicht wirklich guten Code schreiben. >Klar ist aber auch, daß manche MISRAC Verbote an die Substanz gehen können, gerade >auch was die cast-erei angeht. >Wenn der MISRAC Checker dann erst bei Konstrukten wie > ((uint32)~((uint32)x << y) | ((uint32)a << z))) >zufrieden zu stellen ist, da geht dann die Tilde voll im Cast unter. Zumal, wenn dann (y|z)>31 sein kann.

Antwort auf die Kritik

Diese Kritik bekam im ct-Forum sofort (blinde) Anhänger. Das ist oft so, wenn jemand relativ viel Text schreibt und eine Kompetenz vermittelt, die oberhalb eines bestimmten Grades liegt.
Ähnlich ist es mit glückseligen Buchrezensionen von Unerfahrenen, denen sich automatisch viele andere Unerfahrene anschließen. Bis dann ein Hochkompetenter kommt, der das Buch zu Recht als unbrauchbar in Grund und Boden stampft und ebenfalls sofort dankbare Anhänger gewinnt.