• Aucun résultat trouvé

Chapitre VI : Validation expérimentale 107

VI. 4.2 2 eme outil de type « bit-flip » sur microcontrôleur 117

VI.6 Illustration de l’approche de vérification 120

Dans l’étude de cas présentée au chapitre précédent, nous avons réalisés des tests d’injection de fautes ciblant les différentes applications séparément. Nous présentons ici la vérification des exigences de sûreté E4 de l’application « transmission de couple » (cf. section V.2.1).

Rappelons que la fonction de transmission est composée de deux parties de contrôle. Le contrôle statique récupère les commandes du conducteur et de l’environnement (Task_Trans_DC), puis calcule des valeurs de consigne pour la vitesse du moteur, la puissance de batterie et le couple aux roues. A partir de ces données, le contrôle dynamique (Task_Trans_SM) calcule les couples du moteur thermique et des moteurs électriques (Task_Trans_Mod1 et Task_Trans_Mod2).

Dans l’application transmission de couple, pour simplifier, le « mode 1 » est le mode où le moteur électrique est actif, tandis que le « mode 2 » est celui où le moteur électrique est inactif (devenu générateur en fait) et remplacé par le moteur thermique. Le mode 1 est repéré par le message « Periodic treatment in awake mode » (point de vue du moteur électrique), envoyé par la tâche périodique Task_Trans_Mod1. Le mode 2 est repéré par le message « Sleep mode » (point de vue du moteur électrique), envoyé par la tâche apériodique Task_Trans_Mod2. La requête de changement de mode est tracé par le message « Switch », envoyé par la tâche Task_Trans_SM. La figure 32 montre ces messages dans l’hyperterminal.

Le mode de défaillance applicative considéré pour l’exigence E4 est une transition intempestive non voulue. La figure 33 montre que deux transitions seulement ont été demandées, alors que la trace en montre 3.

Figure 33 : Défaillance applicative (transition non voulue)

Commande réelle de changement de mode Changement de mode intempestif Commande réelle de changement de mode Changement de mode intempestif

La figure 34 illustre l’implémentation de la partie de l’application « transmission de couple » qui nous intéresse. La tâche Task_Trans_DC est réveillée par une alarme

Al_Trans_DC à 50ms. Cette tâche active la tâche Task_Trans_SM lorsque le conducteur demande un changement de mode, via le service ChainTask() de l’OS. Par ailleurs, la tâche Task_Trans_SM est réveillée par une alarme Al_Trans_SM à 200ms. Les tâches Task_Trans_SM et Task_Trans_DC partagent une ressource. La tâche Task_Trans_SM active la tâche Task_Trans_Mod1 ou Task_Trans_Mod2

en fonction de la commande, via le service ChainTask() de l’OS.

Figure 34 : Schéma comportemental de l’application « transmission de couple » VI.6.1 Matrice de traçabilité

Une partie de la matrice de traçabilité a été déterminée dans le chapitre précédent, pour l’exigence E4. Elle est récapitulée ci-dessous. L’entrée « 8- Instrumentation pour injection de fautes » est celle que nous cherchons à déduire.

0- Exigence de sûreté 1- Type de Défaillance spécifique E4 : Le passage intempestif «du mode 1 au mode

2» ou «du mode 2 au mode 1» est une défaillance.

D4 : Flot de contrôle : Transition non voulue

2- Assertions exécutables Assertion A4 (en pseudo-code) :

Cas 1 : Activation Task_Trans_SM et source différente de Task_Trans_DC et Al_Trans_SM ;

Cas 2 : Activations successives de Task_Trans_SM par Task_Trans_DC inférieures à 1s ;

3- Stratégie de Détection d’erreur

L’assertion exprime les conditions dans lesquelles un évènement de contrôle doit se produire.

Les éléments de la condition et l’évènement de contrôle considéré sont donc tracés. Si l’assertion n’est pas vérifiée, une erreur est notifiée.

Task_Trans_DC Task_Trans_SM Al_Trans_DC Al_Trans_SM Task_Trans_Mod1 Task_Trans_Mod2 Resource GetResource( ) ReleaseResource( ) GetResource( ) ReleaseResource( ) Réveil implicite Réveil implicite ChainTask( ) ChainTask( ) ChainTask( ) Task_Trans_DC Task_Trans_SM Al_Trans_DC Al_Trans_SM Task_Trans_Mod1 Task_Trans_Mod2 Resource GetResource( ) ReleaseResource( ) GetResource( ) ReleaseResource( ) Réveil implicite Réveil implicite ChainTask( ) ChainTask( ) ChainTask( )

4- Sondes logicielles

Condition : capturer l’identifiant de Task_Trans_SM, Task_Trans_DC avant leur exécution

Evènement de contrôle : capturer l’instant d’appel et le paramètre (tâche activée) de ChainTask(), capturer l’état de l’alarme Al_Trans_SM avant l’exécution de Task_Trans_SM

5- Stratégie de Recouvrement d’erreur Erreur notifiée : La requête de transition est erronée.

Recouvrement par compensation : Inhiber la transition en cours. 6- Actionneurs logiciels

