Pourquoi «continuer» est considéré comme une violation du code C dans MISRA C: 2004?

MISRA 14.5 indique que l’instruction continue ne doit pas être utilisée. Quelqu’un peut-il expliquer la raison? Je vous remercie.

C’est à cause de l’ ancien débat sur le goto , le twigment inconditionnel et le code spaghetti, qui dure depuis environ 40 ans. goto déclarations goto , continue , break et return multiples sont considérées comme plus ou moins égales.

Le consensus de la communauté mondiale de la programmation a abouti à peu près à quelque chose comme ceci: nous reconnaissons que vous pouvez utiliser ces fonctionnalités du langage sans écrire de code spaghetti si vous savez ce que vous faites. Mais nous les décourageons toujours car il y a de grandes chances que quelqu’un qui ne sait pas ce qu’il fait utilise les fonctionnalités, si elles sont disponibles, et crée ensuite des spaghettis. Et nous les déconseillons également car ce sont des fonctionnalités superflues: vous pouvez évidemment écrire des programmes sans les utiliser.

Comme MISRA-C vise des systèmes critiques, MISRA-C: 2004 a pour objective d’interdire autant que possible ces caractéristiques de twig inconditionnelles. Par conséquent, goto , continue et les retours multiples ont été interdits. break n’était autorisée que s’il y avait une seule pause dans la même boucle.

Toutefois , dans le projet “MISRA-C: 2011” actuellement en cours d’évaluation, le comité a envisagé d’autoriser à nouveau toutes ces caractéristiques, avec une ressortingction qui ne devrait être autorisée qu’à sauter vers le bas et jamais vers le haut. Le comité a expliqué qu’il existait désormais des outils (parsingurs statiques) suffisamment intelligents pour détecter les stream de programmes incorrects, de sorte que les mots clés puissent être autorisés.

Le débat sur la lecture continue

La programmation en C rend notoirement difficile à suivre plusieurs twigs d’exécution. Si vous allouez des ressources quelque part, vous devez les libérer ailleurs, non localement. Si votre code comporte des twigs, vous aurez généralement besoin d’une logique de désallocation distincte pour chaque twig ou voie permettant de quitter une étendue.

L’instruction continue ajoute un autre moyen de sortir de la scope d’une boucle for et rend ainsi une telle boucle plus difficile à raisonner et à comprendre toutes les manières possibles par lesquelles le contrôle peut circuler à travers elle, ce qui rend plus difficile de s’assurer que votre Le code se comporte correctement en toutes circonstances.

Ce ne sont que des spéculations de ma part, mais j’imagine qu’essayer de limiter la complexité découlant de ce comportement de twigment supplémentaire est la raison principale de la règle que vous mentionnez.

Comme avec toutes les règles MISRA, si vous pouvez le justifier, vous pouvez vous écarter de la règle (section 4.3.2 de MISRA-C: 2004).

Le but de la MISRA (et d’autres directives similaires) est de piéger les problèmes qui posent généralement des problèmes … Oui, continue peut être utilisé correctement, mais les preuves suggèrent qu’il s’agissait d’une cause fréquente de problèmes.

En tant que tel, MISRA a créé une règle pour empêcher son utilisation (ab), et la communauté des examinateurs l’a approuvée. Et les points de vue de la communauté des utilisateurs appuient généralement la règle.

Mais je le répète, si vous voulez vraiment l’utiliser et que vous pouvez le justifier auprès de la hiérarchie de votre entreprise, déviez-vous.