URL: https://linuxfr.org/news/encore-un-exemple-de-code-spaghetti-toyota Title: Encore un exemple de code spaghetti : Toyota Authors: Zarmakuizz ZeroHeure, palm123, Benoît Sibaud, Nicolas Casanova et BAud Date: 2014年03月06日T10:13:41+01:00 License: CC By-SA Tags: antipattern, toyota et voiture Score: 59 Après plusieurs journaux récents concernant des histoires de mauvaises pratiques de code dans des logiciels de sécurité ([goto fail pour Apple](//linuxfr.org/users/flagos/journaux/apple-le-ssl-les-goto-et-les-accolades) et [goto cleanup pour GnuTLS](//linuxfr.org/users/crev/journaux/3-goto), [divers patchs monolignes erronés](http://www.tedunangst.com/flak/post/a-brief-history-of-one-line-fixes)), nous avons maintenant une histoire où de mauvaises pratiques de code dans de l'embarqué ont entraîné un accident grave. Toyota a mis en vente en 2005 sur le marché son modèle _Camry_, dont le moteur est contrôlé par de l'électronique et du logiciel. Par exemple la pression sur la pédale de frein est détectée par un capteur que le système doit analyser pour commander le freinage. Un jour lors d'un freinage périlleux le freinage électronique a échoué à freiner efficacement, entraînant un accident qui a coûté la vie à la conductrice et blessé gravement son amie. Dans un procès fait à Toyota, deux experts en embarqué ont donné leur avis sur le code source que Toyota avait utilisé dans sa voiture. C'était du code très sale, comme vous pouvez le voir dans la suite de cette dépêche. _NdM : merci à Zarmakuizz pour son journal._ ---- [Journal à l'origine de la dépêche](http://linuxfr.org/users/zarmakuizz/journaux/encore-un-exemple-de-code-spaghetti-toyota) [Source : Toyota Unintended Acceleration and the Big Bowl of "Spaghetti" Code](http://www.safetyresearch.net/2013/11/07/toyota-unintended-acceleration-and-the-big-bowl-of-spaghetti-code/) [Diapos expliquant les problèmes de sécurité lors du procès](http://www.safetyresearch.net/Library/BarrSlides_FINAL_SCRUBBED.pdf) ---- ## Goto ? Plusieurs journaux récents dénonçaient de mauvaises pratiques de code, en tapant à tort ou à raison sur l'utilisation du goto en C. Voir par exemple ce journal sur [une faille chez Apple](https://linuxfr.org/users/flagos/journaux/apple-le-ssl-les-goto-et-les-accolades) ou celui sur [un patch de GnuTLS](https://linuxfr.org/users/crev/journaux/3-goto). ## L'affaire Toyota Voici maintenant **[une affaire où les freins d'une Toyota ont refusé de fonctionner à cause d'un code spaghetti](http://www.safetyresearch.net/2013/11/07/toyota-unintended-acceleration-and-the-big-bowl-of-spaghetti-code/)**. ### Résumé L'article en anglais est très long, ça date du 13 novembre 2013, je vais tenter un résumé : _Jean Bookout et Barbara Schwarz avaient une Toyota Camry de 2005. Le système de freinage est contrôlé par l'électronique du système. Mais voilà qu'un jour Jean Bookout perd le contrôle de sa voiture, la pédale de frein n'a aucun effet sur la vitesse de la voiture. Qu'à cela ne tienne, elle utilise donc le frein à main, ce qui fait une grosse marque de dérapage sur la route mais la vitesse du véhicule ne diminue pas, eeeeeeeet c'est le crash. Barbara Schwarz meurt des blessures, Jean Bookout se retrouve à l'hôpital pendant 5 mois._ ### Procès Suite logique, procès à Toyota. Bon, on est aux États-Unis, on ne sait pas si c'est uniquement sur les raisons techniques évoquées plus loin ou aussi par patriotisme que les jurés ont déclaré Toyota coupable dans l'affaire, mais passons ce détail pour nous concentrer sur la suite. ## Mais comment les freins ont pu ne plus être efficaces ? Deux experts ont été désignés par l'accusation pour analyser le code source de Toyota et juger par eux-mêmes d'où pouvait provenir la défaillance. [Michael Barr](http://en.wikipedia.org/wiki/Michael_Barr_%28software_engineer%29) est resté 20 mois dans une salle semblable à une chambre d'hôtel, avec des gardes pour s'assurer qu'aucun document ne rentre ou ne sorte de sa salle pendant tout le temps de son analyse. [Phillip Koopman](https://www.ece.cmu.edu/~koopman/) est plutôt à l'aise dans le domaine de l'embarqué. On peut résumer le reste de l'article en _« c'est un gros code spaghetti impossible à maintenir, impossible à prédire, impossible à tester, des corruptions de mémoire arrivent trop facilement, etc. »_ Mais il y a quand même quelques perles : > _There are a large number of functions that are overly complex. By the standard industry metrics some of them are untestable, meaning that it is so complicated a recipe that there is no way to develop a reliable test suite or test methodology to test all the possible things that can happen in it. Some of them are even so complex that they are what is called unmaintainable, which means that if you go in to fix a bug or to make a change, you’re likely to create a new bug in the process. Just because your car has the latest version of the firmware — that is what we call embedded software — doesn’t mean it is safer necessarily than the older one....And that conclusion is that the failsafes are inadequate. The failsafes that they have contain defects or gaps. But on the whole, the safety architecture is a house of cards. It is possible for a large percentage of the failsafes to be disabled at the same time that the throttle control is lost._> _Even a Toyota programmer described the engine control application as "spaghetti-like" in an October 2007 document Barr read into his testimony._ Ce qui donnerait en bon françois : ``` Il y a un grand nombre de fonctions beaucoup trop compliquées. D'après les métriques standards de l'industrie, certaines fonctions sont impossibles à tester, signifiant que leur fonctionnement est tellement compliqué qu'il n'est pas possible de développer une suite de tests fiable ou d'avoir une méthodologie de test pour vérifier tout ce qui se passe à l'intérieur. Certaines sont tellement compliquées qu'on peut les qualifier d'impossibles à maintenir, ce qui veut dire que si vous rentrez dedans pour corriger un bug ou faire un changement, vous êtes assuré de créer un nouveau bug au passage. Ce n'est pas parce que votre voiture a la dernière version d'un _firmware_ (c'est ce qu'on appelle du logiciel embarqué) que c'est nécessairement plus fiable que le _firmware_ plus ancien... Et la conclusion de cela est que les sécurités [employées] sont inappropriées. Les sécurités employées ici contiennent des défauts ou des lacunes. Mais dans l'ensemble, l'architecture de sécurité est un château de cartes. Il est possible d'avoir une majeure partie des sécurités désactivées au moment où le contrôle de l'accélération est perdu. ``` ``` Même un programmeur de chez Toyota a décrit l'application de contrôle du moteur comme « du code spaghetti » dans un document d'octobre 2007 que Barr a cité dans son témoignage. ``` ## Violation des règles de programmation La suite de l'article parle de règles de bonne pratique définies par le [MISRA](http://en.wikipedia.org/wiki/MISRA) pour le développement en C dans l'automobile. Phillip Koopman dit que pour chaque pack de 30 violations de ces règles, on peut s'attendre à 3 bugs mineurs et 1 bug critique en moyenne. Michael Barr a analysé le code en suivant l'édition 2004 de la MISRA (rappel, la voiture date de 2005) et a trouvé... 81 514 violations. D'après les statistiques moyennes, on devrait donc s'attendre à environs 2720 bugs majeurs. Les programmeurs de Toyota ont défini leurs propres règles de bonne conduite et n'ont pas réussi à les respecter. Il y avait aussi plus de 10 000 variables globales, alors que les standards dans les développements de l'automobile réclament le 0 absolu. Le programme superviseur censé détecter si les tâches du moteur tournent toujours était incapable de détecter quoi que ce soit car il se contentait de monitorer le CPU, ce qu'il n'arrivait même pas à faire ! Les codes d'erreurs renvoyés par les tâches étaient complètement ignorés, aucune traçabilité n'était possible. ## Code revu par la Nasa La NASA était censée passer le code en revue, sauf qu'apparemment le code qu'on leur a donné n'était pas le code applicatif final, et des délais trop courts ont empêché les ingénieurs de la NASA de faire leur travail d'inspection. Des mails de Toyota relatent qu'ils ont mis en place des sécurités contre les erreurs de [Bit flipping](http://en.wikipedia.org/wiki/Bit_flipping) alors que Michael Barr n'a vu absolument aucun contrôle de ce côté-là. La [NTHSA](http://en.wikipedia.org/wiki/National_Highway_Traffic_Safety_Administration), l'entité ayant autorisé la mise sur le marché de la Toyota Camry, n'avait donc pas les informations nécessaires pour savoir que la partie informatique du véhicule était complètement foireuse. ## Éclairante démonstration Michael Barr a dû expliquer à un jury non compétent pourquoi tout ce qu'il a trouvé est un problème, ce qui fait donc d'excellentes ressources pour les étudiants et autres curieux : * Retranscription (version brouillon) du témoignage de Phillip Koopman [partie 1](http://safetyresearch.net/Library/Koopman%2010年11月13日%20a.m.PDF) et [partie 2](http://www.safetyresearch.net/Library/Koopman%2010年11月13日%20p.m.pdf) * [Retranscription du témoignage de Michael Barr](http://www.safetyresearch.net/Library/Bookout_v_Toyota_Barr_REDACTED.pdf) * [Diapositives de sa présentation au jury](http://www.safetyresearch.net/Library/BarrSlides_FINAL_SCRUBBED.pdf) > _[Barr's slides are] long, but well worth a read for anyone interested in understanding more about embedded software systems in automobiles and how not to design one; where NHTSA went wrong: and the unbelievably shaky software at the foundation of Toyota’s electronic architecture._ Soit en français : ``` [Les diapos de Barr sont] longues, mais méritent la lecture pour quiconque est intéressé pour en savoir plus sur les systèmes embarqués en automobile et comment il ne faut pas en concevoir, où est-ce que la NTHSA a eu tort, et le logiciel incroyablement fragile aux fondations de l'architecture électronique de Toyota. ``` L'article conclut sur le fait que Toyota n'aurait donc pas voulu que l'on voit son code source, non pas pour garder secret ses algorithmes, mais plutôt pour cacher le fait que c'est un merdier total.

AltStyle によって変換されたページ (->オリジナル) /