Inhiber la transition en cours. Une détection d’erreur de déclenchement de Task_Trans_SM a été faite donc cette tâche doit être terminée.

7- Stratégie de Vérification

L’assertion exprime les conditions dans lesquelles un évènement de contrôle doit se produire.

Il s’agit de corrompre les éléments de la condition ou l’évènement de contrôle considéré.

D’après la stratégie de vérification, il s’agit de corrompre les éléments de la condition ou l’évènement de contrôle considéré. En l’occurrence, d’après l’entrée « 4- sondes logicielles », les évènements de contrôle considérés sont :

 l’appel au service ChainTask() (condition : par la tâche Task_Trans_DC pour activer Task_Trans_SM)

 le réveil de Task_Trans_SM par son alarme Al_Trans_SM.

Le problème est de déterminer comment corrompre ces éléments pour obtenir la défaillance D4, à savoir une transition non voulue. En d’autres termes, il s’agit de provoquer une suractivation de la tâche Task_Trans_SM. Pour cela, le service

ActivateTask() de l’OS permet d’activer la tâche Task_Trans_SM. Cela perturbe alors l’évènement de contrôle ChainTask(). La tâche Task_Trans_DC est normalement responsable de l’activation de Task_Trans_SM. Nous pouvons perturber cette condition, en utilisant ActivateTask() en dehors de la tâche

Task_Trans_DC.

Il est important de souligner ici que dans la réalité, cette mutation peut correspondre à une erreur de génération de code liée à un défaut de conception d’outils de développement COTS ou encore à un mauvais paramétrage de cet outil. Une transition non voulue peut aussi être due à une faute transitoire du matériel ou encore à une erreur résiduelle du support d’exécution. Dans notre cas, il s’agit du moyen d’instrumentation le plus simple pour créer ce type d’erreur.

La 8ème colonne de la matrice de traçabilité peut alors être remplie, et le protocole d’injection de fautes décrit en section VI.3 peut être appliqué.

8- Instrumentation pour injection de fautes

Service : ActivateTask

VI.6.2 Campagne de tests et exemple de résultats

Pour une cible de type AUTOSAR, le flot de contrôle peut être intercepté au niveau des taskbodies, scripts des tâches contenant les appels de fonctions applicatives runnables. Une expérience d’injection de fautes correspond à l’ajout d’un appel au service ActivateTask(), dans un taskbody.

L’application que nous avons testée n’est pas exactement celle décrite dans l’étude de cas (chapitre V). Elle ne fait pas cohabiter les autres composants applicatifs (climatisation, airbag). Seule la partie du contrôle critique qui nous intéresse de l’application « transmission de couple » est implémentée. Il y a donc 4 taskbodies, correspondant aux 4 tâches (Task_Trans_SM, Task_Trans_DC, Task_Trans_Mod1 et Task_Trans_Mod2). Le nombre de ligne de code dans l’ensemble des taskbodies est 28, soit 28 mutants. Il y a donc 28 possibilités d’injection de fautes. Comme ActivateTask()est le seul type de code à insérer. Le nombre d’expériences d’injection de fautes pour l’exigence E4 s’élève à 28 tests par campagne.

Figure 35 : Injection de fautes sur cible avec et sans logiciel de défense pour E4 Le résultat des campagnes d’injection de fautes est donné par la figure 35. Deux

0 5 10 15 20 25 30 sans logiciel de défense avec logiciel de défense Pas d'observation/ TaF

Crash Défaillance applicative Nombre d’expériences 0 5 10 15 20 25 30 sans logiciel de défense avec logiciel de défense Pas d'observation/ TaF

Crash

Défaillance applicative Nombre d’expériences

empaquetée par le logiciel de défense. La deuxième campagne a ciblé l’application protégée par un logiciel de défense dédié à l’exigence E4. Les histogrammes montrent la proportion de défaillances applicatives (en rouge), de tolérance aux fautes (en vert), et de crash (en jaune).

Il apparaît clairement que l’injection de fautes ne conduit pas nécessairement à une défaillance. Déjà sans mécanismes de protection, aucune observation n’est détectée pour 22 expériences sur 28. Cette constatation mène à plusieurs conclusions : 1) l’application considérée est robuste à l’activation intempestive de tâche réalisée ; 2) notre technique d’injection de fautes ne permet pas de simuler suffisamment les défaillances considérées pour cette application ; 3) notre méthode d’observation manuelle n’est peut être pas assez précise (nous avons tracé uniquement les changements de modes et non le temps d’exécution des traitements).

Pour l’application sans logiciel de défense, il y a 6 tests qui ont conduit à une défaillance applicative. Pour l’application, dans laquelle nous avons ajouté nos mécanismes de défense, la tolérance aux fautes a été obtenue pour 3 tests, et 3 autres tests conduisent encore à une défaillance applicative. Ce résultat peut vraisemblablement être amélioré en analysant plus finement ces 3 derniers tests, et en raffinant l’assertion exécutable (A4). Malgré tout l’amélioration de la tolérance aux

fautes apportée par nos mécanismes de défense a été montrée, et la faisabilité de la

solution a été prouvée par l’exemple en déployant la totalité de la méthodologie de l’analyse à la validation.