Accueil🇫🇷Chercher

Bug (informatique)

En informatique, un bug (prononcé en français : /bœg/[note 1]) ou bogue[note 2] est un défaut de conception d'un programme informatique à l'origine d'un dysfonctionnement.

Le Mac triste : écran indiquant un code erreur sur les premières versions du MacIntosh d'Apple.

La gravité du dysfonctionnement peut aller de bénigne, causant par exemple des défauts d'affichage mineurs — on parlera alors parfois dans ce cas de « glitch(es) » — à majeure, tels un plantage du système pouvant entraîner de graves accidents, par exemple la destruction en vol de la première fusée Ariane 5, en 1996.

Un bug peut résider dans une application, dans les logiciels tiers utilisés par cette application, voire dans le firmware d'un composant matériel comme ce fut le cas du bug de la division du Pentium[note 3]. Un patch est un morceau de logiciel destiné à corriger un ou plusieurs bugs.

Description

Les bugs sont une des causes de dysfonctionnement des appareils informatiques ; parmi les autres causes de dysfonctionnement, on trouve :

  • Les erreurs de manipulation, les virus informatiques — des logiciels malveillants qui falsifient les logiciels prĂ©sents dans l'appareil. Mais aussi le dĂ©passement des capacitĂ©s du matĂ©riel - mĂ©moire pleine, rĂ©seau saturĂ©, processeur occupĂ© - ainsi que l'absence de compatibilitĂ©, les pannes du matĂ©riel informatique, les valeurs incorrectes des paramètres de configuration et les influences extĂ©rieures (tempĂ©rature et champs magnĂ©tiques).
  • Un bug peut provoquer un plantage c'est-Ă -dire un arrĂŞt inattendu d'un logiciel voire d'importantes pertes d'informations ou dans des cas extrĂŞmes une vĂ©ritable catastrophe (voir explosion du vol 501 de la fusĂ©e Ariane 5). Une faille de sĂ©curitĂ© est un dĂ©faut mineur qui ne provoque pas de dysfonctionnement en utilisation courante, mais permet Ă  un utilisateur malicieux ou un logiciel malveillant d'effectuer des opĂ©rations non autorisĂ©es Ă  partir d'un exploit.
  • Un système critique est un dispositif informatique dont le dysfonctionnement peut mettre en danger la santĂ© et la vie des gens et des Ă©cosystèmes, provoquer des importants dĂ©gâts matĂ©riels ou avoir des rĂ©percussions sur la stabilitĂ© Ă©conomique et politique.

Terminologie

Le mot anglais bug appartient au jargon des ingénieurs de matériel et représentant les problèmes qui y survenaient. L'utilisation du terme pour décrire les défauts de systèmes mécaniques date d'au moins avant les années 1870. Thomas Edison, entre autres, utilisait le mot dans ses notes[1].

Le terme « bogue » est référencé dans le dictionnaire Larousse en ligne avec pour définition : « Défaut de conception ou de réalisation d'un programme informatique, qui se manifeste par des anomalies de fonctionnement de l'ordinateur[2]. »

Photo du « premier cas réel de bug (insecte) », dans le journal d'entretien du Harvard Mark II conservé à la Smithsonian Institution.

Le Trésor de la langue française informatisé ne retient le mot « bogue » que dans son acception de « Enveloppe piquante de la châtaigne, de la faîne, de la noisette et de certaines graines de légumineuses »[3].

La Commission d’enrichissement de la langue française, l'Office québécois de la langue française et la Direction de la langue française (Belgique) recommandent le terme « bogue » ainsi que les dérivés déboguer, débogage et débogueur[4] - [5] - [6]

Le terme est parfois faussement attribué à Grace Hopper. Elle constata dans son journal d'entretien, conservé à la Smithsonian Institution, en date du , 15 h 45, que deux contacts d'un relais causaient le mauvais fonctionnement du Harvard Mark II, l'un des premiers ordinateurs électromécaniques[7].

Hopper ne trouva pas le bug, comme elle le reconnaissait volontiers. Les opérateurs qui l'ont trouvé plus tard, y compris William « Bill » Burke, du laboratoire d'armes naval étaient familiers avec le terme d'ingénierie et amusés ont gardé l'insecte avec l'annotation « premier cas réel de bug trouvé »[8] - [9] - [7].

« Bug » était un terme utilisé par les ingénieurs en mécanique et électricité, expliquant les anomalies rencontrées dans l'équipement, longtemps avant que Grace Hopper eût entendu parler de ce mot[7] - [note 4].

Causes

Dans son livre paru en 1987, Frederick Brooks dit que la présence de bugs dans les logiciels n'est pas un accident mais est due à la nature même des logiciels, autrement dit, il existe des bugs dans les logiciels parce que ce sont des logiciels. Il dit également qu'il n'existe pas de balle en argent - un outil miracle - pour parer aux bugs, faisant ici allusion à une légende du Moyen Âge[10] selon laquelle seule une balle en argent, évocatrice de la couleur de la Lune, peut parer au loup-garou[11].

