MISRA 14.5 sagt Fortsetzung Anweisung darf nicht verwendet werden. Kann jemand den Grund erklären? Danke.Warum wird "weiter" in MISRA C: 2004 als C-Verletzung angesehen?
Antwort
Es ist wegen der , bedingungslose Verzweigung und Spaghetti-Code, der seit etwa 40 Jahren läuft. goto
, continue
, break
und mehrere return
Aussagen sind alle mehr oder weniger gleich schlecht.
Der Konsens der Programmiergemeinschaft der Welt hat in etwa so etwas wie: Wir erkennen, dass Sie diese Merkmale der Sprache verwenden können, ohne Spaghetti-Code zu schreiben, wenn Sie wissen, was Sie tun. Aber wir halten sie immer noch davon ab, weil es eine große Chance gibt, dass jemand, der nicht weiß, was er tut, die Features nutzt, wenn sie verfügbar sind, und dann Spaghetti erstellen. Und wir entmutigen sie auch, weil sie überflüssige Features sind: Sie können natürlich Programme schreiben, ohne sie zu benutzen.
Da MISRA-C auf kritische Systeme ausgerichtet ist, hat MISRA-C: 2004 den Ansatz, möglichst viele dieser unbedingten Verzweigungsmerkmale zu verbieten. Daher wurden goto
, continue
und Mehrfachrückgaben verboten. break
war nur erlaubt, wenn es innerhalb derselben Schleife einen einzigen Bruch gab.
jedoch, in dem „MISRA-C: 2011“ Entwurf, die derzeit evaluiert, hat der Ausschuß prüft noch einmal all diese Features zu ermöglichen, mit einer Einschränkung, dass goto nur erlaubt sein soll, nach unten und nie zu springen nach oben. Die Begründung des Komitees besagt, dass es jetzt Tools (dh statische Analysatoren) gibt, die schlau genug sind, um einen schlechten Programmfluss zu erkennen, so dass die Schlüsselwörter erlaubt werden können.
Die goto-Debatte immer noch stark geht ...
Die Programmierung in C macht es schwierig, mehrere Ausführungszweige zu verfolgen. Wenn Sie Ressourcen irgendwo zuweisen, müssen Sie sie an anderer Stelle, nicht lokal, freigeben. Wenn sich Ihr Code verzweigt, müssen Sie im Allgemeinen eine separate Zuweisungslogik für jeden Zweig oder eine Möglichkeit zum Verlassen eines Bereichs haben.
Die continue
Anweisung fügt eine andere Art und Weise aus dem Rahmen einer for
Schleife zu verlassen, und macht somit eine solche Schleife härter etwa zur Vernunft und zu verstehen, alle Möglichkeiten, in der Steuer durch sie fließen kann, was wiederum macht es schwieriger, um sicherzustellen, dass sich Ihr Code unter allen Umständen korrekt verhält.
Dies ist nur Spekulation meinerseits, aber ich stelle mir vor, dass der Versuch, die Komplexität zu begrenzen, die von diesem zusätzlichen Verzweigungsverhalten kommt, der treibende Grund für die Regel ist, die Sie erwähnen.
IMO, wenn weiter macht eine Schleife schwer zu verstehen, dann ist der Loop-Code zu lang .... –
@MitchWheat: Yeah. Du solltest Lobbyarbeit bei MISRA leisten, um eine Regel "keine langen Schleifen" hinzuzufügen! (Aber persönlich, in C++, ich finde es sehr hand sagen, in der Lage zu sein Kommentarzeilen zu überspringen, wenn die Eingabe mit einem einfachen "weitermachen". C++ ist wiederum eine viel geeignetere Sprache für die "frühe Ausfahrt" Idiom.) –
Sinnlos: Aus Erfahrung werden Codierungsstandards wie ihre oft für den kleinsten gemeinsamen Nenner verdummt. Ich benutze weiter in C/C++/C# Es ist ein perfektes Konstrukt. –
Wie bei allen MISRA-Regeln, wenn Sie es rechtfertigen können, können Sie von der Regel abweichen (siehe Abschnitt 4.3.2 von MISRA-C: 2004)
Der Punkt hinter MISRA (und anderen ähnlichen Richtlinien) ist, die Dinge zu fangen, die im Allgemeinen Probleme verursachen ... ja, continue
kann richtig verwendet werden, aber die Beweise deuten darauf hin, dass es eine häufige Ursache für Probleme war.
Als solche, MISRA erstellt eine Regel, um seine (ab) zu verhindern, und die Überprüfung Gemeinschaft genehmigt die Regel. Und die Ansichten der Benutzergemeinschaft unterstützen die Regel im Allgemeinen.
Aber ich wiederhole, wenn Sie es wirklich verwenden möchten, und Sie können es zu Ihrer Unternehmenshierarchie rechtfertigen, abweichen.
Haben Sie * sie * nach ihrem Grund gefragt? –
Wie bei allen "Immer" - und "Niemals" -Regeln sind sie wahrscheinlich nicht viel Aufmerksamkeit wert. –