I feel a little uncomfortable about computerized medical devices, and here's why
Par David Monniaux le lundi, avril 11 2011, 17:29 - Matériel - Lien permanent
When I speak about safety-critical software, I tend to speak about civil aviation, because I've worked with Airbus for a number of years and I have some grasp of the kind of problems, regulations and technical solutions in that field. Civil aviation, however, is just the tip of the iceberg; there are other areas where failure of computer systems may have catastrophic consequences.
Safety-critical software is generally found in so-called embedded systems; that is, computer systems that control vehicles or machinery. “Catastrophic consequences” may then include loss of life and limb if the system malfunctions. Not all computer-controlled machinery are considered “critical”; for instance, certain industries solve the safety issue by requiring that no humans come close to computerized machinery when it is in operation (for instance, in a car factory, humans cannot walk around the robotic arms during production). Examples of computer-controlled machinery considered “critical” include the fly-by-wire controls of airplanes, automatic driving in trains and subway systems, controllers of radiation therapy equipment, and surgical robots.
There have already been deaths caused by software bugs. I have listed a few of them in the introduction of my habilitation thesis: the best known case is probably the faulty software of the Therac-25 radiation therapy machine, which massively overdosed 6 people. A less well known case of radiation therapy software occurred in Panama, at least 5 people and perhaps as many as 21 died from overdose. In 1991, during the first Gulf War, a Patriot missile failed to intercept an incoming Iraqi Scud missile in Dhahran, Saudi Arabia, which struck an American Army barracks, killing 28 soldiers and injuring others; the incorrect behavior was traced to accumulation of small errors in computations, which had passed unnoticed before because the Patriot batteries were not intended to be turned on for lengthy periods of time.
There have assuredly been many more bugs that caused, if not outright deaths or injuries, at least close calls. It is difficult to comment on such issues, because manufacturers of the faulty products as well as authorities are not necessarily willing to disclose technical facts about the issues. This is understandable from the point of view of avoiding bad publicity and leaks of trade secrets, but is very bad for return of experience as well as academic study. All too often, one hears of such issues only during un-citable informal discussions or through allusions in the media (and we know the general media is unreliable on technical matters).
I should say that civil aviation is not the industry that worries me most. The industry is heavily regulated, and, from what I have seen, the people who work in safety-critical airplane software tend to be careful. A jetliner crash is spectacular event, sure to appear on television worldwide, and sure to raise fears in some passengers; but jetliner crashes are few and far between. They kill hundreds at the same time, but they pale in comparison to car accidents in terms of total deaths. Talking about automotive, how about the software in cars?
Modern cars have computerized fuel injection, computerized steering assistance, and so on; I'm unsure whether we already have brake-by-wire and steering-by-wire. If your steering assistance stiffens while you're taking sharp turns, or softens while overtaking at freeway speeds, you're in trouble, and so are you if your fuel injection fails on the freeway. I have never worked on car systems, but from what I've heard in discussions with professionals from that area and academics working with them, I would trust them considerably less than airplane systems, for several reasons:
Airplanes have “black boxes” that may record evidence for a computer failure. Cars don't, and manufacturers resist the option of having them (with the pretext that drivers would not want to carry records that may be used against them as proof of speeding or other incorrect driving).
If an airplane crashes, there is a lengthy investigation; if a car crashes, in general, the blame is laid upon some driver. In practice, the burden of proof is on the driver to prove that the car malfunctioned.
Car manufacturers tend to limit costs in electronics, cutting margins of safety. There is less incentive to do so on airplane systems: given the $100000000 list price or so of jet liners, one PowerPC processor less or more is not much significant.
There is less redundancy in cars than in airplane. The only redundant system that I know about in cars is braking (two different circuits); for the rest, if it is broken, you are told to drive to a repair shop, or even to stop and call for repairs.
The other industry that worries me is medical devices: radiation therapy machines, obviously, but also surgical robots (I hear they're much in vogue in the US for operating on prostates, with some unclear benefit), and more mundane devices such as infusion pumps. Why worry?
According to the FDA, there here have been a number of cases of faulty infusion pumps in the United States, some due to faulty software. As expected, the blame, in many cases, was initially laid on doctors and nurses.
Some of the software bugs in question are basic problems that no software package or electronic device should exhibit, including the infamous “buffer overrun” bug, or failing to de-bounce keys (a key is said to “bounce” if pressing it once may result in the system seeing multiple presses; de-bouncing techniques have been known for ages). Furthermore, it seems that some of these systems using error-prone programming techniques, such as multithreading, with unclear benefit (*).
Even through drugs and airplanes need advance approval from authorities before being brought to the market, medical devices and software do not, at least in the United States. A woman needs a prescription to get on the contraceptive pill, but apparently, one needs no authorization to market medical devices that can kill patients if malfunctioning!
There does not even seem to be standards for programming such safety-critical systems. In civil aviation, there is DO-178B; in other fields, there are similar criteria, but curiously, there does not seem to be any for medical devices!
I was told about the infusion pump issue during informal talks at a NSF-sponsored workshop at Microsoft Research in Redmond in last October (proof that informal talks are often more valuable than presentations), and since then have done a little Web research. A summary of FDA actions is found here. More interesting is this transcript from a 2009 meeting where a FDA official basically threatens manufacturers, especially those with a history of incidents and recalls, to request all their software, run static analysis tools on them, search for bugs, and report them to the appropriate authorities (more information about this project here).
The transcript, especially
Richard Chapman's intervention (p. 154 and following), is
sobering (**). Some manufacturers exhibit clear amateurism about
software, writing unmaintainable, undocumented code or even being
unable to supply complete source code to the authorities. Such lax
programming practices are inadmissible for safety-critical devices.
The resemblance with the Therac-25
accident is starking: in both cases, programming practice seems
totally at odds with what is taught in computer engineering sources;
perhaps because software is not written by software engineers, but by
employees with other backgrounds who self-taught programming. Therac-24 was 25 years ago; don't we learn?
I'm unsure how many people have died or at least suffered adverse effects from such problems. The good thing is that FDA is now applying static analysis techniques, including software from Coverity and PolySpace. I don't know whether they have tried Astrée; maybe they should.
(*) Coincidentally, I've just seen Brion Vibber posting the following definition for multithreading:
threading (n): a programming model in which every app developer is forced to solve computer science's most difficult problems
(**) I'd like to see the corresponding slides.
Commentaires
La direction by wire non pour des raisons bêtes genre "j''ai plus de batterie". Par contre ce serait bcp plus simple pour faire des voitures avec conduite à droite.
le frein à main "j'appuie sur un bouton" ou même totalement automatique existe déjà..mais je ne sais pas à quel point c'est "by wire".
Sinon bah l'ESP, l'ABS et ce genre de choses ça juste marche. Ca sauve des vies et évite beaucoup d'accidents...à tel point que je ne sais pas si j'irais conduire sur la neige avec une vieille voiture qui ne les à pas.
Les clients en sont contents dans l'ensemble. Ca juste marche très bien. Dans la prod en série un centime d'euro est un centime d'euro donc "pourquoi investir en masse là dedans?"
Au fait la redondance c'est gentil mais on fait qu'on si un des circuits seulement tombe en panne? On affiche un warning pour dire d'aller au garare? Ok..donc on augmente le taux de pannes...le client ne va pas êtres content :(
En ce qui concerne les robots chirurgicaux, j'ai un ami qui travaille dessus. L'état de l'art est le suivant : soit l'opération se fait avec endoscopie classique, soit avec un robot.
L'endoscopie demande un entraînement important, et la prostate est un organe où les nerfs se présentent en larges éventails. Il est donc très difficile de ne pas en sectionner une partie, ce qui entraîne des problème d'impuissance.
Le robot, lui, peut guider le scalpel du chirurgien en fonction des résultats d'imagerie médicale qui lui sont transmis en temps réel et mettent en évidence les nerfs. Il diminuerait donc fortement le risque d'impuissance. Techniquement, je crois que cela se fait en simulant une résistance plus importante dans les commandes de l'appareil quand le scalpel approche d'une région plus riche en nerfs.
Cela se passe dans un contexte de dépistage et d'opérations très, et beaucoup de médecins disent trop, fréquentes. Le même ami m'a dit qu'on repérait et opérait ainsi nombre de tumeurs qui n'auraient jamais évolué en cancer, prenant à chaque fois le risque de laisser le patient impuissant. Dans ces circonstances, le risque qu'un robot ne coupe pas assez peut être considéré comme moins important que celui d'un chirurgien qui coupe trop.
Les deux réponses semblent répondre à l'argument "les ordinateurs sont dangereux, ne les utilisons pas"
DM dit plutot : "les ordi sont cool, on s'en sert donc beaucoup. Dommage qu'il semble qu'il faille attendre des accidents majeurs pour se soucier du développement de programmes safe"
Par exemple, pour l'endoscopie: est-ce que le programme accumule des erreurs de calcul quand il est maintenu en marche pendant plusieurs heures, et ces erreurs se traduiraient elle par la section d'un nombre démesurés de nerfs? Le thread censé contrôler l'interface graphique peut-il malencontreusement altérer des parties critiques de la mémoire destinée au thread qui controle le mouvement du scalpel?
Si oui, c'est regrettable: des solutions techniques existent pour éviter une partie écrasante de ce genre de bugs connus et documentés; seulement, il semble évident que les constructeurs de voitures et de matériel médical sont "unaware" de leur existence même
David, vous semblez méconnaitre la mésaventure de Toyota l'année dernière: des voitures accéléraient sans raison apparente, puis tuaient des gens.
"At least 56 people have died in U.S. traffic accidents in which sudden unintended acceleration of Toyota Motor Corp. vehicles"
http://articles.latimes.com/2010/fe...
j'ai pas cherché sur wikipedia, mais ça doit être documenté
@avs: J'ai entendu parler de problèmes sur les Prius, mais je n'ai jamais pu obtenir de documentation fiable et citable sur le sujet.
"but apparently, one needs no authorization to market medical devices that can kill patients if malfunctioning!"
Pour travailler dans une entreprise qui fabrique de tels equipements, je peux assurer que ce n'est pas le cas, notemment pour les US - voir FDA/510(k) http://www.fda.gov/medicaldevices/p... .
L'obtention du 510(k) est couteuse en temps et en energie (ressources dediees, plusieurs aller-retours avec la FDA, ...).
Je rajouterais que la FDA vient faire regulierement des audits sur nos process, audits tres redoutes, car pouvant conduire a une interdiction de vendre sur le territoire US tout produit provenant d'un etablissement juge non satisfaisant.
Pour l'Europe c'est moins complique...
Pour la Chine, ils commencent, dans quelques annees ils seront au meme niveau d'exigence que les US.
Donc il existe quelque chose... Le probleme est plutot un manque d'uniformite des exigences.
http://www.nhtsa.gov/UA
je crois que le rapport complet est la
@Michel: Ils parlaient du 501(k) dans ce document, mais à ce que j'en ai compris :
- Il n'est pas obligatoire pour toutes les catégories de matériels.
- Il s'agit d'une déclaration et non d'une demande d'autorisation.
Mais peut-être ai-je mal compris ?Je me suis renseigné, les personnes les plus au courant sont bien évidemment en vacances, mais j'ai trouvé quelqu'un, et voici ce qu'on m'a répondu sur ce qu'exige la FDA pour nos produits classe III - "Class III devices are those that support or sustain human life, are of substantial importance in preventing impairment of human health, or which present a potential, unreasonable risk of illness or injury":
S'il s'agit d'une nouvelle technologie, PMA (Premarket Approval) obligatoire. C'est du lourd. Voir http://www.fda.gov/MedicalDevices/D...
Sinon si c'est une technologie existante, même introduite par un concurrent, 510(k). C'est tout un dossier à leur adresser, comprenant entre autres les spécifications utilisateurs et techniques, les risk assessment, les procédures de validation et vérification, les résultats des passages de ces procédures, ...
En gros il faut définir ce que le produit est censé faire, comment on le designe/code/fabrique, comment on vérifie qu'il fait bien ce qu'il est censé faire, comment on vérifie qu'il n'y a pas d'erreurs, ...
On doit prouver aussi que nous avons les process adéquats, que tout est sous contrôle, ...
Depuis peu, on doit aussi utiliser un analyseur statique (Coverity pour nous).
Il y a plusieurs procédures de soumission 510(k) plus ou moins légères (c'est la plus lourde ci-avant) suivant les différences entre le produit à soumettre et une version précédente déjà approuvée.
Mais, si on n'a pas cela, on ne vend pas. J'ai connu il y a quelques années un produit qui pendant un certain temps était vendu partout dans le monde sauf aux USA.
De plus pour soumettre un PMA/510(k) il faut être enregistré. Ce n'est pas une société qui est enregistrée, mais un établissement, qui est alors audité régulièrement.
Cependant je dois ajouter que je travaille dans une grande multinationale, je ne sais pas si les PME/startups par exemple sont soumises aux mêmes règlements.
J'ajouterai que nous sommes ensuite surveillé par les autorités genre FDA/Afssaps/...auxquelles nous avons obligation de reporter tout problème "safety".
J'ai lu le rapport Therac-25, tout à fait conforme à ce que j'ai connu en arrivant dans le milieu médical en 1990. Ca a bien changé depuis, la FDA y est pour beaucoup. Aujourd'hui il ne pourrait pas être vendu.
Maintenant pour être honnête, il faut reconnaître qu'il peut y avoir dans nos softs quelques vieux bouts de codes dont la seule qualification est qu'ils fonctionnent correctement depuis 20 ans.
Nous sommes dans une industrie sans doute pas aussi mature que l'aéronautique sur ces sujets, et il a fallu une grosse opération comme le passage au 64 bits pour que certains de ces points - dont les buffer overflow potentiels - soient vérifiés. Je parle pour notre département, les autres je ne sais pas.
Mais je trouve quand même qu'en une quizaine d'années des progrès énormes ont été faits.
J'aurais plus de doutes dans le cas de l'industrie automobile, pour laquelle j'ai aussi travaillé même si c'était il y 20 ans, qui est soumise à des impératifs économiques encore plus forts que les nôtres.
Pour finir ce gros pavé, un sujet de réflexion: j'ai dû corriger une régression dans le soft due à un mauvais fix d'un warning Coverity, et qui en plus aurait été un problème safety si le produit était sorti avec... C'est bien d'avoir de beaux outils, encore faut-il s'en servir correctement.
@Michel: Oui, il y a un risque certain que les gens introduisent des erreurs en voulant à toute force supprimer un avertissement. C'est ce qui est arrivé quand le mainteneur du paquet Debian OpenSSL a supprimé du code qui faisait des lectures à des adresses non initialisées...
De plus, il faut savoir que Coverity n'est ne garantit ni correction ni complétude : autrement dit, il fournit à la fois des faux positifs et des faux négatifs, il avertit à propos de problèmes inexistants mais peut omettre des problèmes existants. Polyspace et Astrée (sous l'hypothèse qu'ils ne soient pas buggués) ne fournissent pas de faux négatifs.
Le document de la FDA que je cite explique en effet que les produits classe III sont très réglementés, mais que pour les produits classe I ce n'est pas le cas, et j'avais l'impression que les pompes à perfusion sont de la classe I... mais je peux me tromper, je ne connais pas cette industrie.
Dans le domaine de l'industrie automobile, il semble qu'une des normes principale soit MISRA C qui semble assez pauvre, des fois mal écrite (en tout cas bien moins rigoureuse qu'un standard ISO ou ITU-T) mais surtout ne s'attaquer qu'à des problèmes de "surface" par exemple en se contentant d'enjoidre de ne pas utiliser de constructions du langage C au comportement non spécifié (ce qui n'est pas une mauvaise injonction, mais il faudrait juste aller beaucoup plus loin)
J'espère que l'industrie va plus loin car au final MISRA C me semble une espèce de sous-ADA mal défini. Cf. par exemple l'opinion d'un membre du comité UK de normalisation du C -- qui pense carrément que certaines règles sont absurdes : http://www.knosof.co.uk/misracom.ht...
Pas très rassurant pour les utilisateurs d'automobiles, si les industriels de ce domaine ne sont pas soumis à des réglementations ou n'utilisent pas des normes plus sérieuses.
Monsieur Monniaux:Vous avez raison! Static Analysis is very important when it comes to making better software. Also a lot of software companies are jumping on the benefits of static analysis, like Parasoft has lots of information to share: http://www.parasoft.com/jsp/capabil...