Les logiciels sont des produits invisibles et immatériels, leur modification ne requiert pas de matière première. L'évolution très rapide du marché informatique engendre une forte demande en changement. Tous ces facteurs font que les changements dans les logiciels sont beaucoup plus fréquents que dans d'autres produits tels que les automobiles ou les bâtiments[11].

Les ordinateurs sont parmi les produits les plus complexes que l'homme ait fabriqué, et ils ont par conséquent un très grand nombre d'états. Les logiciels sont plus complexes que les ordinateurs, et, contrairement à une automobile, aucune pièce ne se ressemble. La conformité à de nombreuses normes, caractéristique des domaines proches de la télécommunication, accroît la complexité de ces derniers. Les logiciels sont de plus des produits invisibles, qui ne peuvent pas être représentés dans un espace géométrique, les représentations graphiques de logiciels comportent souvent deux, voire trois ou quatre diagrammes qui correspondent chacun à une réalité différente[11].

Conséquences

Erreurs

Les bugs peuvent amener les logiciels à tenter d'effectuer des opérations impossibles à réaliser (exceptions) : division par zéro, recherche d'informations inexistantes. Ces opérations - qui ne sont jamais utilisées lors de fonctionnement correct du logiciel - déclenchent un mécanisme à la fois matériel et logiciel qui met alors hors service le logiciel défaillant, ce qui provoque un crash informatique ou un déni de service.

Un chien de garde est un dispositif électronique autonome qui sert à déceler les dysfonctionnements. Ce mécanisme est souvent utilisé avec les systèmes critiques et l'informatique industrielle.

L'écran bleu de la mort est, dans le langage populaire, le nom donné au message de mise hors service des systèmes d'exploitation Microsoft Windows, qui s'affiche lorsqu'une exception est décelée au cœur du système d'exploitation. La Kernel panic est le message affiché dans des conditions similaires sur les systèmes d'exploitation UNIX.

Dysfonctionnements courants

Une fuite de mémoire est un dysfonctionnement dû à un bug dans les opérations d'allocation de mémoire. Avec ce dysfonctionnement, la quantité de mémoire utilisée par le logiciel défaillant va en augmentant continuellement. Si le logiciel défaillant arrive à utiliser la quasi-totalité de la mémoire disponible, celui-ci gêne alors le déroulement des autres logiciels et les entraîne à des dysfonctionnements.

Une erreur de segmentation est un dysfonctionnement dû à un bug dans des opérations de manipulations de pointeurs ou d'adresses mémoire. Le logiciel défaillant va tenter de lire ou d'écrire des informations dans un emplacement de mémoire (segment) qui n'existe pas ou qui ne lui est pas autorisé. Le mécanisme de détection des exceptions provoque alors la mise hors service du logiciel défaillant.

Un dépassement d'entier est un dysfonctionnement dû à un bug dans des opérations de calcul mathématique. Le logiciel défaillant va tenter d'effectuer un calcul dont le résultat est supérieur à la valeur maximum autorisée. Le mécanisme de détection des exceptions provoque alors la mise hors service du logiciel défaillant.

Un dépassement de tampon est un dysfonctionnement dû à un bug. Un logiciel qui doit écrire des informations dans un emplacement déterminé et limité de mémoire (mémoire tampon) dépasse les limites de cet emplacement et va alors écrire des informations sur un emplacement destiné à un autre usage, cette modification inopinée entraine une exécution erratique du logiciel, qui peut se terminer par une erreur de segmentation ou un dépassement de capacité. C'est une faille de sécurité courante des serveurs qui est souvent exploitée par les pirates informatiques. voir Exploit.

Un dépassement de pile est un dysfonctionnement dans lequel la taille de la pile d'exécution d'un logiciel dépasse la capacité de la mémoire tampon qui la contient, ce qui provoque des dysfonctionnements similaires à un dépassement de tampon. La pile d'exécution est une structure de données stockée en mémoire qui contient l'état du déroulement des automatismes du logiciel (voir processus (informatique)), cette structure est enregistrée dans une mémoire tampon dont la taille est sur-dimensionnée. Un dépassement de pile résulte d'un déroulement erroné à la suite d'un bug.

Une situation de compétition (anglais race condition) est un dysfonctionnement dû à un bug, qui fait que dans un même logiciel deux automatismes qui travaillent simultanément donnent des résultats différents suivant l'automatisme qui termine avant l'autre.

Un interblocage (anglais deadlock) est un dysfonctionnement durant lequel lorsque plusieurs automatismes s'attendent mutuellement, c'est-à-dire qu'ils attendent chacun que l'autre libère les ressources qu'il utilise pour poursuivre. Les ressources restent verrouillées durant les attentes, ce qui peut bloquer d'autres automatismes et par effet domino bloquer l'ensemble du système. Un mécanisme de prévention provoque l'annulation de l'opération lorsque la durée d'attente dépasse le délai admissible (anglais timeout).

