Der Code muss so geschrieben sein, dass er bestimmte gewünschte Eigenschaften (Qualitätskriterien) aufweist. Einige Qualitätskriterien sind praktisch immer erwünscht, wie Korrektheit, Lesbarkeit, Wartbarkeit (auch hier sind Ausnahmen, zB wenn Sie für den obfuscated c contest oder den undhanded c contest programmieren). Andere Qualitätskriterien sind nur für bestimmte Projekte oder Organisationen relevant, z. B. Übertragbarkeit auf 16-Bit-Maschinen.
Eine gut formulierte Codierungsregel unterstützt in der Regel ein oder mehrere Qualitätskriterien. Es kann jedoch zu Konflikten mit anderen kommen. Es gibt eine große Anzahl etablierter Codierungsregeln, die die typischerweise gewünschten Qualitätskriterien unterstützen, jedoch ohne signifikante negative Auswirkungen auf andere. Viele davon sind schon vor langer Zeit bekannt (Kernighan und Plauger: Elemente des Programmierstils, 1974, und, ja, ich habe eine Kopie davon :-). Manchmal werden zusätzliche gute Regeln identifiziert.
Wenn nicht in sehr seltenen Fällen (wie vorsätzliche Verschleierung) Code sollte folgen diese "bewährten Regeln", unabhängig davon, ob sie Teil von MISRA-XXXX sind oder nicht. Und wenn eine neue gute Regel gefunden wird, vergewissern Sie sich, dass die Leute dem folgen. Sie können sogar entscheiden, diese neue gute Regel auf bereits vorhandenen Code anzuwenden, aber das ist wegen des damit verbundenen Risikos eher eine Managemententscheidung.
Es macht einfach keinen Sinn, einer guten Regel nicht zu folgen, nur weil sie nicht Teil von MISRA-XXXX ist. Ebenso macht es keinen Sinn, einer schlechten Regel zu folgen, nur weil sie Teil von MISRA-XXXX ist. (In MISRA-C-2004 heißt es, dass sie 16 Regeln aus MISRA-1998 entfernt haben, weil "sie keinen Sinn ergaben" - hoffentlich haben einige Entwickler sie bemerkt und nicht angewendet. Und, wie Lundin erwähnt, in MISRA-2012 wieder einige "seltsame Regeln" wurden entfernt.
Beachten Sie jedoch, dass für fast jede Regel ihre gedankenlose Anwendung in bestimmten Situationen sogar die Qualitätskriterien herabsetzen kann, die sie normalerweise unterstützt.
Zusätzlich zu diesen allgemein gültigen Regeln gibt es Regeln, die nur relevant sind, wenn bestimmte Qualitätskriterien für Ihren Code vorhanden sind. Erschwerend kommt hinzu, dass in den meisten Projekten für verschiedene Teile des Codes die verschiedenen Qualitätskriterien unterschiedlich relevant sind.
Für eine Interrupt-Service-Routine ist die Leistung wichtiger als für die meisten anderen Teile der Software. Daher Kompromisse mit. andere Qualitätskriterien werden gestellt.
Einige Softwareteile sind so konzipiert, dass sie zwischen verschiedenen Umgebungen tragbar sind, oft jedoch durch Einführung von Adaptern/Wrappern, die dann für eine bestimmte Umgebung spezifisch sind. Daher ist der Adapter selbst nicht dazu vorgesehen, tragbar zu sein.
Mit Ausnahme der oben genannten "bewährten Regeln" kann ein festgelegter Satz von Codierungsregeln folglich nicht für alle Teile einer typischen Software gut funktionieren. Bestimmen Sie daher für jeden Teil der Software zunächst, welche Qualitätskriterien für diesen Teil relevant sind. Wenden Sie dann diese Muster, Prinzipien und Regeln an, die diese spezifischen Qualitätskriterien wirklich angemessen unterstützen.
Aber was ist mit MISRA? Die MISRA-Regeln sollen Qualitätskriterien wie Korrektheit über Analysierbarkeit (z. B. Rekursionsverbot und dynamische Speicherverwaltung), Portabilität (z. B. Isolation von Assemblercode) unterstützen. Das heißt, bei Softwareteilen, bei denen diese spezifischen Qualitätskriterien nicht relevant sind, bringen die jeweiligen MISRA-Regeln keinen Nutzen. Leider hat MISRA keine Vorstellung von Softwarearchitektur, bei der verschiedene Teile unterschiedliche Qualitätskriterien haben.
Während sich viele Regeln gegenüber den MISRA-Releases verbessert haben, gibt es immer noch viele Regeln, die strenger als nötig sind (zB "no/* in // comments und vice versa" - warum?) Und Regeln, die zu vermeiden versuchen (unwahrscheinlich) Fehler auf eine Weise, die eher zu Problemen führt als zu deren Lösung (z. B. "keine Wiederverwendung eines Namens, nicht einmal in verschiedenen lokalen Bereichen"). Hier ist mein Tipp für Sie: Wenn Sie a) wirklich wollen, dass Ihr Regel-Checker alle Fehler findet und b) nichts dagegen hat, eine absurde Menge an Warnungen mit einem hohen falsch-positiven Verhältnis zu erhalten, dann tut diese eine Regel/Kontrolleur alles dafür Sie: "Warnung: Codezeile erkannt: < Codezeile>".
Schließlich wird MISRA unter der Annahme entwickelt, dass C (insbesondere seine Arithmetik) zu schwer zu verstehen sind. MISRA entwickelt seine eigene Arithmetik auf der Oberseite von C in der Überzeugung, dass Entwickler stattdessen die MISRA-Arithmetik lernen sollten und dann ohne C-Arithmetik davonkommen können. Offensichtlich war dies nicht erfolgreich, weil das MISRA-2004-Modell ("zugrunde liegender Typ") in MISRA-2012 durch einen anderen ("essentiellen Typ") ersetzt wurde. Wenn Ihr Team C also gut versteht und ein gutes statisches Analysewerkzeug (oder sogar mehrere) verwendet, das in der Lage ist, die problematischen Szenarien mit Cs Arithmetik zu identifizieren, ist der MISRA-Ansatz wahrscheinlich nicht für Sie geeignet.
TL; DR: Befolgen Sie die Standard-Best Practices, wenden Sie bewährte Regeln an. Identifizieren Sie spezifische Qualitätskriterien für die verschiedenen Teile Ihrer Architektur. Wenden Sie für jeden Teil Muster, Prinzipien und Regeln an, die für diesen Teil geeignet sind. Verstehen Sie Regeln, bevor Sie sie anwenden. Wende keine dummen Regeln an. Verwenden Sie eine gute statische Codeanalyse. Stellen Sie sicher, dass Ihr Team C.
versteht