Dispositif de contrôle de la couverture structurelle d'un logiciel et procédé mettant en œuvre le dispositif
L'invention concerne un dispositif de contrôle de la couverture structurelle d'un logiciel et un procédé mettant en œuvre le dispositif. Dans le domaine aéronautique, des normes telle que la norme DO 178 B établie par le département de la défense (Department Of Defence) des Etats Unis imposent des contrôles stricts lors de la validation de logiciels destinée à être embarquer. Le niveau B de cette norme impose une couverture structurelle complète du logiciel au niveau des instructions et des décisions. En d'autres termes, lors de la mise en œuvre du logiciel, toutes les instructions du logiciel doivent être exécutées et toutes les décisions doivent avoir pris tous les choix possibles. A ce jour le contrôle de la couverture structurelle n'est pas réalisé de façon directe. On utilise habituellement une simulation du logiciel adaptée pour fonctionner par exemple sur un ordinateur personnel appelé hôte. Sur cet hôte il est aisé de connaître la couverture structurelle du logiciel. On développe également sur cet hôte un premier test fonctionnel complet du logiciel. Par ailleurs, on développe un second test fonctionnel adapté au processeur, appelé cible, qui recevra le logiciel lors de son fonctionnement normal. Si la couverture structurelle est correcte sur l'hôte et si les deux tests fonctionnels donnent des résultats identiques, on déduit que la couverture structurelle est correcte sur la cible. Le logiciel est généralement développé dans un langage dit de haut niveau, comme par exemple le langage C, puis traduis en langage dit machine n'utilisant que des instructions directement compréhensibles par le processeur utilisant le logiciel. Lorsque le processeur de l'hôte est semblable à celui de la cible, leurs langages machine sont voisins et le type de contrôle décrit plus haut est fiable. Néanmoins lorsque les processeurs de l'hôte et de la cible ont des architectures différentes, leurs langages machines sont également différents. Cette différence entraîne une incertitude sur la déduction de la couverture structurelle sur la cible. Une autre solution consiste à ne réaliser des tests que sur la cible et à ajouter un drapeau dans chaque branche du logiciel. Si, à l'issu des tests fonctionnels tous les drapeaux ont été activés, cela prouve que toutes
les branches du logiciel ont été utilisées et donc que la couverture structurelle est correcte. Cette solution présente l'inconvénient d'augmenter le taux de charge du processeur et d'inclure dans le logiciel des instructions, les drapeaux, inutiles à la fonction du logiciel. Ces instructions supplémentaires dégradent la fiabilité du logiciel. L'invention a pour but de pallier les inconvénients décrits plus haut en proposant un dispositif et un procédé de contrôle de la couverture structurelle d'un logiciel, le contrôle se faisant directement sur la cible sans l'intervention d'un hôte et sans modifier le logiciel. A cet effet l'invention a pour objet un dispositif de contrôle de la couverture structurelle d'un logiciel mis en œuvre par un processeur, le logiciel étant stocké dans une première mémoire, le logiciel comportant des instructions localisables par des adresses circulant sur un bus d'adresses reliant le processeur à la première mémoire, caractérisé en ce qu'il comprend une seconde mémoire reliée au bus d'adresses permettant de mémoriser une première et une seconde valeur associées à chaque adresse, la première valeur indiquant que l'adresse associée a été appelée par le processeur et la seconde valeur indiquant que l'adresse associée n'a pas été appelée par le processeur. Ce dispositif permet de vérifier la couverture structurelle au niveau des instructions. Avantageusement, pour vérifier la couverture structurelle au niveau des décisions, la seconde mémoire permet en outre de mémoriser une troisième et une quatrième valeur associées à chaque adresse, la troisième valeur indiquant que l'instruction localisée à l'adresse est suivie immédiatement dans le déroulement du logiciel par une instruction localisée à l'adresse consécutive de l'adresse associée, la quatrième valeur indiquant que l'instruction localisée à l'adresse n'est pas suivie immédiatement, dans le déroulement du logiciel, par une instruction localisée à l'adresse consécutive de l'adresse associée. L'invention a également pour objet un procédé mettant en œuvre un dispositif décrit ci dessus, caractérisé en ce qu'il consiste à - effacer l'ensemble du contenu de la seconde mémoire, - effectuer des tests de validation du logiciel, - comparer le contenu de la seconde mémoire avec une liste des adresses où des instructions existent.
Ce procédé permet de vérifier la couverture structurelle au niveau des instructions. Avantageusement, pour de vérifier la couverture structurelle au niveau des décisions, le procédé est complété par l'analyse du contenu de la seconde mémoire. Pour chaque instruction comprenant un choix décisionnel, on vérifie que les troisième et quatrième valeurs ont été renseignées. L'invention sera mieux comprise et d'autres avantages apparaîtront à la lecture de la description détaillée d'un mode de réalisation donné à titre d'exemple, description illustrée par le dessin joint dans lequel : La figure 1 représente sous forme de schéma bloc, un dispositif de contrôle de la couverture structurelle d'un logiciel stocké dans une mémoire et mis en œuvre par un processeur ; la figure 2 représente le dispositif de contrôle de la figure 1 adapté pour le contrôle de flot de données ; la figure 3 représente un exemple de pointeur contrôlant l'emploi de données utilisées par le logiciel. La figure 1 décrit un équipement 1 comportant un processeur 2 relié à une mémoire 3 par un bus d'adresses 4. Un logiciel est stocké dans la mémoire 3 appelée également mémoire programme. Le logiciel comprend des instructions localisables dans la mémoire 3 par des adresses circulant sur le bus d'adresses 4. les instructions permettent au processeur 2 de fonctionner. Le processeur 2 appelle les instructions en fonction d'un organigramme ou d'un algorithme défini lors de la conception du logiciel. Le contrôle de la couverture structurelle du logiciel est réalisé lors de la validation du logiciel. Ce contrôle consiste en une vérification que lors de l'utilisation normale du logiciel, toutes les instructions du logiciel sont mises en œuvre par le processeur 2. On peut également vérifier que toutes les décisions ont pris tous les choix possibles. Un dispositif 5 de contrôle de couverture structurelle comporte une mémoire 6 reliée au bus d'adresses 4. La mémoire 6 est par exemple du type à accès aléatoire, type bien connu dans la littérature anglo-saxonne sous le nom de RAM (Random Accès Memory). La mémoire 6 permet de mémoriser une première et une seconde valeur associées à chaque adresse. La première valeur indique que
l'adresse associée a été appelée par le processeur 2 et la seconde valeur indique que l'adresse associée n'a pas été appelée par le processeur 2. Avantageusement, la seconde mémoire 6 permet de mémoriser une troisième et une quatrième valeur associées à chaque adresse. La troisième valeur indique que l'instruction localisée à l'adresse est suivie immédiatement dans le déroulement du logiciel par une instruction localisée à l'adresse suivant immédiatement l'adresse associée. La quatrième valeur indique que l'instruction localisée à l'adresse n'est pas suivie immédiatement, dans le déroulement du logiciel, par une instruction localisée à l'adresse consécutive de l'adresse associée. Avantageusement, les quatre valeurs sont stockables dans deux bits de la seconde mémoire 6. Chaque adresse de la mémoire 3 est associée à deux bits de la mémoire 6. La mémoire 6 comporte au moins deux fois plus de bits que d'adresses utilisées dans la mémoire 3 par les instructions du logiciel. Avantageusement, pour pouvoir utiliser le dispositif 5 quel que soit le logiciel stocké dans la mémoire 3, la mémoire 6 comporte deux fois plus de bits que d'adresses disponibles dans la mémoire 3. Le dispositif 5 comporte des moyens pour donner aux bits de la mémoire 6 un état logique représentatif d'un appel par le processeur 2 de l'adresse associée à ces bits et représentatif du . fait que l'instruction localisée à l'adresse est suivie immédiatement ou non dans le déroulement du logiciel, par une instruction localisée à l'adresse consécutive de l'adresse associée dans la mémoire 3. On définit que deux adresses sont consécutives si elles contiennent deux instructions qui se suivent dans l'écriture du logiciel. Ces moyens comportent par exemple un composant 7 comprenant des éléments logiques programmables. Avantageusement, le dispositif comporte des moyens pour donner aux bits de la seconde mémoire 6 un état logique représentatif d'un appel par le processeur 2 de l'adresse associée et de l'adresse suivant immédiatement l'adresse associée dans le déroulement du logiciel. Ces moyens comportent avantageusement un composant comprenant des éléments logiques programmables. Il est bien entendu possible d'utiliser le composant 7. Les quatre valeurs que peuvent prendre les deux bits associés à une adresse dite courante sont par exemple les suivantes. Tant que
l'adresse courante n'a pas été appelée, les deux bits conservent une valeur 00. Les deux bits changent de valeur lorsque l'adresse suivante, dans le déroulement du logiciel est appelée. Si l'adresse suivante est l'adresse consécutive dans l'ordre des adresses de la mémoire 3, on positionne les deux bits à une valeur 10. Si au contraire, l'adresse suivante n'est pas l'adresse consécutive, on positionne les deux bits à une valeur 01. Le positionnement des deux bits se fait de façon cumulative par exemple au moyen d'une fonction logique OU. Plus précisément, si les deux bits correspondant à l'adresse courante ont une valeur 10, que l'adresse courante est à nouveau appelée, et que l'adresse suivante n'est cette fois ci pas l'adresse consécutive, on positionne les deux bits à 01 par l'intermédiaire de la fonction OU et au final, les deux bits prendront une valeur 11. Avantageusement, le dispositif comporte des moyens 7 pour comparer le contenu de la seconde mémoire 6 avec une liste des adresses où des instructions existent. Lors de la vérification de la couverture structurelle on analysera le contenu de la mémoire 6. Lorsque que toutes les paires de bits correspondants à des instructions de la mémoire 3 ont des valeurs différentes de 00, la couverture structurelle au niveau des instructions est correcte. De plus, lorsque que toutes les paires de bits correspondants à des instructions comportant un choix décisionnel, ont des valeurs égales à 11 la couverture structurelle au niveau des décisions est correcte. Avantageusement, pour améliorer la sécurité du dispositif 5, il comporte des moyens autonomes d'alimentation électrique du dispositif, moyens indépendants de moyens d'alimentation du processeur 2 et de la mémoire 3. Ainsi, le dispositif 5 n'est pas soumis aux perturbations éventuelles de l'alimentation du processeur 2 et de la mémoire 3. Avantageusement, toujours pour améliorer la sécurité du dispositif 5, il comporte une mémoire rémanente 8 permettant la sauvegarde de l'ensemble des données présentes dans la mémoire 6, même en cas de coupure de l'alimentation électrique du dispositif 5. La mémoire 8 est par exemple du type utilisé en lecture seulement et à programmation électrique rapide, type bien connu dans la littérature anglo-saxonne sous le nom de Flash PROM.
En cas de coupure de l'alimentation électrique du dispositif 5, le contenu de la mémoire de sauvegarde 8 est enrichi par les informations contenues dans la mémoire 6 par une opération logique « OU » non exclusif.
Cette opération logique est effectuée bit à bit pour deux bits de la mémoire 6 et deux bits correspondants de la mémoire 8. Avantageusement, le dispositif 5 comporte des moyens pour effacer l'ensemble du contenu de la mémoire 6, et lorsqu'elle existe de la mémoire 8, sur un ordre extérieur véhiculé par une liaison 9. Ces moyens sont par exemple réalisés à l'aide du composant 7. Avantageusement, le dispositif 5 comporte des moyens pour comparer le contenu de la mémoire 6 avec une liste des adresses où des instructions du logiciel existent. Ces moyens sont par exemple réalisés à l'aide du composant 7 comprenant des éléments logiques programmables. Mais avantageusement, pour ne pas surcharger le composant 7, on peut utiliser un ordinateur extérieur au dispositif pour effectuer la comparaison. Dans ce cas, le composant 7 permet simplement de décharger le contenu des deux mémoires 6 et 8 vers l'ordinateur extérieur par une liaison 10. Le déchargement a lieu sur ordre extérieur véhiculé par la liaison 9. Avantageusement, le dispositif 5 comporte des moyens pour déterminer dans le contenu de la seconde mémoire 6 si pour des instructions comportant des choix décisionnels, les .troisième et quatrièmes valeurs ont été activées. Un procédé de mise en œuvre du dispositif 5 consiste à - effacer l'ensemble du contenu de la mémoire 6 et éventuellement de la mémoire 8 lorsqu'elle existe, - effectuer des tests de validation du logiciel, - comparer le contenu de la mémoire 6 et éventuellement de la mémoire 8 lorsqu'elle existe avec une liste des adresses où des instructions existent. L'effacement du contenu des mémoires 6 et 8 consiste à remettre l'ensemble de leurs bits à un même état logique, par exemple 0. Dans cet exemple, lors des tests de validation du logiciel, lorsqu'une instruction est appelée par le processeur 2, les bits de la mémoire 6 correspondant à l'adresse de l'instruction, sont placés à un état logique, par exemple 10, représentatif d'un appel par le processeur 2 de l'adresse associée à ces bits
ainsi que de l'adresse consécutive. Si la même succession d'instructions est appelée plusieurs fois par le processeur 2, les bits correspondants de la mémoire 6 reste à l'état logique 0. L'équipement 1 comporte habituellement une liaison 11 permettant la remise à zéro du processeur 2. Avantageusement, la liaison 11 est raccordée au dispositif 5, par exemple au composant 7, qui reçoit ainsi une information sur le fait que le processeur 2 est en fonctionnement ou est remis à zéro. Avantageusement, lors des tests de validation, la mémorisation des valeurs est interrompue lorsque le processeur 2 est remis à zéro. Avantageusement, une liaison 12 peut véhiculer un signal indiquant que le processeur 2 effectue des tests de validation du logiciel. Ce signal est appelé par la suite : « contrôle actif ». Un exemple d'algorithme utilisé lors des tests de validation du logiciel pour contrôler la couverture structurelle du logiciel est donné en fin de description. Illustré par la figure 2, le dispositif 5 comporte avantageusement, des moyens de contrôle d'un flot de données utilisées par le processeur 2. En effet, la norme DO 178 B concerne également les données mise en œuvre par le logiciel. Plus précisément, la norme DO 178 B impose deux exigences concemant les données. Premièrement, toutes les données définies doivent être utilisées par le logiciel. Deuxièmement, chaque donnée doit être produite avant d'être utilisée. La deuxième exigence peut s'exprimer par le fait que la valeur d'une donnée doit être écrite avant d'être lue dans l'emplacement mémoire qui lui est réservé. Les moyens de contrôle d'un flot de données sont par exemple réalisés à l'aide du composant 7 comprenant des éléments logiques programmables. Le composant 7 est alors raccordé temporairement au bus de données pendant les tests de validation du logiciel. L'équipement 1 comporte un bus de données 20 raccordant le processeur 2 à une mémoire 21 de données. Dans de nombreux équipements le bus de données 20 est confondu avec le bus d'adresses 4 et la mémoire 21 de données est confondue avec la mémoire 3 contenant le logiciel. On différencie alors les données des instructions par des tranches d'adresses différentes. Le dispositif 5 pourra donc différencier une instruction d'une donnée au moyen de l'adresse transitant sur le bus d'adresse 4.
Une liaison 22 relie le processeur 2 à la mémoire 21, liaison sur laquelle le processeur 2 informe la mémoire 21 du fait que la donnée adressée doit être lue ou écrite. Le dispositif 5 est raccordé à la fois sur le bus 20 et sur la liaison 22. les mémoires 6 et 8 du dispositif sont avantageusement utilisées pour contrôler l'utilisation des données définies dans la mémoire 21. A chaque donnée, on associe un emplacement des mémoires 6 et 8, emplacement dans lequel on peut stocker un pointeur pouvant prendre quatre positions courantes. On utilise par exemple deux bits pour mémoriser ces quatre positions courantes. La première position courante, par exemple notée 00 au moyen des deux bits, représente le fait que le logiciel n'a pas accédé à la donnée correspondante. La seconde position courante, par exemple notée 01 au moyen des deux bits, représente le fait que le logiciel a lu la valeur de la donnée avant de l'avoir écrite. La troisième position courante, par exemple notée 10 au moyen des deux bits, représente le fait que le logiciel a écrit une valeur de la donnée avant de l'avoir lue. La quatrième position courante par exemple notée 11 au moyen des deux bits, représente le fait que le logiciel a écrit une valeur de la donnée et l'a lue. Avantageusement, lors des tests de validation, le procédé de l'invention consiste, pour chaque donnée, à générer un indicateur, dit indicateur de KO, permettant de savoir si la donnée a été lue sans avoir été écrite au préalable.. Autrement dit, l'indicateur de KO est un indicateur de passage par la deuxième position courante notée 01. Lors de l'effacement du contenu des mémoires 6 et 8, pour chaque donnée, le pointeur prend la première position courante, c'est à dire 00. Lors des tests de validation du logiciel, la position courante du pointeur de chaque donnée est modifiée en fonction de l'utilisation faite par le logiciel des différentes données. Si pour une donnée, le pointeur prend la deuxième position courante 01, l'indicateur de KO est activé et reste activé jusqu'à la fin des tests de validation. De même, si pour une donnée, le pointeur prend la troisième position courante 10, l'indicateur de OK est activé et reste activé jusqu'à la fin des tests de validation. Chacun des deux indicateurs peut être mémorisé dans les mémoires 6 et 8 sur un seul bit chacun prenant la valeur 1 lorsqu'il est activé et 0 lorsqu'il ne l'est pas.
Pour que le résultat du contrôle de flot de donnée soit positif, c'est à dire que les deux exigences décrites plus haut soit remplies, il est nécessaire qu'à toutes les données ne soit associées que des quatrièmes valeurs et qu'aucun indicateur de KO n'ait été validé. Avantageusement, lors des tests de validation, le procédé de l'invention consiste, pour chaque donnée, à générer un indicateur, dit indicateur de OK, permettant de savoir si la donnée a été écrite sans avoir été lue au préalable, puis lue. Autrement dit, l'indicateur de OK est un indicateur de passage par la troisième position courante. Avantageusement, l'indicateur est réinitialisé à chaque fois que le processeur 2 est remis à zéro. Pour ce faire, on mémorise le signal de remise à zéro du processeur 2. On peut réaliser cette mémorisation sur un bit et dans ce cas, l'état logique 1 correspond par exemple au fait que le processeur 2 est en fonctionnement et l'état logique 0 correspond par exemple au fait que le processeur 2 est remis à zéro. Pour chaque donnée, on mémorise également le nombre de remises à zéro déjà effectuées sur le processeur 2. Si lors du test de validation, pour une donnée le nombre de remise à zéro mémorisé ne correspond pas au nombre de remise à zéro courant du processeur 2, on remet le pointeur à la première position courante notée 00. Un exemple d'algorithme utilisé lors des tests de validation du logiciel pour contrôler le flot de données utilisées par le processeur 2.
Exemple d'algorithme utilisé lors des tests de validation du logiciel pour contrôler la couverture structurelle du logiciel
Si le microprocesseur 2 n'est pas remis à zéro Si le signal "contrôle actif est présent Si l'adresse d'une instruction correspond à une zone de mémoire 3 Si l'adresse de l'instruction précédente Aln-1 en mémoire 3 est telle que Ain = Alπ.ι + 1 EMβiAln.-,) = EM6(Aln- |θy « 10 » Si non EMβiAlnJ = EM6(Alπ-ι) |OL^ « 01 » Fin Si Fin Si Fin Si Fin Si
Dans cet algorithme, Ain représente l'adresse de l'instruction de rang n dans l'écriture du logiciel, Aln.ι représente l'adresse de l'instruction de rang n-1 dans l'écriture du logiciel, EM6 représente les deux bits de la mémoire 6 associés à l'adresse Aln-ι .
Exemple d'algorithme utilisé lors des tests de validation du logiciel pour contrôler le flot de données utilisées par le processeur
Si le microprocesseur 2 n'est pas remis à zéro Si la position mémorisée du signal de remise à zéro du processeur 2 est à "0" • on incrémente le compteur courant de nombre de remise à zéro et on indique une position mémorisée de remise à zéro à "1" Fin Si Si le signal "contrôl actif est positionné Si l'adresse sur le bus d'adresse correspond à une zone de mémoire de données Si le nombre de remise à zéro du dernier passage à cette adresse ne correspond pas au compteur de reset courant • on indique que le dernier passage à cette adresse correspond au compteur de nombre de remise à zéro courant • on met la "position courante" à "00" Fin Si Si le signal "écriture lecture " est positionné à "lecture " • nouvelle "position courante" = OUfancienne "position courante";"01") Sinon • nouvelle "position courante" = OUfancienne "position courante";! 0") Fin Si Si "position courante" = "01" • on positionne l'indicateur de KO à "1" Fin Si Si "position courante" = "11 " • on positionne l'indicateur de OK à "1" Fin Si Fin Si Fin Si Sinon • on indique une position mémorisée du signal de remise à zéro du processeur 2 à "0" Fin Si