Dans le folklore hacker

Plus le code est complexe, plus il est difficile de localiser un bug. Des bugs qui dépendent d'une combinaison de conditions imprévues et improbables sont particulièrement difficiles à localiser. Dans le folklore hacker il existe des catégories de bugs bizarres dont les noms humoristiques sont dérivés de ceux d'éminents scientifiques en physique quantique et en mathématique[12].

  • Heisenbug : (du principe d'incertitude de Heisenberg) un bug qui disparaĂ®t ou se modifie quand on essaye de l'isoler.
  • Mandelbug : (des ensembles de Mandelbrot) un bug dont les causes sont si obscures et complexes que le rĂ©sultat est un comportement chaotique et non dĂ©terministe.
  • Schrödinbug : (du chat de Schrödinger) un bug qui ne se manifeste pas jusqu'Ă  ce que quelqu'un lise le code source, utilise le programme d'une façon peu ou pas usuelle et constate qu'il n'aurait jamais dĂ» fonctionner.
  • Bohr bug : Un bug rĂ©pĂ©table, qui se reproduit lorsqu'un ensemble - mĂŞme inconnu - de conditions sont remplies[13].

L'exécution pas-à-pas d'un logiciel à l'aide d'un débogueur peut provoquer des Heisenbug du simple fait que le logiciel se déroule moins rapidement[13]. Et les situations de compétition peuvent entraîner des Mandelbug, où le comportement du programme est différent à chaque fois que celui-ci est exécuté[14].

Cycle de vie

Description

Les bugs résultent d'erreurs humaines lors des travaux de spécification, de conception, de programmation et de tests de logiciel et de matériel informatique. La complexité grandissante des logiciels, les problèmes de communication, le manque de formation des ingénieurs et la pression des délais et des coûts durant les travaux d'ingénierie sont des facteurs qui tendent à augmenter le nombre de bugs[15].

Les tests de logiciels sont la première mesure pour contrer les bugs. Pour des raisons pratiques (coĂ»t des travaux et dĂ©lais), il n'est pas possible de tester un logiciel dans toutes les conditions qu'il pourrait rencontrer lors de son utilisation et donc pas possible de contrer la totalitĂ© des bugs : un logiciel comme Microsoft Word compte 850 commandes et 1 600 fonctions, ce qui fait un total de plus de 500 millions de conditions Ă  tester[16].

L'utilisation de langages de programmation de haut niveau, qui facilitent le travail de l'ingénieur, et la mise en application de conventions de rédaction sont d'autres techniques préventives destinées à diminuer le nombre de bugs.

Le débogage est l'activité qui consiste à diagnostiquer et corriger des bugs. Lors du débogage en ligne, l'ingénieur exécute le logiciel pas à pas et effectue après chaque pas une série de vérifications. Lors du débogage post-mortem, l'ingénieur examine un logiciel à la suite d'un crash informatique.

Lorsque le bug est décelé et corrigé après la distribution du logiciel, le fournisseur met souvent à disposition un patch, c'est-à-dire un kit qui remplace les parties défaillantes du logiciel par celles qui ont été corrigées.

Système de suivi des bugs

Les ingénieurs utilisent souvent un système de suivi des bugs, c'est-à-dire un logiciel de base de données dans lequel sont inscrits les différents bugs ainsi que les travaux réalisés pour chacun :

  • une personne (dĂ©veloppeur, testeur, utilisateur...) qui voit quelque chose qui lui semble anormal remplit un formulaire, qui crĂ©e une entrĂ©e dans la base de donnĂ©es et lui affecte un numĂ©ro ;
  • ensuite, un expert effectue une analyse, il regarde s'il s'agit rĂ©ellement d'un bug ou d'une mĂ©prise (manuel pas clair par exemple, ou utilisateur mal formĂ©) ;
  • si une correction est possible (peut ĂŞtre aussi bien une correction dans le code qu'une prĂ©cision Ă  ajouter dans le manuel, une spĂ©cification Ă  corriger, une traduction Ă  amĂ©liorer...), la dĂ©cision est prise de faire une correction ou pas, et avec quelle prioritĂ©. Le travail Ă  faire est gĂ©nĂ©ralement affectĂ© Ă  quelqu'un en particulier ;
  • puis, la personne dĂ©signĂ©e traite le problème, et indique que le problème est rĂ©glĂ© ;
  • gĂ©nĂ©ralement, une confirmation par une tierce personne (testeur, autre dĂ©veloppeur, utilisateur...) est requise ;
  • si tout va bien, le problème est clos. Sinon, le problème est rouvert et le cycle recommence.

Mesures préventives

De nombreux langages de programmation incluent des mécanismes de vérification des dysfonctionnements. Les instructions nécessaires aux vérifications sont ajoutées automatiquement au code machine ou au bytecode du logiciel lors de la compilation. Les instructions peuvent provoquer l'activation automatique du débogueur, le logiciel de diagnostic des bugs.

La revue de code consiste à soumettre le code source fraîchement développé à une tierce personne qui va le relire et rechercher des défauts.

Les tests logiciel sont la première mesure pour contrer les bugs. Ils consistent à utiliser le logiciel dans le plus de conditions possibles. Le but des tests est de déceler différents problèmes :

  • le logiciel ne fait pas ce qu'il doit faire ;
  • le logiciel fait quelque chose qu'il ne doit pas faire ;
  • le logiciel fait quelque chose qui ne lui est pas demandĂ© ;
  • le logiciel ne fait pas bien ce qu'il doit faire (ex. : trop lentement[17]).

Les tests sont répétés plusieurs fois, à mesure de l'avancée de la programmation et des corrections, ceci afin de valider les corrections et déceler d'éventuels bugs de régression : des bugs survenus à la suite de la correction erronée d'un autre bug. Les tests peuvent être automatisés à l'aide de logiciels qui agissent à la place de l'utilisateur. Parfois un second logiciel est développé pour servir aux tests.

Les tests unitaires consistent à utiliser une fonction unique du logiciel en vue de déceler des dysfonctionnements. Les tests d'intégration consistent à utiliser un ensemble de fonctions en vue de contrôler la cohérence de l'ensemble. Les tests de validation consistent à utiliser l'ensemble du logiciel en vue d'évaluer son adéquation au besoin de l'acheteur.

Les tests unitaires et d'intégration sont typiquement effectués par l'ingénieur, tandis que les tests de validation sont typiquement effectués par l'acheteur ou son représentant.

Une autre mesure préventive pour éviter les bugs est la preuve formelle (ou démonstration mathématique) du fonctionnement du programme, de manière générique. Contrairement au test qui ne vérifie qu'un seul cas de fonctionnement donné, cette preuve cherche à assurer que le programme fonctionne dans tous les cas, quelles que soient les conditions d'utilisation. Mais toutes les techniques de vérification formelles sont lourdes et complexes. Dans l'absolu, on ne sait pas vérifier le bon fonctionnement d'un programme quelconque dans tous les cas. En revanche, il existe des méthodes de création de logiciels, qui, au cours de la création du logiciel, mettent en place des éléments de suivi du passage vers chaque étape intermédiaire entre les spécifications ou le cahier des charges du logiciel d'une part, et le programme final d'autre part. Grâce à ces éléments de suivi, des vérifications sont ensuite possibles, et des contraintes de respect de la spécification peuvent être imposées et verrouillées.

Dans les domaines où un bug causerait la mort d'êtres humains, (par exemple dans l'aéronautique), des méthodes lourdes et complexes sont utilisées pour prouver l'absence de bug dans le logiciel, lors de sa conception. Ainsi, le logiciel de contrôle du métro automatique ligne 14 à Paris a été à l'origine réalisé avec la notation Z. Pourtant, c'est la Méthode B qui a été utilisée pour en créer la version finale[18]. La méthode B est d'ailleurs considérée comme le meilleur outil pour garantir qu'un programme informatique est conforme aux spécifications de son comportement. En effet, l'utilisation de la Méthode B pour créer le programme conduit aussi (automatiquement) à démontrer mathématiquement la conformité du programme ainsi créé, qui devient donc par définition un théorème démontré.

Cependant, la complexité d'utilisation de cette méthode entraine un surcroit de travail tel, qu'un programmeur seul peut avoir besoin de 100 fois plus de temps pour créer un programme avec cette méthode que s'il avait créé le même programme de manière traditionnelle. Cela signifie alors que cela coute 100 fois plus cher de créer le programme avec cette méthode. En conséquence, malgré son efficacité, cette méthode n'est que très rarement utilisée, et il existe de nombreux domaines dans lesquels des bugs peuvent causer la mort d'êtres humains et où l'on se contente pourtant de créer des programmes bourrés de bugs, de manière traditionnelle, puis de faire des tests très rigoureux pour en éliminer la plupart. À partir du moment où la probabilité qu'un bug crée un dysfonctionnement qui tue des gens reste inférieure à la probabilité qu'une erreur humaine crée le même genre de dysfonctionnement, cela est souvent jugé « acceptable ». (Et le surcout entrainé par l'utilisation de la méthode B pour garantir que personne ne meurt est jugé inacceptable).

DĂ©bogage

Pour le débogage[note 5] (de l'anglais : « debugging »), soit la recherche et la correction de bugs, les ingénieurs se servent d'un logiciel, le débogueur, ainsi que d'un système de suivi des bugs.

Le système de suivi des bugs sert à coordonner les travaux de débogage, il est utilisé pour collecter tous les dysfonctionnements constatés, inscrire les causes et les actions de correction effectuées et ainsi suivre l'avancement des corrections. Les causes peuvent être des bugs, mais aussi des défauts dans les paramètres de configuration ou des erreurs de manipulation. Le système de suivi des bugs est utilisé aussi bien par les usagers du logiciel défaillant que par les ingénieurs ou les administrateurs systèmes.

Le débogueur permet d'analyser l'état d'exécution d'un logiciel à un instant donné, les opérations en cours, les informations en mémoire, les fichiers ouverts, etc. Avec un débogueur en ligne, il est possible de suspendre l'exécution du logiciel à tout moment, d'analyser l'état, puis de continuer les traitements.

Avec un débogueur post-mortem, il est possible d'analyser l'état d'exécution d'un logiciel après un crash. L'analyse se fait sur la base d'un fichier qui contient la copie du contenu de la mémoire au moment du crash. Fichier appelé core dump sur les systèmes d'exploitation Unix.

Après la correction

Une version de logiciel est l'état d'un logiciel à une date donnée, y compris toutes les corrections et améliorations qui ont été faites jusqu'à cette date. La version est dite alpha ou beta lorsqu'elle correspond à l'état du logiciel avant la fin de la durée des tests. Une telle version est susceptible de contenir des bugs qui ont entretemps été décelés et corrigés.

Une fois un ou plusieurs défauts corrigés, ceux-ci sont regroupés dans un patch, un kit qui contient uniquement les composants du logiciel qui ont été corrigés. Il sera utilisé par toute personne qui possède une copie du logiciel pour y appliquer les corrections et le faire correspondre à une version donnée.

Quelques bugs célèbres

En astronautique

L'échec du vol inaugural de la fusée Ariane 5 en 1996 a pour origine un défaut dans les appareils d'avionique de la fusée, appareils utilisés avec succès pendant plusieurs années sur la fusée Ariane 4. Lors du décollage, l'appareil informatique qui calculait la position de la fusée en fonction de son accélération ne supporta pas les accélérations d'Ariane 5, 5 fois plus fortes que celles d'Ariane 4. Un dépassement d'entier provoqua le crash informatique de l'appareil. Aveuglé, le pilote automatique perdit le contrôle de la fusée, et un dispositif de sécurité provoqua son autodestruction quelques secondes après le décollage. C'est l'un des bugs informatiques les plus coûteux de l'histoire[19].

En 1962, la mission Mariner 1 a connu un incident similaire[20].

Dans le domaine médical

Dans les années 1980, un bug affectant le logiciel d'une machine de radiothérapie pilotée par un PDP-11, le Therac-25[21], a eu des conséquences tragiques, des patients reçurent des doses massives de radiation et au moins cinq en sont morts.

Bug de l'an 2000

Le bug de l'an 2000, aussi appelé bug du millénaire : un ou plusieurs bugs dans un logiciel qui manipule des dates provoquent des dysfonctionnements lorsque les dates sont postérieures au 31 décembre 1999. Une des causes est que les calculs sur les dates se faisaient uniquement sur les deux derniers chiffres de l'année.

Les problèmes potentiels posĂ©s par la date du 31 dĂ©cembre 1999 ont Ă©tĂ© anticipĂ©s la première fois par Bob Berner en 1971[22]. Ils ont provoquĂ© une importante mobilisation des entreprises de gĂ©nie logiciel quelques annĂ©es avant la date butoir et le coĂ»t total des travaux de contrĂ´le et de maintenance prĂ©ventive est estimĂ© Ă  plus de 600 millions de dollars[23].

En 2002, le système informatique de l'hĂ´pital St Mary's Mercy dans le Michigan a dĂ©clarĂ© par erreur la mort de 8 500 patients qui Ă©taient en fait encore vivants, envoyant Ă  leur domicile une facture et une dĂ©claration de dĂ©cès, ainsi qu'une annonce de leur mort Ă  leur sociĂ©tĂ© d'assurance et Ă  la sĂ©curitĂ© sociale amĂ©ricaine[24]. Il a fallu plusieurs semaines pour que ces dĂ©cès soient annulĂ©s auprès des diffĂ©rentes administrations.

Approche formelle : les méthodes formelles

Un bug peut ĂŞtre, soit :

  • un non-respect de la spĂ©cification du système (c'est-Ă -dire de la dĂ©finition de ce que le système est censĂ© faire) ;
  • un comportement inattendu non couvert par la spĂ©cification (par exemple, cas non prĂ©vu de deux actions contradictoires Ă  traiter simultanĂ©ment, cas du bug de l'an 2000).

Une spécification peut être informelle et vague (comme : « le logiciel est un traitement de textes qui ne provoque pas d'erreur à l'exécution »), ou formelle et précise (« tri(t) est une permutation de t telle que tri(t) est ordonnée pour la relation < »), y compris au point d'obtenir des formules mathématiques. En supposant la spécification la plus complète possible, un programme bogué est un programme dont la mise en œuvre ne vérifie pas cette spécification.

On peut se demander s'il existe des méthodes universelles, sans faille et automatiques, qu'il suffirait de suivre pour se rendre compte si un programme est bogué ou non. La réponse est non. En effet, si une telle méthode existait, il serait possible de l'automatiser par un ordinateur, c'est-à-dire par un logiciel d'analyse. Cet analyseur devrait opérer sur des programmes à analyser quelconques et devrait, par exemple, répondre à la question suivante : « l'état final du programme peut-il être un état d'erreur à l'exécution, ou est-il forcément un état correct (ou une non-terminaison) ». Or, le théorème de Rice dit qu'on ne peut répondre à cette question sur un système à état infini. Plus généralement, toute question de spécification portant sur l'état final du programme est indécidable, c'est-à-dire qu'un logiciel ou une méthode automatique ne peut y répondre, sauf pour les questions dont la réponse est toujours vraie ou toujours fausse.

On pourrait objecter que les ordinateurs sont des systèmes à état fini : chaque ordinateur a une quantité finie de mémoire. Cependant, à l'exception de systèmes de très petite taille, il convient, à des fins d'analyse, de considérer les ordinateurs comme des systèmes à mémoire non bornée. En effet, les techniques d'analyse utilisant la finitude de l'état vont toutes, de façon plus ou moins détournée ou optimisée, chercher à énumérer les états du système. Un système à n bits de mémoire a 2n états ; dans un ordinateur personnel actuel, n est de l'ordre de 238. On voit donc que toute tentative d'énumération des états du système est vouée à l'échec.

L'impossibilité de la recherche automatique universelle des bugs est donc un problème d'ordre fondamental, et non une limitation de la technologie actuelle.

Comment s'en défaire ?

L'industrie du développement logiciel fait de gros efforts pour trouver des méthodes de prévention des erreurs des programmeurs menant à des bugs.

  • « La ligne de code la plus sĂ»re au monde est celle que l'on n'Ă©crit pas ! » : rechercher la simplicitĂ© et la simplification, la cohĂ©rence, la rĂ©utilisation de code ou de librairies Ă©prouvĂ©es, puis Ă©tablir des règles de codage et de politique de nommage claire.
  • Les règles de programmation. On s'impose l'uniformitĂ© du style d'Ă©criture (rĂ©duit la confusion possible pour les autres dĂ©veloppeurs) et l'Ă©criture de documentations dĂ©taillĂ©es. Typiquement, l'Ă©criture de programmes devra suivre un processus formalisĂ© en Ă©tapes successives et documentĂ©es.
  • Les techniques de programmation. Un bug peut parfois crĂ©er des incohĂ©rences dans les donnĂ©es internes d'un programme en fonctionnement. Les programmes peuvent ĂŞtre Ă©crits pour vĂ©rifier la cohĂ©rence des donnĂ©es internes durant leur exĂ©cution. Si un problème est trouvĂ©, le logiciel peut s'arrĂŞter immĂ©diatement pour que le bug puisse ĂŞtre trouvĂ© et rĂ©parĂ©, ou simplement avertir l'utilisateur, essayer de corriger l'incohĂ©rence et continuer Ă  fonctionner. De plus, on peut interdire ou du moins sĂ©vèrement rĂ©glementer l'usage de fonctionnalitĂ©s de maniement dĂ©licat du langage de programmation ou du système.
  • Les mĂ©thodologies de dĂ©veloppement. Il y a plusieurs mĂ©thodes pour gĂ©rer l'activitĂ© des programmeurs afin de minimiser les risques de bugs. Plusieurs de ces techniques relèvent de la spĂ©cialitĂ© du gĂ©nie logiciel.
  • Le support des langages de programmation. Les langages incluent parfois des fonctionnalitĂ©s qui aident les programmeurs Ă  traiter les bugs, comme le traitement des exceptions. De plus, plusieurs langages rĂ©cents ont dĂ©libĂ©rĂ©ment exclu des fonctions avancĂ©es susceptibles de mener Ă  des bugs. Par exemple, les langages Java et Perl n'offrent pas d'accès de bas niveau aux pointeurs, Ă©vitant qu'un programme n'accède Ă  une zone de la mĂ©moire par inadvertance.
  • Le test. Le logiciel est essayĂ© dans diverses configurations, notamment des configurations difficiles et « extrĂŞmes ». On va aussi tenter de couvrir toutes les fonctionnalitĂ©s, ou toutes les portions de code du logiciel, ou tous les chemins dans le code (ce dernier critère est en gĂ©nĂ©ral impossible Ă  atteindre). Cependant, le test ne donne pas d'assurance sur le bon fonctionnement du logiciel dans tous les cas, car il ne tient compte que d'un nombre limitĂ© de configurations du système, d'entrĂ©es des utilisateurs ou du monde extĂ©rieur…
  • Les mĂ©thodes formelles. Il s'agit ici de parvenir Ă  une preuve, au sens mathĂ©matique, de bon fonctionnement du logiciel. La mĂ©thode peut fournir plus ou moins d'automatisation : les assistants de preuve aident un utilisateur Ă  formuler une preuve mathĂ©matique et la vĂ©rifient ; le model checking et l'analyse statique par interprĂ©tation abstraite sont automatiques ; il existe des gradations intermĂ©diaires. Citons par exemple la MĂ©thode B, utilisĂ©e pour la ligne 14 (Meteor) du mĂ©tro parisien[18].

Trouver et corriger les bugs, ou déboguer, est une partie majeure de la programmation de logiciels. Maurice Vincent Wilkes, pionnier de l'informatique, décrit ses réalisations des années 1940 en disant que l'essentiel du reste de sa vie serait occupé à réparer les erreurs dans ses propres programmes. Alors que les programmes informatiques deviennent de plus en plus complexes, les bugs deviennent plus fréquents et difficiles à corriger. Quelquefois, les programmeurs passent plus de temps et d'efforts à trouver et à corriger les bugs qu'à écrire du nouveau code.

Habituellement, la partie la plus difficile du débugage est de trouver la partie du code responsable de l'erreur. Une fois localisée, la corriger est souvent facile. Des programmes appelés débogueurs existent afin d'aider les programmeurs à trouver les bugs. Toutefois, même avec l'aide d'un débogueur, dénicher un bug est une tâche souvent très difficile.

Ordinairement, la première étape pour trouver un bug est de trouver un moyen de le reproduire facilement. Une fois le bug reproduit, le programmeur peut utiliser le débogueur ou un autre outil pour observer l'exécution du programme dans son contexte habituel, et éventuellement trouver le problème. En revanche, il n'est pas toujours facile de reproduire un bug. Certains sont causés par des entrées au logiciel qui peuvent être difficiles à reproduire pour le programmeur. D'autres peuvent disparaître quand le programme est lancé dans un débogueur ; ceux-ci sont appelés heisenbugs (faisant, par plaisanterie, référence au principe d'incertitude de Heisenberg). Enfin, les bugs des programmes parallèles (composés de plusieurs modules s'exécutant de façon concurrente, par exemple sur plusieurs processeurs) sont souvent difficiles à reproduire s'ils dépendent de l'ordonnancement précis des calculs sur la machine.

Humour et citations célèbres liées aux bugs

  • « Ce n'est pas un bug, c'est une fonctionnalitĂ© non documentĂ©e ! (It's not a bug, it's an undocumented feature). »
Réponse fréquente (et teinte d'humour) des développeurs de logiciels à leurs utilisateurs[note 6].
  • « Tout programme non trivial possède au moins un bug (Every non-trivial program has at least one bug). »
Tiré de la loi de Murphy appliquée à l'informatique.
  • « L'erreur est humaine, mais un vrai dĂ©sastre nĂ©cessite un ordinateur. »
Une petite erreur dans un logiciel peut entraîner de nombreuses conséquences par effet « boule de neige ».
  • « Quand un logiciel n'a plus aucun bug, il est gĂ©nĂ©ralement obsolète. »
L'objectif « zéro bug » nécessite un temps de développement généralement très important, à comparer à la durée de vie espérée du logiciel.

Dans les jeux vidéo

Le terme de bug dans les jeux vidéo a pour signification première une erreur dans le déroulement supposé d'une action. La résultante finale du bug n'occasionnera pas la même gêne suivant son intensité. Une main d'un joueur traversant un mur dans un FPS n'aura pas la même nuisance qu'une impossibilité d'accomplir la quête principale d'un jeu de rôle.

L'existence des bugs n'apportent pas que des points négatifs :

  • la recherche et la correction de bugs dĂ©montrĂ©s permettent souvent une correction d'autres bugs inconnus Ă  ce jour et/ou une optimisation du code source, ce qui est très profitable au joueur (jouabilitĂ© amĂ©liorĂ©e) comme au dĂ©veloppeur (le support technique rĂ©gulier d'un jeu est un gage de renommĂ©e) ;
  • la popularitĂ© exceptionnelle d'un jeu qui connaĂ®t toutefois des bugs est souvent initiatrice d'une communautĂ© très prolifique, capable de corriger ces bugs Ă  l'aide de diffĂ©rents outils. Le jeu le plus symbolique de ce phĂ©nomène est certainement Fallout 2 ;
  • certains bugs peuvent ĂŞtre profitables Ă  des joueurs plus ou moins mal intentionnĂ©s. Dans les parties jouables en rĂ©seau (sur Internet ou en rĂ©seau local), les bugs exploitables sont duaux : soit ils sont source de destruction du fair play (notamment dans les jeux de tir subjectif), soit ils permettent une avancĂ©e spectaculaire et peuvent, par le fait, s'apparenter Ă  de la triche ;
  • dans les concours de Speedrun, certains bugs sont très profitables afin de finir un jeu ou une sĂ©quence le plus rapidement possible.
  • le jeu Goat Simulator est prĂ©sentĂ© par ses dĂ©veloppeurs comme "bourrĂ© de bugs", seuls ceux faisant crasher le jeu ont Ă©tĂ© retirĂ©s, ce qui a contribuĂ© Ă  sa popularitĂ©.

Le terme de bug englobe d'autres notions moins usitées à cause de la popularité du nom de bug. Il serait judicieux de nommer certaines erreurs par « oubli » plutôt que par bug.

Notes et références

Notes

  1. Prononciation en français européen retranscrite phonémiquement selon la norme API.
  2. Recommandé en France par la Délégation générale à la langue française et aux langues de France (DGLFLF), au Canada et en Belgique. Voir la section terminologie.
  3. Bug qui a affecté les premières versions de ce processeur.
  4. Le départ de l'intrigue du film Brazil est une illustration de cette anecdote : un insecte provoque un court-circuit dans une machine, transformant le nom Tuttle en Buttle ; ici, le bug met à jour les excès de la bureaucratie.
  5. Des orthographes moins courantes sont aussi débuggage, débugage, ou encore déboggage.
  6. Voir l'article Undocumented feature (en), suppositions sur l'origine de l'expression.

Références

  1. Edison to Puskas, , Edison papers, Edison National Laboratory, U.S. National Park Service, West Orange, N.J., cité dans (en) Thomas Hughes, American Genesis : A Century of Invention and Technological Enthusiasm, 1870-1970, New York, Penguin Books, , 529 p. (ISBN 978-0-14-009741-2, OCLC 20318685), p. 75.
  2. « bogue », dictionnaire Larousse (consulté le ).
  3. Informations lexicographiques et étymologiques de « bogue » dans le Trésor de la langue française informatisé, sur le site du Centre national de ressources textuelles et lexicales
  4. Commission d’enrichissement de la langue française, « bogue », sur FranceTerme, ministère de la Culture (consulté le ).
  5. « bogue », Grand Dictionnaire terminologique, Office québécois de la langue française (consulté le ).
  6. Direction de la langue française, « Bogue », sur franca.cfwb.be.
  7. (en) Fred R. Shapiro, « The First Bug : Exposing the myth behind the first bug reveals a few tales », Byte, (version du 6 janvier 2008 sur Internet Archive).
  8. « Log Book With Computer Bug », sur National Museum of American History (consulté le ).
  9. « bug », sur catb.org (consulté le ).
  10. Laurence Gardner, Le Royaume des Seigneurs de l'anneau : Mythes et Magie de la QuĂŞte du Graal, , 383 p. (ISBN 978-2-84454-195-6).
  11. (en) N. W. Heap et al., Information technology and society : a reader, London Thousand Oaks, Calif, Sage Publications in association with the Open University, , 436 p. (ISBN 978-0-8039-7981-9, OCLC 32666928, présentation en ligne).
  12. (en) Guy Hart-Davis, Mastering Microsoft VBA, Hoboken, N.J, Wiley, , 2e Ă©d., 707 p. (ISBN 978-1-4294-6784-1 et 978-0-471-79064-8, OCLC 124065945, lire en ligne).
  13. (en) Andreas Zeller, Why Programs Fail : A Guide to Systematic Debugging, Amsterdam/Boston, Morgan Kaufmann, (ISBN 978-0-12-374515-6, lire en ligne).
  14. (en) Jon Shemitz, .NET 2.0 for Delphi Programmers, Apress, , 544 p. (ISBN 978-1-59059-386-8, lire en ligne).
  15. Debasis Pradhan, « Top 10 reasons why there are Bugs/Defects in Software! » (consulté le )
  16. « Anatomy of a Software Bug – Buggin' My Life Away », sur blogs.msdn.microsoft.com (consulté le )
  17. (en) « Basic software testing concepts ».
  18. Voir : Mise en œuvre de la méthode B.
  19. « 29 bugs informatiques aux conséquences catastrophiques », sur Rocket Projet, (consulté le )
  20. Simson Garfinkel, « History's Worst Software Bugs », Wired,‎ (ISSN 1059-1028, lire en ligne, consulté le )
  21. http://sunnyday.mit.edu/papers/therac.pdf
  22. Baura, Gail D., Engineering ethics : an industrial perspective, Elsevier Academic Press, (ISBN 0-08-045802-5, 9780080458021 et 012088531X, OCLC 76822524, lire en ligne)
  23. (en) « Accessing cost of the millenium bug », sur stanford, .
  24. (en) « Hospital Revives Its "Dead" Patients », sur Baselinemag

Voir aussi

Bibliographie

  • Jean-Louis Boulanger, Mise en Ĺ“uvre de la mĂ©thode B : DĂ©veloppement formel des logiciels sĂ©curitaires de Meteor, (lire en ligne)

Articles connexes

Voir aussi la catégorie Développement logiciel

Liens externes

Cet article est issu de wikipedia. Text licence: CC BY-SA 4.0, Des conditions supplémentaires peuvent s’appliquer aux fichiers multimédias.