David Mentré Gulliver Une introduction à Frama-C Analyse et preuve de programmes C.

Slides:



Advertisements
Présentations similaires
Jean-Jacques Lévy INRIA Preuves de programmes et méthodes formelles Microsoft TechDays - 9 février 2010.
Advertisements

Version du 22 juin Un outil danalyse statique (synthèse de propriétés) de preuve de propriétés de logiciels écrits en langage C ANSI, utilisé dans.
Analyse statique de code C
Developpement Process « Coding party !! » Tony Carnal Altran.
Le débogage Semaine 12 Version A15. Plan de leçon - Débogage  Commentaire javadoc  Définition  Fonctionnement  Point d’arrêt  Exécution  Contrôler.
Projet de fin d'étude pour l'obtention du Diplôme Nationale d'Ingénieur en Informatique Conception et développement des modules de GED pour l’ indexation.
UML EPITECH 2009 UML1 - Introduction UML – Définition – Historique – UML en entreprise – Couverture Concepts – Objet – Classe –
Programmation Objet en Python L2 (Informatique) 2011 – 2012 CM : Jerzy Karczmarczuk – TD/TP : Véronique Terrier (Cherchez-nous.
Logiciel Assistant Gestion d’Événement Rémi Papillié (Chef d’équipe) Maxime Brodeur Xavier Pajani Gabriel Rolland David St-Jean.
CINI – Li115 1 Semaine 9 Algorithmes de tri ● Introduction ● Tri à bulle ● - principe ● - algorithme ● - efficacité ● Tri par sélection ● - principe, algorithme,
1 Rapide introduction à la compilation d'un programme « Use the source, Luke! » David Mentré.
CINI – Li115 1 Semaine 3 Boucles (suite), tirages aléatoires, bibliothèque graphique ● Imbrication d'instructions if et for ● Boucles for imbriquées ●
1 UML: applications, études de cas ● Processus (Extreme Programming, Unified Process) ● Architectures ● Expression du besoin technique Conception Préliminaire.
1 Programmation en C++ C++ de base ● Programme C++ ● Variables, objets, types ● Fonctions ● Namespace ● Tests ● Boucles ● Pointeurs, références.
1 Programmation en C++ C++ de base ● Programme C++ ● Variables, objets, types ● Types et opérations fondamentales ● Tests ● Boucles ● Pointeurs, références.
Présentation python : Épisode 3 ● Comment programmer comme un gentilhomme ? ● Le style de code ou comment bien présenter ● Les test unitaires ou comment.
Présentation du stage Laïka Moussa. 19/9/2003Présentation du stage2 Plan Présentation du cadre du stage Sujet du stage Démarche adoptée.
Utilisation des signaux sonores et lumineux
Activité DIESEL TS1 BTS MCI 2016  STRATEGIES INJECTION
Suites ordonnées ou mettre de l’ordre
e-Prelude.com Analyse globale du flux
Les Instructions Itératives (Les Boucles)
Introduction au Langage Pascal
Les distributions en classes
Bases de données multimédia
10/3/2017Footer Text1 Bienvenue a tous ! Bienvenue a tous ! Tutoriel v1.0.
Représentation des nombres réels
Chapitre 1 nombres, chaînes de caractères, booléens, et VARIABLES
J’ai un bug, qu’est-ce que je peux faire ? Samuel Thibault 7 Mars 2017
Chapitre 4: Variation dans le temps
Semaine #1 INF130 par Frédérick Henri.
Information et Système d’Information
Loi Normale (Laplace-Gauss)
Javadoc et débogueur Semaine 03 Version A17.
Préparer par : Intissare et kaoutare
Principes de programmation (suite)
Algorithmiques Abdelbasset KABOU
Centralisation de logs
Ce videoclip produit par l’Ecole Polytechnique Fédérale de Lausanne
La Conclusion.
Les interfaces en PHP.
L ES I NSTRUCTIONS I TÉRATIVES (L ES B OUCLES ) Réalisé par : OUZEGGANE Redouane Département de Technologie Faculté de Technologie – Université A.Mira,
La méthode du simplexe. 1) Algorithme du simplexe  Cet algorithme permet de déterminer la solution optimale, si elle existe, d’un problème de programmation.
Programmation en C++ C++ de base
Formules de calculs et Fonctions. Structure des formules de calcul Commencez toujours votre calcul par le signe =, ensuite sans laisser d’espaces, placez.
Type Concret – Type Abstrait
Calculs des incertitudes Lundi 30 Avril 2018 Master de Management de la Qualité, de la Sécurité et de l’Environnement.
Outils et principes de base. Exemple d’application  Gestion de données d’enquête : Interface de saisie en ligne  insère directement les données dans.
Royaume de Maroc Université Hassan Premier Settat Faculté des Sciences et Techniques de Settat LA CLASSIFICATION K-MEANS SOUS R /MATLAB Master :Automatique.
OPTIMISATION 1ère année ingénieurs
Sylvie DELAËT 2002 Architecture des machines Bienvenus en Amphi d’Architecture des Machines.
SUJET : E C L A T UNIVERSITE GASTON BERGER DE SAINT LOUIS UFR DES SCIENCES APPLIQUEES ET DE TECHNOLOGIE MASTER PROFESSIONNEL EN DÉVELOPPEMENT DE SYSTÈMES.
Position, dispersion, forme
Information, Calcul, Communication
Atos, Atos et le poisson, Atos Origin et le poisson, Atos Consulting ainsi que le poisson seul sont des marques déposées d'Atos Origin SA. © 2006 Atos.
1 Architecture des ordinateurs Généralités. 2 Définition Informatique = Information + Automatique Ce terme a été introduit en France. Il est très répandu.
Recherche de zero d'une fonction MARMAD ANAS MPSI -2.
Plan I.Définitions II.Objectifs III.Intérêt IV.Quoi tester ? V.Processus VI.Exemples VII.Conclusion VIII.Références.
Flowchart Itération Cours 04.
Principes de programmation (suite)
Piles et files.
Chapitre 2 : Représentation de l’information dans la machine Introduction Représentation des nombres négatifs –Signe / valeur absolue –Complément à 1 –Complément.
Chapter 11: Récursivité Java Software Solutions Second Edition
Tableau de bord d’un système de recommandation
1. 2 TABLEUR: Calc mars 19 Myriam Boullanger - Bureautique - Calc Suite Gratuite Libre Office Dans le navigateur (Internet Explorer, Google Chrome, FireFox,…),
PAF Guillaume Martin - Fabrice Cizeron - Xavier Roulot
TP N°1 : GUI en NetBeans Module R & C Université de Jijel
Codification et représentation de l’information Enseignant: Mahseur mohammed Groupe FB: mi2016ua1 Chaine YT: Cours informatique.
STATISTIQUE INFERENTIELLE LES TESTS STATISTIQUES.
Transcription de la présentation:

