ch-verification.tex 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552
  1. % vim:spell spelllang=fr
  2. \chapter{Vérification du logiciel}
  3. \label{ch:verification}
  4. %10p
  5. %exemple heartbleed :
  6. %http://xkcd.com/1354/
  7. %http://imgs.xkcd.com/comics/heartbleed_explanation.png
  8. Il est extrêmement difficile de garantir l'absence totale d'erreurs
  9. dans un logiciel. Et cette tâche est d'autant plus ardue que le logiciel est
  10. complexe. Les bogues pouvant avoir des conséquences désastreuses et
  11. coûteuses, il est nécessaire de valider, vérifier et tester le logiciel avant
  12. leur mise en production. Dans ce chapitre, nous présentons le contexte de la
  13. vérification du logiciel dans lequel ce travail s'inscrit. Nous expliquons
  14. différentes approches pour vérifier le
  15. logiciel~\ref{ch:verification:sec:approches}. Nous présentons aussi la
  16. qualification et la certification~\ref{ch:verification:sec:certifqualif} qui
  17. exigent une traçabilité.
  18. %Therac-25 (juillet 1985 -> avril 1986) / Ariane 5 (4 juin 1996) / crash AT&T (15 janvier 1990) / Pentium (juin 1994) / banque de New-York (21 novembre 1985)
  19. %\todo{VVT : Validation, Vérification, Test}
  20. %ch3 : validation et vérification des transformations -> biblio
  21. %
  22. %approches pour le logiciels -> relecture, testes
  23. %approches formelles, s'appuient sur spécification -> preuves, MC
  24. %certification, qualification
  25. %=> exigences ; préserver la traçabilité exigences/spécification
  26. %Notre cadre : qu'est-ce qui existe, biblio dessus
  27. %
  28. %approche « validation par la traduction »
  29. \section{Approches pour la vérification du logiciel}
  30. \label{ch:verification:sec:approches}
  31. %intro, définitions, contraintes, outils
  32. %\ttodo{augmenter la qualité du soft, la confiance dans le logiciel :
  33. %vérification. Comment ? tests et simulation ; preuve mathématique ; MC
  34. %(exploration d'espaces d'états, tests exhaustifs, recherche de contre-exemple)}
  35. Dans cette section, nous abordons différentes manières de vérifier le logiciel
  36. afin d'en améliorer sa qualité, et donc la confiance que l'utilisateur peut
  37. avoir dans les logiciels qu'il utilise. Nous présentons d'abord des approches
  38. logicielles pratiques comme la relecture, les tests et la simulation, puis la
  39. preuve et le \emph{model-checking} qui sont des approches formelles.
  40. %~\ref{ch:verification:subsec:relecture},
  41. %les tests~\ref{ch:verification:subsec:test} et la
  42. %simulation~\ref{ch:verification:subsec:simu}, puis la
  43. %preuve~\ref{ch:verification:subsec:preuve} et le
  44. %\emph{model-checking}~\ref{ch:verification:subsec:mc} qui sont des approches
  45. %formelles.% Nous évoquons aussi une approche qui peut être vue comme un
  46. %%compromis : la simulation~\ref{ch:verification:subsec:simu}.
  47. Ces méthodes pour vérifier le logiciel et améliorer sa qualité sont
  48. généralement utilisées de manière conjointe, selon le niveau d'exigence visé
  49. (les contraintes pour une application sur ordiphone ne sont pas les mêmes que
  50. pour celles d'un calculateur de vol).
  51. \subsection{Relecture}
  52. \label{ch:verification:subsec:relecture}
  53. Une première approche évidente pour tout développeur est la relecture de code.
  54. Informelle, elle consiste à parcourir du code développé précédemment et à
  55. s'assurer qu'il est conforme aux exigences. Pour améliorer la fiabilité d'une
  56. relecture, la tendance est de faire relire du code d'un développeur à un autre
  57. développeur n'ayant pas participé au développement, et de croiser les
  58. relectures. Cependant, si cette méthode est largement répandue et encouragée,
  59. elle est loin d'être fiable. En effet, la relecture dépend totalement d'un
  60. relecteur humain dont l'état au moment de la relecture (compétences, fatigue,
  61. concentration, etc.) conditionne le résultat. Si la relecture permet de repérer
  62. les bogues les plus évidents, elle permet difficilement de repérer les plus
  63. subtils. De plus, dépendant des compétences et de l'expérience du relecteur,
  64. cette méthode est fortement soumise à son intuition. Une vérification d'un
  65. logiciel par relecture pourra ainsi être très différente selon le développeur.
  66. Si la relecture est indispensable dans tout développement, elle n'est pas
  67. suffisante pour du logiciel exigeant une forte fiabilité. Elle présente
  68. toutefois l'avantage d'être naturelle à tout développeur ayant suivi une
  69. formation adéquate\footnote{La relecture fait partie intégrante de la
  70. méthodologie du développement généralement enseignée dans les formations en
  71. informatique.} et d'être peu coûteuse : en effet, elle ne nécessite pas de
  72. compétences et d'outils supplémentaires qu'il a été nécessaire pour écrire le
  73. logiciel à relire. Cette approche de vérification peut éventuellement être
  74. suffisante pour des applications peu complexes, non critiques et peu diffusées
  75. (par exemple : un script pour renommer des fichiers dans un répertoire
  76. personnel). Elle reste efficace pour trouver des erreurs et constitue un
  77. élément fondamental de certaines approches agiles.
  78. \subsection{Tests}
  79. \label{ch:verification:subsec:test}
  80. Une seconde approche est de tester tout programme informatique avant sa mise en
  81. production, l'intensité des tests permettant d'obtenir plus d'assurance. Il
  82. existe diverses méthodologies et techniques pour tester du code. On citera par
  83. exemple la mise en place de tests unitaires censés tester des \emph{unités} de
  84. code (fonctions, classes). Des \emph{frameworks} dédiés aux tests unitaires ont
  85. ainsi été développés, comme par exemple
  86. {\junit}\footnote{\url{http://www.junit.org}}. Cela a été popularisé par les
  87. méthodes agiles, notamment \emph{eXtreme Programming}~\cite{Beck2004} qui
  88. repose en partie sur l'approche dirigée par les tests (\emph{Tests Driven
  89. Development}~\cite{Beck2003}). Remarquons que les scénarios de tests peuvent
  90. être considérés comme une forme de spécification. Bien que l'utilisation de
  91. tests permette d'améliorer grandement la qualité du logiciel durant sa phase de
  92. développement en réduisant les défauts~\cite{Williams2003}, la solution des
  93. tests unitaires commence à montrer ses limites lors de développements de
  94. logiciels complexes où les bogues peuvent avoir des origines plus nombreuses.
  95. Du fait des coûts et des délais de développement, il n'est pas rare de ne pas
  96. écrire de tests pour se concentrer sur le logiciel lui-même. Par conséquent,
  97. certaines parties de code ne sont pas testées et sont donc susceptibles de
  98. contenir des bogues. Des techniques de génération automatique de tests ont vu
  99. le jour pour augmenter la couverture de tests et tester au maximum les cas
  100. limites. Nous noterons par exemple
  101. %l'outil DART~\cite{Godefroid2005}
  102. {\quickcheck}~\cite{Claessen2000,Hughes2010} pour tester les programmes
  103. {\haskell}, ainsi que ses implémentations et variantes pour d'autres langages
  104. %telles que {\scalacheck}\footnote{\url{http://code.google.com/p/scalacheck/}}
  105. %pour {\scala}, {\propcheck}\footnote{\url{https://github.com/polux/propcheck}}
  106. %pour le langage {\dart}, {\quickcheck} pour
  107. %{\java}\footnote{\url{https://bitbucket.org/blob79/quickcheck}}~\cite{Earle2013},
  108. %{\rushcheck}\footnote{http://rushcheck.rubyforge.org/} pour {\ruby}, {\etc}
  109. %\ttodo{autres réf et outils ?
  110. %{\junitquickcheck}\footnote{\url{https://github.com/pholser/junit-quickcheck}},
  111. %{\jcheck}\footnote{\url{http://www.jcheck.org/}}, qc = quickcheck pour Python
  112. %\footnote{http://github.com/dbravender/qc}}.
  113. %
  114. tels que {\scala}\footnote{{\scalacheck} :
  115. \url{http://code.google.com/p/scalacheck/}}, {\dart}\footnote{{\propcheck} :
  116. \url{https://github.com/polux/propcheck}}, {\java}\footnote{{\quickcheck}
  117. pour {\java}~\cite{Earle2013} :
  118. \url{https://bitbucket.org/blob79/quickcheck}}, {\ruby}\footnote{{\rushcheck}
  119. : \url{http://rushcheck.rubyforge.org/}}, {\python}\footnote{qc :
  120. \url{http://github.com/dbravender/qc}}, {\etc}
  121. Ces méthodes ont été transposées dans le cadre de l'{\idm}. L'approche dirigée
  122. par les tests~\cite{Giner2009} s'est développée, et des travaux de vérification
  123. par le test ont été menés pour les transformations de
  124. modèles~\cite{Fleurey2004}. Des \emph{frameworks} de test~\cite{Lin2005}, ainsi
  125. que des outils de génération de tests~\cite{Brottier2006,Lamari2007,Sen2009} et
  126. de génération de code tests~\cite{Rutherford2003} ont donc aussi vu le jour,
  127. accompagnés d'outils et de techniques de qualification des données de tests
  128. pour les transformations de modèles~\cite{Fleurey2009}.
  129. Les tests permettent de détecter des comportements anormaux, mais d'autres
  130. comportements anormaux peuvent aussi naître d'une combinaison de comportements
  131. normaux de modules fonctionnels indépendamment. Le problème pouvant alors
  132. provenir d'une incompréhension entre les équipes de développeurs ou entre le
  133. client et le fournisseur (spécification ambiguë). Si l'intégration de tests est
  134. absolument nécessaire dans le processus de développement d'un logiciel, elle se
  135. révèle insuffisante dans le cas du logiciel critique. En effet, tester
  136. intensément un logiciel permet de tester son comportement dans la plupart des
  137. cas, mais rien ne garantit que toutes les situations ont été testées.
  138. %\ttodo{théorie des graphes pour valider les transformations de modèles~\cite{Kuester2006}}
  139. \subsection{Simulation}
  140. \label{ch:verification:subsec:simu}
  141. Il peut aussi être extrêmement difficile de tester correctement un système du
  142. fait de sa complexité, des fortes ressources demandées ou de la particularité
  143. de sa plateforme d'exécution. Les tests écrits et menés durant le développement
  144. peuvent se révéler peu réalistes ou fort éloignés des conditions réelles
  145. d'utilisation. Pour répondre à ce problème de réalisme du comportement d'un
  146. système sous conditions d'utilisation réelles, une approche liée aux tests
  147. revient à simuler le système pour étudier son comportement et
  148. détecter les anomalies. L'intérêt de ce type d'approche est que l'on peut
  149. travailler sur un système qui serait coûteux à déployer pour tester en
  150. conditions réelles. Notons par exemple les domaines du nucléaire ou de
  151. l'avionique qui ne permettent pas aisément (et à faible coût) des tests
  152. logiciels en conditions réelles, en particulier lors des premières étapes de
  153. développement. L'inconvénient de ce type de méthode de vérification est qu'il
  154. faut reproduire fidèlement un environnement et que les tests sont fortement
  155. conditionnés par la plateforme d'exécution sur lesquels ils sont exécutés et
  156. par les technologies employées. Dans le cas d'une informatique simple, la
  157. simulation est une option intéressante, mais sa difficulté de mise en œuvre
  158. croît avec la complexité du système (nombreuses dépendances, systèmes
  159. exotiques, matériel non disponible hors chaîne de production dédiée, modèles
  160. physiques complexes, {\etc}). Ainsi, en aéronautique, il est extrêmement
  161. complexe et coûteux de modéliser intégralement l'environnement afin de simuler
  162. tous les systèmes de l'avion. L'approche adoptée revient alors à procéder à une
  163. succession de phases simulant des modèles de l'environnement mécanique,
  164. physique, des calculateurs, du réseau, du logiciel, {\etc} La dernière étape
  165. avant le vol réel est l'\emph{Aircraft Zero --- Iron Bird} qui intègre toute
  166. l'informatique réelle sur un banc d'essai.
  167. %Par rapport à une preuve formelle, les méthodes de tests ont aussi
  168. %l'inconvénient d'être fortement conditionnées par la plateforme sur lesquels
  169. %ils sont exécutés et par les technologies employées.
  170. \subsection{Preuve}
  171. \label{ch:verification:subsec:preuve}
  172. À l'opposé de ces approches vues comme très pragmatiques et largement utilisées
  173. dans l'industrie, une autre approche pour améliorer la confiance dans un
  174. logiciel consiste à prouver formellement les algorithmes. Le problème est alors
  175. formalisé sous la forme d'axiomes et de buts qu'il faut atteindre en démontrant
  176. des théorèmes. Une preuve mathématique peut être écrite à la main, mais pour
  177. faciliter le processus et pour diminuer les risques d'introduction d'erreurs
  178. liées au facteur humain, des outils assistants à la preuve tels que
  179. {\coq}~\cite{Coq,Bertot2004} et {\isabelle}~\cite{Nipkow2002} ont été
  180. développés. Une preuve {\coq} est censée donner une forte confiance dans le
  181. logiciel développé et prouvé. Cependant, si la preuve de la correction d'un
  182. algorithme donne une garantie irréfutable du bon comportement de cet
  183. algorithme, elle ne donne pas obligatoirement la garantie du bon comportement
  184. du logiciel. En effet, ce sont les algorithmes et les spécifications qui sont
  185. généralement formellement prouvés et non les implémentations
  186. elles-mêmes\footnote{\og Beware of bugs in the above code; I have only proved
  187. it correct, not tried it \fg{} -- D.E. Knuth, 1977 ; citation et explication
  188. accessibles sur sa page personnelle :
  189. \url{http://www-cs-faculty.stanford.edu/~uno/faq.html}}. Or, le facteur
  190. humain n'est pas à négliger, l'implémentation concrète du logiciel dépendant
  191. fortement du développeur et des outils utilisés durant le processus. En
  192. outre, lors d'une preuve, le contexte réel n'est pas forcément pris en compte
  193. et certaines conditions d'utilisation réelles peuvent fortement influencer le
  194. comportement et la fiabilité de l'application. %On peut aussi effectuer un
  195. % raffinement pour finalement extraire le programme depuis la preuve {\coq}.
  196. %\ttodo{réf sur du réel qui ne colle pas avec la preuve : réseau ? gap pratique
  197. %vs théorie car phénomènes physiques (bruit), ou alors physique, bio\\ Preuve de
  198. %transformation de modèles ?}
  199. \subsection{Model-checking}
  200. \label{ch:verification:subsec:mc}
  201. %?\cite{Jhala2009} survey sur le MC
  202. Le \emph{model-checking} est une autre approche formelle que l'on peut
  203. considérer comme étant entre preuve et test. Elle consiste à abstraire
  204. (modéliser) un problème ou un système selon un formalisme (langage) donné, puis
  205. à explorer l'espace d'états possibles de ce système pour vérifier qu'aucun
  206. état ne viole une propriété donnée (un invariant par exemple). On peut
  207. considérer que cela revient à du test exhaustif, ce qui a donc valeur de
  208. preuve. L'intérêt du \emph{model-checking} est que --- contrairement aux tests
  209. --- il est généralement indépendant de la plateforme d'exécution et qu'il
  210. apporte une vérification formelle du système. Par exemple, les outils
  211. {\cadp}\footnote{\url{http://cadp.inria.fr}}~\cite{Garavel2011} et
  212. {\tina}\footnote{\url{http://projects.laas.fr/tina}}~\cite{Berthomieu2004} sont
  213. deux \emph{model-checkers} dont les formalismes d'expression des modèles sont
  214. respectivement LOTOS et les réseaux de Petri. On peut toutefois reprocher au \emph{model-checking} de ne pas
  215. toujours être suffisamment proche de la réalité et d'avoir un coût en
  216. ressources élevé dans le cas de systèmes complexes. Cela a conduit certains à
  217. compléter le \emph{model-checking} par l'analyse à l'exécution sur des
  218. applications réelles simulées~\cite{Bayazit2005}. L'{\idm} reposant sur les
  219. modèles qui sont des abstractions de problèmes, il est naturel d'adopter le
  220. \emph{model-checking} pour vérifier le logiciel produit par ces méthodes. On
  221. peut adjoindre des contraintes aux modèles avec des langages tels qu'{\ocl}
  222. dans le cas de {\uml}, mais un modèle n'est pas nécessairement immédiatement
  223. vérifiable. Il nécessite souvent une ou plusieurs transformations afin de
  224. pouvoir être vérifié au moyen d'un \emph{model-checker}. C'est une approche
  225. courante que d'opérer une suite de transformations permettant de passer du
  226. modèle servant de spécification au modèle vérifiable, ainsi que de la
  227. spécification vers l'application réelle. Cependant, comme précédemment, il
  228. s'agit à nouveau de vérifier un modèle et non pas le code généré réel. Chaque
  229. transformation se doit donc d'être simple afin que l'on puisse garantir la
  230. préservation du comportement d'un pas à l'autre. Ce type d'approche est très
  231. utilisé en {\idm}. Nous notons immédiatement qu'une telle approche pour
  232. s'assurer du bon fonctionnement du logiciel nécessite non seulement une
  233. vérification du modèle, mais aussi une garantie que la transformation elle-même
  234. est correcte.
  235. \section{Certification et qualification}
  236. \label{ch:verification:sec:certifqualif}
  237. %\todo{transfos de modèles, deux formes de vérification :
  238. %\begin{itemize}
  239. % \item avant la transfo une fois pour toutes
  240. % \item après chaque utilisation de la transformation
  241. %\end{itemize}
  242. %Le niveau de certification demandé ainsi que l'utilisation des outils impliqués
  243. %dans le processus de développement de logiciel embarqué impose de vérifier les
  244. %outils.
  245. %}
  246. Le processus de certification n'est pas nécessaire pour tous les logiciels et
  247. tous les secteurs d'activité. Il fait en revanche partie intégrante du
  248. processus de développement logiciel dans le cadre de développement de systèmes
  249. critiques, par exemple dans les domaines de l'aéronautique, de l'automobile (du
  250. transport en général) et de la santé. La loi impose le respect d'exigences en
  251. fonction de crédits de certification demandés.
  252. \begin{definition}[Crédit de certification]
  253. Acceptation par l'autorité de certification qu'un processus, un produit ou
  254. une démonstration satisfait les exigences de certification.
  255. \end{definition}
  256. \begin{definition}[Certification]
  257. Processus d'approbation par une autorité de certification d'un produit.
  258. \end{definition}
  259. %\begin{definition}[Autorité de certification]
  260. % Entité en charge de l'approbation des données de qualification d'outil.
  261. %\end{definition}
  262. Ces exigences sont fixées par des standards de certification : en aéronautique,
  263. le standard actuel est la norme DO-178C/ED-12C\footnote{La notation DO-
  264. correspond au nom donné à ce standard aux États-Unis d'Amérique, tandis que la
  265. notation ED- est celle en vigueur en Europe.}~\cite{DO-178C}. Elle donne des
  266. objectifs (et non des moyens) dont le nombre et le niveau augmentent avec le
  267. niveau de criticité. Ces niveaux de criticité (ou niveaux DAL, pour
  268. \emph{Development Assurance Level}) sont notés de A à E, A étant le plus
  269. critique, E le moins critique :
  270. \begin{enumerate}[\text{Niveau} A :]
  271. \item (Erreur catastrophique) un défaut du système ou sous-système étudié
  272. peut provoquer un problème catastrophique (sécurité du vol ou atterrissage
  273. compromis, crash de l'avion) ;
  274. \item (Erreur dangereuse) un défaut du système ou sous-système étudié peut
  275. provoquer un problème majeur entraînant des dégâts sérieux voire la mort de
  276. quelques occupants ;
  277. \item (Erreur majeure) un défaut du système ou sous-système étudié peut
  278. provoquer un problème sérieux entraînant un dysfonctionnement des
  279. équipements vitaux de l'appareil (pas de mort) ;
  280. \item (Erreur mineure) un défaut du système ou sous-système étudié peut
  281. provoquer un problème pouvant perturber la sûreté du vol (pas de mort) ;
  282. \item (Erreur sans effet) un défaut du système ou sous-système étudié peut
  283. provoquer un problème sans effet sur la sûreté du vol.
  284. \end{enumerate}
  285. Dans le cadre du processus de certification de systèmes critiques, les outils
  286. utilisés pour le développement doivent être vérifiés afin de s'assurer de leur
  287. bon fonctionnement et qu'ils n'introduisent pas d'erreurs dans le logiciel.
  288. Les pratiques de développement logiciel évoluant, notamment par l'adoption
  289. croissante de l'approche dirigée par les modèles qui plaide pour
  290. l'automatisation maximale des tâches, de nouveaux outils sont intégrés aux
  291. processus de développement. L'introduction d'outils automatiques dans une
  292. chaîne de développement de système soumis à certification impose l'une des deux
  293. approches suivantes :
  294. \begin{itemize}
  295. \item vérifier les données produites par l'outil \emph{a posteriori} ;
  296. \item qualifier l'outil.
  297. \end{itemize}
  298. %\todo{Crédit de certification = confiance dans l'outil\\
  299. %Crédit de certification implicite : pas de vérification des sorties de l'outil.
  300. %Si vérification des sorties, qualification pas requise}
  301. La qualification d'un logiciel participe à atteindre un objectif exigé par le
  302. processus de certification et permet d'obtenir de la confiance dans les
  303. fonctionnalités d'un outil. Ce processus de qualification peut être appliqué à
  304. une ou plusieurs fonctions dans un outil, à un outil unique ou à un ensemble
  305. d'outils.
  306. \begin{definition}[Qualification]
  307. La qualification d'outils est le processus nécessaire pour obtenir des crédits
  308. de certification d'un outil. Ces crédits peuvent uniquement être garantis pour
  309. un usage donné dans un contexte donné.
  310. \end{definition}
  311. L'intérêt de la qualification d'un outil est d'obtenir suffisamment de
  312. confiance en cet outil pour pouvoir l'intégrer dans une chaîne de développement
  313. sans avoir à vérifier ses données de sortie ensuite. Le choix entre l'approche
  314. de qualification et de vérification \emph{a posteriori} revêt un aspect
  315. stratégique : si la qualification d'un outil peut avoir un coût élevé fixe,
  316. elle n'en génère pas plus par la suite, tandis que la vérification \emph{a
  317. posteriori} aura un coût récurrent.
  318. %\todo{Qualification pas directement utilisée : focus sur les générateurs de code
  319. % critères :
  320. %\begin{enumerate}
  321. % \item outils dont la sortie appartient au logiciel embarqué / compilo
  322. % \item outils qui automatisent un processus : détection d'erreur, (outils de
  323. % vérif formelle) / vérification
  324. % \item outils de vérification / pas d'impact
  325. %\end{enumerate}}
  326. La DO-178/ED-12 définit des catégories d'outils (\emph{sans impact},
  327. \emph{vérification} et \emph{compilateur, générateur de code}) ainsi que des
  328. critères de qualification. Elle précise les exigences de qualification adaptées
  329. aux différents types d'outils et à leur utilisation. La norme
  330. DO-330/ED-251~\cite{DO-330} donne des instructions pour la qualification
  331. d'outils. Elle définit aussi cinq niveaux de qualification d'outils (TQL ---
  332. \emph{Tool Qualification Levels}) qui sont fonction de ces trois critères ainsi
  333. que de la criticité du logiciel développé :
  334. \begin{enumerate}
  335. \item[TQL-1 à 3 : ] ces niveaux concernent les générateurs de code et outils
  336. dont la sortie fait partie du logiciel embarqué et qui peuvent donc
  337. introduire des erreurs ;
  338. \item[TQL-4 à 5 : ] ces niveaux concernent les outils de vérification, qui ne
  339. peuvent pas introduire d'erreurs, mais qui peuvent échouer à en détecter
  340. (outils de tests, analyseurs de code statique)
  341. \end{enumerate}
  342. Selon son utilisation et selon le type de production de l'outil, le niveau de
  343. qualification sera différent. Un outil ne peut donc être qualifié une fois pour
  344. toutes. En revanche, il peut être \emph{qualifiable} pour chaque projet,
  345. c'est-à-dire \emph{pre qualifié} pour chaque projet.
  346. %%%%%
  347. L'{\idm} plaidant pour l'automatisation des tâches et l'usage d'outils
  348. automatisant les tâches, il faut vérifier ces outils. Dans ce contexte, l'un
  349. des problèmes majeurs de l'{\idm} est le grand nombre d'outils non qualifiés
  350. et non certifiés impliqués dans les chaînes de développement, notamment des
  351. générateurs de code, des outils de traduction, et de manière plus générale des
  352. outils automatisant au maximum les tâches de transformation.
  353. %Il faut donc certifier ou aider à certifier les nouveaux logiciels produits par
  354. %ces nouvelles chaînes, et donc qualifier les outils.
  355. %De plus, le processus de qualification étant mené manuellement par un humain,
  356. %il est extrêmement coûteux et est sujet à erreurs. C'est dans ce contexte que
  357. %notre travail s'intègre et que nous nous proposons d'aider le processus de
  358. %qualification.
  359. %validation = respect des besoins\\
  360. %vérification = respect des specs
  361. %\begin{definition}[Validation logicielle]
  362. %Selon le standard~\cite{IEEEstd610}, il s'agit du processus d'évaluation d'un
  363. %logiciel pendant ou à la fin du processus de développement pour déterminer s'il
  364. %satisfait les exigences spécifiées.
  365. %\end{definition}
  366. %selon~\cite{DO-330} : Le processus qui détermine que les exigences sont les exigences
  367. %corrects et qu'elles sont complètes.
  368. %\begin{definition}[Vérification logicielle]
  369. %Selon le~\cite{IEEEstd610}, il s'agit du processus d'évaluation d'un logiciel
  370. %pour déterminer si le produit d'une phase de développement donnée satisfait les
  371. %conditions imposées au début de cette phase.
  372. %\end{definition}
  373. %selon~\cite{DO-330} : L'évaluation des sorties d'un processus pour s'assurer de la
  374. %correction et de la cohérence en fonction des entrée fournies à ce processus.
  375. %La validation logicielle garantit que le produit remplit effectivement les
  376. %besoins client, et que les spécifications étaient correctes initialement, alors
  377. %que la vérification garantit que le produit a été construit en conformité avec
  378. %les exigences et les spécifications de conception. La validation garantit « que
  379. %l'on a construit le bon produit ». La vérification garantit « que l'on a bien
  380. %construit le produit ». La validation confirme que le produit fourni remplira
  381. %l'usage attendu.
  382. %translation validation = validation après chaque exécution du compilateur
  383. %que sa traduction est correcte (code cible correspond à une traduction correcte
  384. %du code source)
  385. %\todo{problèmes :
  386. % \begin{itemize}
  387. % \item outils de modélisation non qualifiés et non certifiés => certifier
  388. % des outils ou aider à certifier
  389. % \item pb {\mde} : beaucoup d'outils dans les chaînes de développement =>
  390. % introduction des outils "certifieurs" automatiques, problématique
  391. %\end{itemize}}
  392. %Problématiques : traçabilité, séparer spécification/implémentation/vérification
  393. \section{Traçabilité}
  394. \label{ch:verification:trace}
  395. %\todo{ici ? traçabilité interne vs traçabilité de spécification ; intérêt
  396. %(contrainte des précédentes sous-sous-sections). Souvent traçabilité interne ou
  397. %fortement liée à l'implémentation de la transformation. Se fait bien
  398. %techniquement.}
  399. %La qualification exige de séparer spécification, implémentation et
  400. %vérification. Elle exige aussi d'assurer la traçabilité entre elles.
  401. Une problématique fondamentale des compilateurs dans le cadre de la
  402. certification d'un logiciel est d'assurer la traçabilité entre le code source
  403. et le code binaire, ce qu'exige la norme DO-178/ED-12. Cette exigence pour les
  404. compilateurs et générateurs de code est généralisable à toutes les
  405. transformations, donc aux transformations de modèles à partir desquelles les
  406. logiciels sont produits. Assurer cette traçabilité permet aussi de respecter la
  407. contrainte de séparation de le spécification, de l'implémentation et de la
  408. vérification tout en étant capable de relier les unes aux autres.
  409. % ? ex de B2llvm : générateur B vers le langage intermédiaire de LLVM
  410. % spéc B -> code intermédiaire ; activation de la traçabilité génère des
  411. % commentaires lisibles humainement. mais rien de réutilisable automatiquement
  412. % pour vérifier des propriétés.
  413. \begin{definition}[Traçabilité]
  414. La norme DO-330~\cite{DO-330} définit la traçabilité comme une association
  415. entre objets telle qu'entre des sorties de processus, entre une sortie et son
  416. processus d'origine, ou entre une spécification et son implémentation.
  417. \end{definition}
  418. L'{\idm} plaidant pour l'automatisation maximale des tâches répétitives et
  419. l'utilisation de générateurs de code pour produire le logiciel à partir de
  420. modèles, il est nécessaire de vérifier les transformations qui en sont le cœur.
  421. L'un des angles d'attaque du problème de la qualification est de fournir des
  422. outils de transformations qualifiables, qui assurent la traçabilité des
  423. transformations.
  424. Dans le cas d'une transformation de modèle, le métamodèle source fait partie de
  425. la spécification et le modèle source la donnée d'entrée. Il convient donc de
  426. conserver une trace de la transformation en maintenant un lien entre la source
  427. et la cible. On retrouve souvent deux situations :
  428. \begin{itemize}
  429. \item la trace se fait au niveau macroscopique (modèle d'entrée et modèle de
  430. sortie) et la granularité est extrêmement faible, ce qui rend la trace peu
  431. informative ;
  432. \item la trace s'opère de manière très détaillée (comme un \emph{debug}) ce
  433. qui génère une trace importante de tout ce qui s'est produit durant la
  434. transformation. Si toutes les informations sont présentes, se pose le
  435. problème de la pertinence des données recueillies : la quantité
  436. d'informations peut rendre la trace inexploitable, les éléments
  437. jugés intéressants risquant d'être noyés dans la trace.
  438. \end{itemize}
  439. Outre le respect strict des exigences de qualification, les informations de
  440. trace peuvent être très utiles pour des tâches telles que le \emph{debugging}
  441. ou l'analyse d'impact (conséquences d'une modification).
  442. La traçabilité des transformations de modèle est un aspect important que la
  443. plupart des outils traitent en apportant un support dédié, comme pour les
  444. outils {\qvt}, {\atl}, {\tefkat} ou {\kermeta}~\cite{Falleri2006}.
  445. D'autres outils tels que {\agg}, {\viatra} et {\great} n'ont pas de support
  446. dédié à cette traçabilité, cependant les informations de trace peuvent être
  447. créées comme des éléments cibles.
  448. Généralement, la traçabilité est classée en deux catégories : \emph{explicite}
  449. et \emph{implicite}. La première signifie que les liens de trace sont
  450. directement capturés en utilisant explicitement une syntaxe concrète adéquate.
  451. La traçabilité \emph{implicite} est quant à elle le résultat d'une opération de
  452. gestion des modèles (une requête sur des artefacts générés par exemple).
  453. Un problème récurrent de l'implémentation de la traçabilité est qu'elle est
  454. souvent fortement liée à l'implémentation de la transformation, ce qui est
  455. problématique dans le cadre de la qualification qui impose de préserver une
  456. séparation entre l'implémentation et la spécification.
  457. %ou que son usage (traçabilité \emph{interne} ou \emph{technique})
  458. Pour la qualification, il faut donc fournir des informations pertinentes sans
  459. qu'elles soient perdues dans la masse de données, tout en ayant une traçabilité
  460. qui soit suffisamment découplée à l'implémentation, mais donnant une granularité
  461. intermédiaire. C'est dans ce contexte que nous nous proposons de travailler, et
  462. nous proposons de fournir des outils permettant d'aider à la qualification de
  463. transformations de modèles.
  464. % vim:spell spelllang=fr