David Mentré Gulliver Une introduction à Frama-C Analyse et preuve de programmes C

Introduction à Frama-C2 Prélude : quelques exemples illustratifs

Introduction à Frama-C 3 Ce code contient une erreur ! Calcul de la valeur absolue d’un nombre en langage C int z_abs_x(const int x) { int z; if (x = 0 */ z = x; return z; }

Introduction à Frama-C 4 Ce code contient une erreur ! Calcul de la valeur absolue d’un nombre en langage C int z_abs_x(const int x) { int z; if (x = 0 */ z = x; return z; } Si x = -2 31, 2 31 n'existe pas (seulement )

Introduction à Frama-C 5 Un autre exemple, en Java Recherche par Dichotomie dans un tableau trié public static int binarySearch(int[] a, int key) { int low = 0; int high = a.length - 1; while (low key) high = mid - 1; else return mid; // key found } return -(low + 1); // key not found. }

Introduction à Frama-C 6 Un autre exemple, en Java Recherche par Dichotomie dans un tableau trié public static int binarySearch(int[] a, int key) { int low = 0; int high = a.length - 1; while (low key) high = mid - 1; else return mid; // key found } return -(low + 1); // key not found. } Solution 6: int mid = low + ((high - low) / 2); Problème Bug présent dans le JDK de Sun !

Introduction à Frama-C 7 Un cas d'école Un exemple concret de l'utilité des méthodes d'analyse statique

Introduction à Frama-C 8 Un cas d'école : causes Chaine d'événements techniques

Introduction à Frama-C 9 Un cas d'école : suite des causes Chaîne d'événements techniques (suite) [...]

Introduction à Frama-C 10 Un cas d'école : recommandations pour Ariane 501 Plus de tests Plus de formel (indirectement) → Analyse abstraite (PolySpace, A. Deutsch)

Introduction à Frama-C11 Analyse abstraite

Introduction à Frama-C 12 Analyse abstraite : PolySpace PolySpace Logiciel expérimental puis industrialisé d'analyse de code Ada, C, C++ (PolySpace → MathWorks) Vérification automatique à 95% de l'absence de Run Time Error pour Ariane 502, 503, … Inertial Measurement Unit ( lignes) Flight Software ( lignes)

Introduction à Frama-C 13 Analyse abstraite : interprétation abstraite Basée sur l'interprétation abstraite Approximations faites sur le sens (la sémantique) du langage C Formalisé par Patrick et Radia Cousot (fin 70) Signale toutes les erreurs possibles pour des classes d'erreurs Division par zéro, débordement de tableau, dépassement de capacité sur des entiers, … Parfois signale des erreurs qui n'en sont pas (fausses alarmes)

Introduction à Frama-C 14 Analyse abstraite : aperçu Un exemple : signe d'un calcul Sign(x) = -1 si x < 0, +1 sinon Sign(x * y) = Sign(x) * Sign(y) Sign(x / y) = Sign(x) * Sign(y) Sign(x + y) = ? Sign(x – y) = ? => approximation Analyse abstraite Aller de l'espace concret (programme) dans l'espace abstrait d'analyse Faire l'analyse Dans un temps et espace fini et raisonnable sur des propriétés potentiellement infinies Projeter le résultat sur l'espace concret

Introduction à Frama-C 15 Analyse abstraite : fondements Fondements théoriques plus compliqués Garantir que l'analyse est valide Tout ce qui est démontré sur l'abstraction l'est aussi sur le vrai système Idéalement, garantir que l'analyse est complète Toute erreur signalée sur l'analyse est une erreur sur le vrai système Tout du moins, limiter les fausses alarmes

Introduction à Frama-C 16 Analyse abstraite : outils Outils commerciaux et propriétaires Astrée Vérification du logiciel embarqué d'Airbus PolySpace Issu des vérifications pour Ariane 502 Outil libre et gratuit Frama-C Framework plus général d'analyse et de preuve de code C

Introduction à Frama-C 17 Analyse abstraite : grille de lecture Domaine d'application : code Ada / C / C++ À vérifier : les fausses alarmes Niveau d'expertise : Nul Niveau d'intervention : sur le code final de production, annotations Fidèle, suit les changements Outils disponibles et automatiques Expressivité : que certaines classes de propriétés Division par zéro, non débordement de tableaux et entiers,...

Introduction à Frama-C18 Analyse de code C avec Frama-C (un peu de concret !)

Introduction à Frama-C 19 Qu'est-ce que Frama-C ? Framework d'analyse de code C Développé par le CEA LIST et INRIA Saclay Programmé et extensible (plugins) en OCaml Différentes analyses, combinables entre elles Analyse de valeurs, vérification déductive, slicing, code mort, propagation de constantes, dépendances entre variables,... Interface graphique pour montrer les résultats d'analyse Paquets Debian et Ubuntu frama-c

Introduction à Frama-C 20 Plugin fondamental : analyse de valeur Activé par l'option -val : valeur des variables Valeurs pour des variables entières Énumérations : a ∈ {4; 5; } Intervalle : i ∈ [0..100] a ∈ [--..--] Intervalle avec périodicité : i ∈ [2..42]%2,10 Toutes les valeurs de l’intervalle ayant pour reste 2 après division par 10 : 2, 12, 22, 32, 42 Valeurs pour des variables flottantes Valeur exacte (3.0) et intervalle ([ ]) Valeurs pour des tableaux et pointeurs Ensemble d'adresses sous forme base + offset (en octets) p ∈ {{ &a ; &b ;}} p ∈ {{ &t + {0; 4; 8; 12;} ; &s + { 0; } ; }}

Introduction à Frama-C 21 Exemple d'analyse de valeur : démo !

Introduction à Frama-C 22 Frama-C pour l'analyse de code frama-c-gui -val value-analysis.c Permet de faire des vérifications exhaustives Considère tous les cas possibles Notamment très difficilement accessibles au test Alarmes : bug potentiel ! Ajout d'une assertion : continuer l'analyse Sous hypothèse que l'assertion est vraie Parfois donne des sur-approximations Fausses alarmes. Finesse avec -slevel

Introduction à Frama-C 23 Normalisation des boucles Boucle originale int loop1(void) { int i; for (i=0; i<10; i++){ i = i + 1; } return i; } Boucle vue par Frama-C int loop1(void) { int i ; i = 0; while (i < 10) { i ++; i ++; } return (i); }

Introduction à Frama-C 24 Informations fournies par Frama-C sur les boucles i = 0 while (i < 10) i ++ return (i) i ∈ UNINITIALIZED i ∈ {0; 2; 4; 6; 8; 10; } i ∈ {1; 3; 5; 7; 9; } i ∈ {0; 2; 4; 6; 8; 10; } i ∈ {10; } i ∈ {0; 2; 4; 6; 8; 10; } i ∈ {0; 2; 4; 6; 8; } i ∈ {1; 3; 5; 7; 9; } i ∈ {0; 2; 4; 6; 8; 10; }

Introduction à Frama-C 25 Alarmes générées Division et modulo par zéro 10 / y10 % y Décalage indéfini (hors de [0..31]) 1 << c Dépassement en arithmétique non signée ou signée Avec option -val-signed-overflow-alarms Valeurs flottantes dangereuses Quand une opération peut rendre une valeur infinie ou NaN Utilisation d'une valeur entière comme flottant Variables non initialisées et pointeurs sur des variables locales Accès mémoire invalides Par exemple, débordement de tableau Comparaison de pointeurs ou effets de bord dangereux

Introduction à Frama-C 26 Exemple : valeur absolue (1/2)

Introduction à Frama-C 27 Exemple valeur absolue (2/2) frama-c-gui –val –val-signed-overflow-alarms absolute.c L'analyse de valeur de Frama-C A inféré que la variable x a une valeur dans le domaine [-∞,+∞] En déduit que l'opération « -x » est une erreur pour x = 2 31 Poursuit l'analyse en supposant que x ≠ Insertion d'une assertion À prouver par la suite avec d'autres hypothèses Ou modifier le code (par ex. ajouter un test)

Introduction à Frama-C 28 Autres exemples Boucles : démo ! Alarmes : démo ! frama-c-gui –val –val-signed-overflow-alarms alarms.c Division possible par zéro : utilisation de -slevel Prendre en compte au plus n chemins différents lors de l'analyse Comparer frama-c-gui –val possible-zero.c frama-c-gui –val –slevel 2 possible-zero.c

Introduction à Frama-C29 Preuve de programme (encore plus fort !)

Introduction à Frama-C 30 Pourquoi la preuve de programme ? La vérification abstraite ne permet de vérifier que des classes de propriétés On veut pouvoir vérifier des propriétés plus larges Liées au domaine de l'application Correction de bon fonctionnement du programme => Utilisation de la preuve de programme En utilisant principalement la logique de Hoare On va en donner des exemples en C Existe aussi pour d'autres langages comme Java

Introduction à Frama-C 31 Introduction théorique : la logique de Hoare Logique de Hoare ou triplets de Hoare {P} C {Q} P : Précondition, C : Programme, Q : Postcondition Règles logiques pour raisonner sur la correction d'un programme informatique Si P est vraie, alors Q est vraie après exécution de la commande C

Introduction à Frama-C 32 Avantages et limites de la preuve de programme On peut (parfois) calculer P Calcul de plus faible pré-condition (WP : Weakest Precondition) Preuves statiques Valables pour toutes les exécutions du programme ! Preuve par rapport à une spécification Si la spécification est fausse, on prouvera un programme correct mais qui ne fait pas le travail attendu ! Équivalent à la programmation par contrat (Eiffel)

Introduction à Frama-C 33 En pratique dans Frama-C Workflow 1. Programme original en C, annoté en ACSL ACSL : ANSI C Specification Language 2. Génération des obligations de preuves avec le plugin Jessie 3. Génération des obligations de preuves pour un prouveur particulier avec Why + Visualisation (gWhy) 4. Preuve des obligations de preuve Prouveurs automatiques : Alt-Ergo, CVC3, … Prouveurs manuels : Coq, Isabelle, … Généralement des erreurs donc on reboucle sur 1.

Introduction à Frama-C 34 Un exemple de preuve Calcul de a + b Trois versions Standard Avec vérification Avec spécification Impact sur la preuve ? Démo ! frama-c -jessie sum.c Impact sur l'efficacité ? 3 e version : pas de tests !

Introduction à Frama-C 35 Résultat de la preuve

Introduction à Frama-C 36 Parenthèse : notion d'invariant Un invariant : propriété toujours vraie Dépend de la définition de « toujours » Dans Frama-C : utilisé pour les boucles Propriétés toujours vraies dans une boucle Également avant d'entrer dans le boucle Également en sortie de boucle On peut aussi spécifier des invariants sur des variables globales Par opposition, un variant : décroit strictement Borné par 0, pour prouver la terminaison des boucles

Introduction à Frama-C 37 Un exemple plus complet : recherche sur un tableau trié Exemple archi-classique tableau t trié, de longeur n Recherche par dichotomie d'une valeur v Deux bornes l : lower u : upper m = (l+u)/2

Introduction à Frama-C 38 Première spécification fonctionnelle en ACSL #pragma JessieIntegerModel(math) #pragma JessieTerminationPolicy(user) requires n >= 0 && \valid_range(t, 0, n-1); behavior success: assumes \forall integer k1, k2; 0 <= k1 <= k2 <= n-1 ==> t[k1] <= t[k2]; assumes \exists integer k; 0 <= k <= n-1 && t[k] == v; ensures 0 <= \result <= n-1; behavior failure: assumes \forall integer k; 0 t[k] != v; ensures \result == -1; */

Introduction à Frama-C 39 Premier résultat : pas beaucoup de preuve ! :-(

Introduction à Frama-C 40 Problème des boucles « opaques » Le problème : la boucle est « opaque » Solution : ajouter un invariant de boucle Construire progressivement la propriété que l'on veut obtenir Étape difficile ! En profiter pour ajouter un variant de boucle Prouver la terminaison

Introduction à Frama-C 41 Invariant de boucle Construire progressi- vement la propriété recherchée \forall int k ; 0≤k l ≤ k ≤ u

Introduction à Frama-C 42 Preuves fonctionnelles : nettement mieux ! Toutes les obligations de preuves sont prouvées Automatiquement par Alt-Ergo !

Introduction à Frama-C 43 Spécification plus complète : arithmétique habituelle

Introduction à Frama-C 44 Corriger l'erreur ! Erreur habituelle d'overflow ! Correction : m = l + (u – l) / 2; Toutes les preuves sont faites Toujours automatiquement ! En toute généralité ! Quelles que soient les entrées/sorties du programme

Introduction à Frama-C 45 Pour aller plus loin... Spécification des pointeurs et des tableaux Crucial en langage C Parfois difficile Spécification algébrique Pour exprimer des choses plus complexes Par exemple, spécification et preuve d'un algorithme de tri

Introduction à Frama-C46 Pour finir...

Introduction à Frama-C 47 Limites de Frama-C Analyse statique Donne des résultats exhaustifs mais......problème des approximations... temps de calculs Preuve Moins simple à utiliser Parfois difficile d'établir les annotations Outil en développement Change régulièrement => suivre les évolutions

Introduction à Frama-C 48 Conclusion Frama-C + Why + Alt-Ergo Solution libre complète pour l'analyse et la preuve de code C Analyse de sécurité basique (overflow, …) Preuves plus élaborées Fonctionnement correct par rapport à une spécification Technologie loin d'être parfaite, parfois difficile Mais ce n'est pas une raison pour ne pas l'utiliser ! ;-)

Introduction à Frama-C 49 Pour aller plus loin Documentation de Frama-C sur son site web Documentations spécifiques de l'Analyse de valeur et de Jessie Notamment c.com/training_berlin_2010.htmlhttp://frama- c.com/training_berlin_2010.html Voir « Tutorial ACSL by Example », projet DEVICE- SOFT de Fraunhofer First Formalisation et preuve d'une bibliothèque de structures de données en C