03 - Data Flow

54
03 - Data Flow INF889A Analyse de programme pour la sécurité logicielle Jean Privat Université du Québec à Montréal Hiver 2020 Jean Privat (UQAM) 03 - Data Flow INF889A Hiver 2020 1 / 49

Transcript of 03 - Data Flow

Page 1: 03 - Data Flow

03 - Data FlowINF889A

Analyse de programme pour la sécurité logicielle

Jean Privat

Université du Québec à Montréal

Hiver 2020

Jean Privat (UQAM) 03 - Data Flow INF889A Hiver 2020 1 / 49

Page 2: 03 - Data Flow

Plan

1 Aperçu des analyses data flow

2 Un peu de théorie mathématique

3 Cadre monotone

4 Algorithmes

5 Analyses classiques

Jean Privat (UQAM) 03 - Data Flow INF889A Hiver 2020 2 / 49

Page 3: 03 - Data Flow

Aperçu des analyses data flow

Jean Privat (UQAM) 03 - Data Flow INF889A Hiver 2020 3 / 49

Page 4: 03 - Data Flow

Analyse data flow

• Stratégie unifiée d’analyse→ prend en compte le flux de contrôle du programme~/ec

• Cadre pour de nombreux types d’analyse→ en particulier en compilation

• G. Kildall A Unified Approach to Global Program Optimization(POPL’73)

• J. Kam, J. Ullman Monotone data flow analysis frameworks(1977)

Jean Privat (UQAM) 03 - Data Flow INF889A Hiver 2020 4 / 49

Page 5: 03 - Data Flow

Data et flow ?

Flow = Flux de contrôle du programme• Séquence d’instructions• Conditions (if)• Boucles (while)• Etc.

Data = de la donnée arbitraire• Utile et spécifique à l’analyse• Pas forcément de rapport avec les données réelles manipulées

par le programme

Jean Privat (UQAM) 03 - Data Flow INF889A Hiver 2020 5 / 49

Page 6: 03 - Data Flow

Couts et bénéfices

• Prise en compte de sémantique associée à l’analyse• Meilleure précision• Plus compliqué• Plus cher algorithmiquement

Compromis• Le cout vaut-il le gain de précision ?

Jean Privat (UQAM) 03 - Data Flow INF889A Hiver 2020 6 / 49

Page 7: 03 - Data Flow

Data flow, en bref

• À chaque point du programme• Associer de connaissance (l’information, le data)• Transférer l’information à travers les éléments du programme:

produire ou transformer en fonction de l’élément (type del’instruction par exemple)

• Faire circuler l’information (selon le flow)en fusionnant l’information si besoin

Jean Privat (UQAM) 03 - Data Flow INF889A Hiver 2020 7 / 49

Page 8: 03 - Data Flow

Taint analysis: rappel1 a = read();2 b = 10;3 c = b + 5;4 while (a>0) {5 c = b;6 print(b);7 b = read();8 if (b<10) {9 a = b;

10 } else {11 a = c - 1;12 }13 b = c - 1;14 }15 print(c);

• Que donnent 𝐴1, 𝐴2 et 𝐴3 du chapitre précédent ?• Et en vrai ?

Jean Privat (UQAM) 03 - Data Flow INF889A Hiver 2020 8 / 49

Page 9: 03 - Data Flow

Taint analysis et data flow• Identifier les points:

avant et après chaque instruction• Définir l’information :

à chaque point, pour chaque variable: « contaminé » ou « sain »• Définir la circulation:

flux du programme et transfert à travers les instructions• Faire tourner jusqu’à la stabilité

NoteIci le data (« contaminé » et « sain ») n’est pas directement lié auxvaleurs du programme (des entiers)

New game +• Information: à chaque point, pour chaque variable, l’ensemble

des read() contaminants (ou ∅ si sain)

Jean Privat (UQAM) 03 - Data Flow INF889A Hiver 2020 9 / 49

Page 10: 03 - Data Flow

Taint analysis et data flow• Identifier les points:

avant et après chaque instruction• Définir l’information :

à chaque point, pour chaque variable: « contaminé » ou « sain »• Définir la circulation:

flux du programme et transfert à travers les instructions• Faire tourner jusqu’à la stabilité

NoteIci le data (« contaminé » et « sain ») n’est pas directement lié auxvaleurs du programme (des entiers)

New game +• Information: à chaque point, pour chaque variable, l’ensemble

des read() contaminants (ou ∅ si sain)

Jean Privat (UQAM) 03 - Data Flow INF889A Hiver 2020 9 / 49

Page 11: 03 - Data Flow

Questions

• Est-ce que ça fonctionne pour tout programme ?• Est-ce que ça s’adapte à d’autres analyses ?• Est-ce conservateur ?• Est-ce que ça termine ?• Est-ce que l’approximation obtenue est bonne ?• Quelle est la complexité ?

Jean Privat (UQAM) 03 - Data Flow INF889A Hiver 2020 10 / 49

Page 12: 03 - Data Flow

Un peu de théorie mathématique

Jean Privat (UQAM) 03 - Data Flow INF889A Hiver 2020 11 / 49

Page 13: 03 - Data Flow

Avertissement

Quelques structures mathématiques abstraites• de la théorie des graphes• de la théorie des ordres• de l’algèbre générale

C’est un vrai ZOO: on pioche• ce qui nous est utile• ce qui nous permet de comprendre les principes, propriétés et

limitations

Jean Privat (UQAM) 03 - Data Flow INF889A Hiver 2020 12 / 49

Page 14: 03 - Data Flow

Graphes orientés (directed graphs, digraph)

Un graphe (𝑁, 𝐴):• Un ensemble 𝑁 de nœuds (nodes, ou vertices)• Un ensemble d’arcs (arcs, ou edges), paires de nœuds

𝐴 ⊆ 𝑁 × 𝑁• Pas de restriction particulière ni sur 𝑁 ni sur 𝐴.

On représente le flux de contrôle par un graphe• Les nœuds sont des éléments du programmes

(instructions, expressions, etc.)• Les arcs sont « est possiblement exécuté après »

Jean Privat (UQAM) 03 - Data Flow INF889A Hiver 2020 13 / 49

Page 15: 03 - Data Flow

AST vs graphe de flux de contrôle

Distinguer• Les nœuds de l’AST• Des nœuds du graphe de flux de contrôle

→ permet plus de souplesse

Exemple• Ajouts de nœuds de flux supplémentaires

→ L’entrée et la sortie du programme• Associer 0, un ou plusieurs nœuds de flux par nœud d’AST

→ Plus tard ce sera pratique…

Jean Privat (UQAM) 03 - Data Flow INF889A Hiver 2020 14 / 49

Page 16: 03 - Data Flow

Ensembles partiellement ordonnés (poset)Un ensemble partiellement ordonné (𝐿, ⊑) :

• Un ensemble 𝐿• Une relation binaire (⊑) ⊆ 𝐿 × 𝐿

Propriétés• Reflexif: ∀𝑥 ∈ 𝐿 𝑥 ⊑ 𝑥• Antisymétrique: ∀𝑥, 𝑦 ∈ 𝐿 𝑥 ⊑ 𝑦 ∧ 𝑦 ⊑ 𝑥 ⟹ 𝑥 = 𝑦• Transitif: ∀𝑥, 𝑦, 𝑧 ∈ 𝐿 𝑥 ⊑ 𝑦 ∧ 𝑦 ⊑ 𝑧 ⟹ 𝑥 ⊑ 𝑧

VocabulaireSoient 𝑥, 𝑦 ∈ 𝐿 et 𝑋, 𝑌 ⊆ 𝐿

• 𝑦 majore 𝑥 et 𝑥 minore 𝑦 : 𝑥 ⊑ 𝑦• 𝑦 est un majorant de 𝑋 : ∀𝑥′ ∈ 𝑋 𝑥′ ⊑ 𝑦• 𝑥 est un minorant de 𝑌 : ∀𝑦′ ∈ 𝑌 𝑥 ⊑ 𝑦′

Jean Privat (UQAM) 03 - Data Flow INF889A Hiver 2020 15 / 49

Page 17: 03 - Data Flow

Ensembles partiellement ordonnés

Choses notables• Existence d’éléments incomparables• Ensembles possiblement infinis

Exemples de poset

• Les nombres munis de ≤ (ici la relation est totale)• Les sous-ensembles d’un ensemble munis de ⊆• Les nombres entiers positifs munis de la divisibilité• Les classes d’un programme à objets munies de la spécialisation

(l’héritage)

Jean Privat (UQAM) 03 - Data Flow INF889A Hiver 2020 16 / 49

Page 18: 03 - Data Flow

Ensembles partiellement ordonnés

Choses notables• Existence d’éléments incomparables• Ensembles possiblement infinis

Exemples de poset• Les nombres munis de ≤ (ici la relation est totale)• Les sous-ensembles d’un ensemble munis de ⊆• Les nombres entiers positifs munis de la divisibilité• Les classes d’un programme à objets munies de la spécialisation

(l’héritage)

Jean Privat (UQAM) 03 - Data Flow INF889A Hiver 2020 16 / 49

Page 19: 03 - Data Flow

Diagramme de Hasse

Représentation graphique d’un poset• Réduction transitive

→ on dessine ni les arcs de transitivité ni les boucles• En bas ⊑ en haut

→ on dessine pas les têtes de flèches→ pas de traits horizontaux

→ C’est juste une représentation : les arcs et le sens sont implicites

Jean Privat (UQAM) 03 - Data Flow INF889A Hiver 2020 17 / 49

Page 20: 03 - Data Flow

BornesSoient (𝐿, ⊑) un poset, 𝑥, 𝑦 ∈ 𝐿 et 𝑋, 𝑌 ⊆ 𝐿

• 𝑦 est la borne supérieure (join) de 𝑋, notée 𝑦 = ⨆ 𝐿 :𝑦 est le plus petit majorant de 𝑋

• de même pour la borne inférieure (meet) de 𝑋, notée ⨅ 𝐿Pour deux éléments, on a une notation infixe:

• 𝑥 ⊔ 𝑦 = ⨆{𝑥, 𝑦}• 𝑥 ⊓ 𝑦 = ⨅{𝑥, 𝑦}

ImportantUne borne est soit unique, soit n’existe pas

• aucun majorant: pas de borne sup• des majorants mais aucun plus petit: pas de borne sup• un seul plus petit majorant: c’est la borne sup• plusieurs plus petits majorants: pas de borne sup

Exercice: trouver un exemple de chacun des cas

Jean Privat (UQAM) 03 - Data Flow INF889A Hiver 2020 18 / 49

Page 21: 03 - Data Flow

Dessus et dessous• Dessus (top): ⊤ = ⨆ 𝐿 = ⨅ ∅• Dessous (bottom): ⊥ = ⨆ ∅ = ⨅ 𝐿

Attention: n’existent pas nécessairement dans un poset

Note: on peut toujours étendre un poset pour ajouter ⊥ et/ou ⊤Hauteur d’un posetLe plus long chemin (entre ⊥ et ⊤ s’ils existent)

• Possiblement infini• Possiblement fini, même sur un poset infini

QuestionsPour les posets vus,

• Trouver ⊤ et ⊥• Trouver la hauteur

Jean Privat (UQAM) 03 - Data Flow INF889A Hiver 2020 19 / 49

Page 22: 03 - Data Flow

Treillis (lattice)

• Un ensemble partiellement ordonné (𝐿, ⊑)• Qui possède une borne supérieure (⊔) et inférieure (⊓) pour

tout couple d’éléments.Note: demi-treillis si on a que ⊔ ou que ⊓QuestionsParmi les poset vus, lesquels sont des treillis ?

Jean Privat (UQAM) 03 - Data Flow INF889A Hiver 2020 20 / 49

Page 23: 03 - Data Flow

⊑ vs. ⊔ vs. ⊓

Soient 𝑥, 𝑦 ∈ 𝐿. Les 3 propositions sont équivalentes:• 𝑥 ⊑ 𝑦• 𝑦 = 𝑥 ⊔ 𝑦• 𝑥 = 𝑥 ⊓ 𝑦

On peut définir mathématiquement un treillis seulement avec ⊔ et ⊓(et déduire ⊑)

Jean Privat (UQAM) 03 - Data Flow INF889A Hiver 2020 21 / 49

Page 24: 03 - Data Flow

Treillis complets

• Un treillis (𝐸, ⊑)• Qui possède une borne supérieure (⊔) et inférieure (⊓) pour

tout sous-ensemble d’éléments.Question

• Parmi les treillis vus, lesquels sont des treillis complets ?

Notes• ⊤ et ⊥ existent nécessairement dans les treillis complets• Un treillis complet ne peut pas être vide• Un treillis fini est nécessairement complet

Jean Privat (UQAM) 03 - Data Flow INF889A Hiver 2020 22 / 49

Page 25: 03 - Data Flow

Implémenter un treillis

Important un treillis est une structure abstraite mathématique.Quand on implémente, il suffit de respecter les lois. Souvent, undemi-treillis (semilattice) suffit.

• Redéfinir equals (et hashcode)• Définir join (⊔), et si besoin meet (⊓)• Définir <= (⊑)• Déterminer (ou ajouter) ⊥ et ⊤

Mutable ou non mutable ?• E join(E e1, E e2) retourne la borne sup de e1 et e2• void join(E acc, E e) modifie acc

→ encore des compromis…

Jean Privat (UQAM) 03 - Data Flow INF889A Hiver 2020 23 / 49

Page 26: 03 - Data Flow

Algèbre de Boole à 2 éléments

• {⊤, ⊥}• ⊥ ⊑ ⊤• Taille: 2• Hauteur: 1

Utilité• Facile à implémenter (un simple booléen)• Pas recommandé, car on veut souvent garder ⊥ et ⊤ comme

marqueurs à part

Jean Privat (UQAM) 03 - Data Flow INF889A Hiver 2020 24 / 49

Page 27: 03 - Data Flow

Treillis plat

• On part d’un ensemble S→ Un treillis (𝑆 ∪ {⊥, ⊤}, ⊑)→ ∀𝑥 ∈ 𝑆 ⊥ ⊑ 𝑥 ⊑ ⊤→ ∀𝑥, 𝑦 ∈ 𝑆 𝑥 ⊑ 𝑦 ⟹ 𝑥 = 𝑦• Taille: |𝑆| + 2• Hauteur: 2

Utilité• Identifie des états distincts (un seul)• Exemple: « sain » et « contaminé » du taint analysis

Jean Privat (UQAM) 03 - Data Flow INF889A Hiver 2020 25 / 49

Page 28: 03 - Data Flow

Sous-ensembles

• On par d’un ensemble S→ Un treilli (𝒫(𝑆), ⊆)• ⊥ = ∅• ⊤ = 𝑆• Taille: 2|𝑆|

• Hauteur: |𝑆|Utilité

• Combine des états possibles (zéro, un ou plus)• Exemple: l’ensemble des read() du taint analysis NG+• En pratique, on veut souvent ⊥ distinct de ∅

Jean Privat (UQAM) 03 - Data Flow INF889A Hiver 2020 26 / 49

Page 29: 03 - Data Flow

Produit cartésien (et tuples)

• On part de deux treillis (𝐿1, ⊑1) et (𝐿2, ⊑2)→ Un treilli (𝐿1 × 𝐿2, ⊑×)→ (𝑥1, 𝑥2) ⊑× (𝑦1, 𝑦2) ⇔ 𝑥1 ⊑1 𝑦1 ∧ 𝑥2 ⊑2 𝑦2

Pour majorer, il faut majorer dans les deux dimensions• ⊥× = (⊥1, ⊥2)• ⊤× = (⊤1, ⊤2)• Taille: |𝐿1| ⋅ |𝐿2|• Hauteur: ℎ(𝐿1) + ℎ(𝐿2)

Utilité• Combine des treillis existants comme dimension d’un treillis plus

gros• Analyse plusieurs choses en même temps

Jean Privat (UQAM) 03 - Data Flow INF889A Hiver 2020 27 / 49

Page 30: 03 - Data Flow

Ensemble fonctionnel (ou associatif)

• On par d’un ensemble 𝑆• Et d’un treillis (𝐿, ⊑𝐿)

→ Un treillis (𝑆 → 𝐿, ⊑→)→ 𝑥 ⊑→ 𝑦 ⇔ ∀𝑠 ∈ 𝑆 𝑥(𝑠) ⊑𝐿 𝑦(𝑠)

Pour majorer, il faut majorer dans tout les éléments de 𝑆• ⊥→ ∶ 𝑆 → 𝐿 ∀𝑥 ∈ 𝑆 ⊥→(𝑥) = ⊥𝐿• ⊤→ ∶ 𝑆 → 𝐿 ∀𝑥 ∈ 𝑆 ⊤→(𝑥) = ⊤𝐿• Taille: |𝐿||𝑆|

Utilité• Attache un treillis existant à des éléments connus• Exemple associer un treillis pour chaque variable

Jean Privat (UQAM) 03 - Data Flow INF889A Hiver 2020 28 / 49

Page 31: 03 - Data Flow

Fonctions monotones

Soient• deux ensembles partiellement ordonnés (𝐿1, ⊑1) et (𝐿2, ⊑2)• une fonction 𝑓 ∶ 𝐿1 → 𝐿2

𝑓 est monotone ssi• ∀𝑥, 𝑦 ∈ 𝐿1 𝑥 ⊑1 𝑦 ⟹ 𝑓(𝑥) ⊑2 𝑓(𝑦)

L’ordre partiel est préservé par la fonctionMonotonie interneC’est plus intéressant sur les fonctions internes

• un poset (𝐿, ⊑)• une fonction 𝑓 ∶ 𝐿 → 𝐿• 𝑓 monotone ssi ∀𝑥, 𝑦 ∈ 𝐿 𝑥 ⊑ 𝑦 ⟹ 𝑓(𝑥) ⊑ 𝑓(𝑦)

Jean Privat (UQAM) 03 - Data Flow INF889A Hiver 2020 29 / 49

Page 32: 03 - Data Flow

Question de monotonie

Soient 𝑆 = 𝒫({𝑎, 𝑏, 𝑐}) et le treillis (𝑆, ⊆)Quelles fonctions sont monotones ?

• 𝑓0 ∶ 𝑥 ↦ 𝑥• 𝑓1 ∶ 𝑥 ↦ {𝑎}• 𝑓2 ∶ 𝑥 ↦ 𝑥 ∪ {𝑎}• 𝑓3 ∶ 𝑥 ↦ 𝑥 ∩ {𝑎, 𝑏}• 𝑓4 ∶ 𝑥 ↦ {𝑎, 𝑏, 𝑐} ∖ 𝑥

Jean Privat (UQAM) 03 - Data Flow INF889A Hiver 2020 30 / 49

Page 33: 03 - Data Flow

Point fixe

• une fonction 𝑓 ∶ 𝑆 → 𝑆• 𝑥 ∈ 𝐿 est un point fixe de 𝑓 ssi 𝑥 = 𝑓(𝑥)

Note• une fonction peut avoir aucun, un ou plusieurs points fixes

Question• Trouver les points fixes des fonctions 𝑓 précédentes

Jean Privat (UQAM) 03 - Data Flow INF889A Hiver 2020 31 / 49

Page 34: 03 - Data Flow

Théorème du point fixe de Kleene• B. Knaster, Un théorème sur les fonctions d’ensembles (1928)• S. Kleene, Introduction to Metamathematics (1953)• A. Tarski A lattice-theoretical fixpoint theorem and its

applications (1955)Soient

• (𝐿, ⊑) un treillis de hauteur finie• 𝑓 ∶ 𝐿 → 𝐿 une fonction monotone

Alors ∃𝑘 𝑓𝑘(⊥) est l’unique plus petit point fixe de 𝑓Traduction

• Si on part de ⊥• Qu’on applique 𝑓 continuellement

→ On arrive nécessairement à un point fixe 𝑝 = 𝑓(𝑝)→ qui est le plus petit point fixe de 𝑓

Jean Privat (UQAM) 03 - Data Flow INF889A Hiver 2020 32 / 49

Page 35: 03 - Data Flow

Algo naïf de point fixe

1: fonction PointFixeNaif(𝑓 ∶ 𝐿 → 𝐿) : 𝐿2: 𝑥 ← ⊥3: tant que 𝑥 ≠ 𝑓(𝑥) faire4: 𝑥 ← 𝑓(𝑥)5: retourner x

En pratique, on utilise des algo plus efficaces…

Question• Appliquer l’algo pour trouver le plus petit point fixe des

fonctions 𝑓 (cf. questions précédentes)

Jean Privat (UQAM) 03 - Data Flow INF889A Hiver 2020 33 / 49

Page 36: 03 - Data Flow

Cadre monotone

Jean Privat (UQAM) 03 - Data Flow INF889A Hiver 2020 34 / 49

Page 37: 03 - Data Flow

Taint analysis revisité

• Un treillis pour l’info des variables• 𝐿0 = {contaminé, sain} ∪ {⊤, ⊥} (treillis plat)

• On veut l’info de chaque variable• 𝐿 = 𝑉 𝑎𝑟𝑠 → 𝐿0 : treillis d’un nœud• 𝑉 𝑎𝑟𝑠 est l’ensemble des variables du programme

• On veut l’info pour tout point• 𝐿Π = 𝑁 → 𝐿: treillis global• 𝑁 est l’ensemble des nœuds du flux de contrôle du programme• On note [[𝑛]] = 𝐿Π(𝑛) l’information en sortie d’un nœud

Jean Privat (UQAM) 03 - Data Flow INF889A Hiver 2020 35 / 49

Page 38: 03 - Data Flow

Calcul de l’informationL’information [[𝑛]] dépend des autres nœuds du flux de contrôle

• Si 𝑛 est l’entrée : [[𝑛]] = 𝜆𝑥.⊥• Si 𝑛 est « 𝑥 = 𝑎 » : [[𝑛]] = 𝑗(𝑛)[𝑥 ↦ 𝑒𝑣𝑎𝑙(𝑗(𝑛), 𝑎)]• Sinon [[𝑛]] = 𝑗(𝑛)

Fonction de jonction:

𝑗(𝑛) ∶ 𝑁 → 𝐿 = ⨆𝑝∈pred(𝑛)

[[𝑝]]

Fonction d’évaluation: 𝑒𝑣𝑎𝑙(𝑙, 𝑎) ∶ 𝐿 → 𝐴𝐸𝑥𝑝𝑟 → 𝐿0• 𝑒𝑣𝑎𝑙(𝑙, 𝑛) = sain• 𝑒𝑣𝑎𝑙(𝑙, read()) = contaminé• 𝑒𝑣𝑎𝑙(𝑙, 𝑥) = 𝑙(𝑥)• 𝑒𝑣𝑎𝑙(𝑙, 𝑎1𝑜𝑝𝑎𝑎2) = 𝑒𝑣𝑎𝑙(𝑙, 𝑎1) 𝑜𝑝 𝑒𝑣𝑎𝑙(𝑙, 𝑎2)

Jean Privat (UQAM) 03 - Data Flow INF889A Hiver 2020 36 / 49

Page 39: 03 - Data Flow

Fonction de transfertOn a souvent des équations de la forme

• [[𝑛𝑖]] = 𝑡𝑖(𝑗(𝑛))où 𝑡𝑖 ∶ 𝐿 → 𝐿 est appelée fonction de transfert

• Un seul argument, le join des nœuds précédentsRéécriture

• Si 𝑛𝑖 est l’entrée : 𝑡𝑖(𝑙) = 𝜆𝑥.⊥• Si 𝑛𝑖 est « 𝑥 = 𝑎 » : 𝑡𝑖(𝑙) = 𝑙[𝑥 ↦ 𝑒𝑣𝑎𝑙(𝑙, 𝑎)]• Sinon 𝑡𝑖(𝑙) = 𝑙

Notes• Ça simplifie l’implémentation de nombreuses analyses• Attention à pas se coincer le jour où on veut distinguer les

nœuds précédents

Jean Privat (UQAM) 03 - Data Flow INF889A Hiver 2020 37 / 49

Page 40: 03 - Data Flow

Opérations concrètes et abstraitesOn a besoin d’interpréter les opérations arithmétiques 𝑜𝑝 en fonctionde l’information sur les variables

𝑜𝑝 ⊥ sain contaminé ⊤⊥ ⊥ ⊥ ⊥ ⊥

sain ⊥ sain contaminé ⊤contaminé ⊥ contaminé contaminé ⊤

⊤ ⊥ ⊤ ⊤ ⊤

QuestionDans cette analyse on de distingue pas les opérations entres elles

• Quelles opérations pourrait-on améliorer ?• Comment abstraire une nouvelle opération « 𝑎 → clean(𝑎1)» ?

Jean Privat (UQAM) 03 - Data Flow INF889A Hiver 2020 38 / 49

Page 41: 03 - Data Flow

Système d’équations• Chaque [[𝑛𝑖]] peut dépendre d’autres [[𝑛𝑖]]• On a un système d’équations

[[𝑛1]] = 𝑓1([[𝑛1]], [[𝑛2]], … , [[𝑛𝑧]])[[𝑛2]] = 𝑓2([[𝑛1]], [[𝑛2]], … , [[𝑛𝑧]])

⋮[[𝑛𝑧]] = 𝑓𝑧([[𝑛1]], [[𝑛2]], … , [[𝑛𝑧]])

qui peut devenir une seule équation• 𝑥 = 𝑓(𝑥), avec• 𝑓(𝑙1, 𝑙2, … , 𝑙𝑧) =

(𝑓1(𝑙1, 𝑙2, … , 𝑙𝑧), 𝑓2(𝑙1, 𝑙2, … , 𝑙𝑧), … , 𝑓𝑧(𝑙1, 𝑙2, … , 𝑙𝑧))Si chaque 𝑓𝑖 est monotone, alors 𝑓 est aussi monotone

• Donc on sait trouver un point fixe (si 𝐿 est de hauteur finie)→ on sait résoudre le système d’équations

Jean Privat (UQAM) 03 - Data Flow INF889A Hiver 2020 39 / 49

Page 42: 03 - Data Flow

Algorithmes

Jean Privat (UQAM) 03 - Data Flow INF889A Hiver 2020 40 / 49

Page 43: 03 - Data Flow

Tourniquet (round-robin)1: fonction RoundRobin(𝑓1, 𝑓2, … , 𝑓𝑧 ∶ 𝑁 → 𝐿 → 𝐿) : 𝐿2: pour 𝑛 ∈ {𝑛1, 𝑛2, … , 𝑛𝑧} faire3: 𝑟𝑒𝑠[𝑛] ← ⊥4: 𝑐ℎ𝑎𝑛𝑔𝑒 ← 𝑣𝑟𝑎𝑖5: tant que 𝑐ℎ𝑎𝑛𝑔𝑒 faire6: 𝑐ℎ𝑎𝑛𝑔𝑒 ← 𝑓𝑎𝑢𝑥7: pour 𝑖 ← 1 à 𝑧 faire8: 𝑦 ← 𝑓𝑖(𝑟𝑒𝑠)9: si 𝑛𝑒𝑤 ≠ 𝑟𝑒𝑠[𝑛𝑖] alors

10: 𝑐ℎ𝑎𝑛𝑔𝑒 ← 𝑣𝑟𝑎𝑖11: 𝑟𝑒𝑠[𝑛𝑖] ← 𝑦12: retourner 𝑟𝑒𝑠

C’est une évolution de l’algo naïfQuestion: en quoi est-il différent ?

Jean Privat (UQAM) 03 - Data Flow INF889A Hiver 2020 41 / 49

Page 44: 03 - Data Flow

Tourniquet (round-robin)1: fonction RoundRobin(𝑓1, 𝑓2, … , 𝑓𝑧 ∶ 𝑁 → 𝐿 → 𝐿) : 𝐿2: pour 𝑛 ∈ {𝑛1, 𝑛2, … , 𝑛𝑧} faire3: 𝑟𝑒𝑠[𝑛] ← ⊥4: 𝑐ℎ𝑎𝑛𝑔𝑒 ← 𝑣𝑟𝑎𝑖5: tant que 𝑐ℎ𝑎𝑛𝑔𝑒 faire6: 𝑐ℎ𝑎𝑛𝑔𝑒 ← 𝑓𝑎𝑢𝑥7: pour 𝑖 ← 1 à 𝑧 faire8: 𝑦 ← 𝑓𝑖(𝑟𝑒𝑠)9: si 𝑛𝑒𝑤 ≠ 𝑟𝑒𝑠[𝑛𝑖] alors

10: 𝑐ℎ𝑎𝑛𝑔𝑒 ← 𝑣𝑟𝑎𝑖11: 𝑟𝑒𝑠[𝑛𝑖] ← 𝑦12: retourner 𝑟𝑒𝑠

C’est une évolution de l’algo naïfQuestion: en quoi est-il différent ?

Jean Privat (UQAM) 03 - Data Flow INF889A Hiver 2020 41 / 49

Page 45: 03 - Data Flow

Liste de travail (worklist)

1: fonction WorkList(𝑓1, 𝑓2, … , 𝑓𝑧 ∶ 𝑁 → 𝐿 → 𝐿) : 𝐿2: pour 𝑛 ∈ {𝑛1, 𝑛2, … , 𝑛𝑧} faire3: 𝑟𝑒𝑠[𝑛] ← ⊥4: 𝑊 ← {𝑛1, 𝑛2, … , 𝑛𝑧}5: tant que 𝑊 ≠ ∅ faire6: 𝑛𝑖 ← 𝑊.enlèvePremier()7: 𝑦 ← 𝑓𝑖(𝑟𝑒𝑠)8: si 𝑦 ≠ 𝑟𝑒𝑠[𝑛𝑖] alors9: 𝑟𝑒𝑠[𝑛𝑖] ← 𝑦

10: pour 𝑛𝑗 ∈ successeurs(𝑛𝑖) faire11: 𝑊.ajoute(𝑛𝑗)12: retourner 𝑟𝑒𝑠

Jean Privat (UQAM) 03 - Data Flow INF889A Hiver 2020 42 / 49

Page 46: 03 - Data Flow

Analyses classiques

Jean Privat (UQAM) 03 - Data Flow INF889A Hiver 2020 43 / 49

Page 47: 03 - Data Flow

Variables vivantes (live variable)

Quelles variables seront utilisées plus tard ?Celles non utilisées peuvent être éliminées

• Registre ou place dans la pile• Treillis plus petit dans d’autres analyses

IdéePour chaque point, l’ensemble des variables vivantes

Jean Privat (UQAM) 03 - Data Flow INF889A Hiver 2020 44 / 49

Page 48: 03 - Data Flow

Variables vivantes (live variable)

Quelles variables seront utilisées plus tard ?Celles non utilisées peuvent être éliminées

• Registre ou place dans la pile• Treillis plus petit dans d’autres analyses

IdéePour chaque point, l’ensemble des variables vivantes

Jean Privat (UQAM) 03 - Data Flow INF889A Hiver 2020 44 / 49

Page 49: 03 - Data Flow

Variables vivantes (live variable)Treillis

• (𝐿, ⊑) = (𝒫(𝑉 𝑎𝑟𝑠), ⊆) les sous-ensembles des variablesContraintes

• 𝑛 est la sortie:[[𝑛]] = ∅

• 𝑛 est « 𝑥 = 𝑎 »:[[𝑛]] = 𝑗(𝑛) ∖ {𝑥} ∪ 𝑣𝑎𝑟𝑠(𝑎)

• 𝑛 est « if(𝑎) », « while(𝑎) » ou « print(𝑎) »:[[𝑛]] = 𝑗(𝑛) ∪ 𝑣𝑎𝑟𝑠(𝑎)

• pour le reste[[𝑛]] = 𝑗(𝑛)

avec• 𝑣𝑎𝑟𝑠(𝑎) l’ensemble des variables utilisées par 𝑎• 𝑗(𝑛) ∶ 𝑁 → 𝐿 = ⨆𝑠∈successeurs(𝑛)[[𝑠]]

Note : le flux de contrôle est à l’enversJean Privat (UQAM) 03 - Data Flow INF889A Hiver 2020 45 / 49

Page 50: 03 - Data Flow

Expressions disponibles (available expressions)

Quels résultats de sous-expressions :• ont déjà été calculées• et sont toujours valide à un point donné ?

Permets de supprimer des calculs redondants

IdéePour chaque point, l’ensemble des expressions calculées encoredisponiblesNote: sur les chemins, on veut des garanties (must) pas despossibilités (may)

Jean Privat (UQAM) 03 - Data Flow INF889A Hiver 2020 46 / 49

Page 51: 03 - Data Flow

Expressions disponibles (available expressions)

Quels résultats de sous-expressions :• ont déjà été calculées• et sont toujours valide à un point donné ?

Permets de supprimer des calculs redondants

IdéePour chaque point, l’ensemble des expressions calculées encoredisponiblesNote: sur les chemins, on veut des garanties (must) pas despossibilités (may)

Jean Privat (UQAM) 03 - Data Flow INF889A Hiver 2020 46 / 49

Page 52: 03 - Data Flow

Expressions disponibles (available expressions)

Treillis• (𝐿, ⊑) = (𝒫(𝐴𝐸𝑥𝑝𝑟), ⊇) les sous-ensembles des expressions

Note: ∩ pour ⊔ (au lieu de ∪) et 𝐴𝐸𝑥𝑝𝑟 pour ⊥ (au lieu de ∅)Contraintes

• si 𝑛 est l’entrée: [[𝑛]] = ∅• 𝑛 est « 𝑥 = 𝑎 »: [[𝑛]] = (𝑗(𝑛) ∪ 𝑒𝑥𝑝𝑟𝑠(𝑎)) ∖ 𝐴𝐸𝑥𝑝𝑟𝑥• 𝑛 est « if(𝑎) », « while(𝑎) », « print(𝑎) »: [[𝑛]] = 𝑗(𝑛) ∪ 𝑒𝑥𝑝𝑟𝑠(𝑎)• pour le reste: [[𝑛]] = 𝑗(𝑛)

avec• 𝑗(𝑛) = ⨆𝑠∈prec(𝑛)[[𝑠]]• 𝑒𝑥𝑝𝑟𝑠(𝑎) l’ensemble des sous-expression de 𝑎• 𝐴𝐸𝑥𝑝𝑟𝑥 l’ensemble des sous-expressions qui contiennent 𝑥

Jean Privat (UQAM) 03 - Data Flow INF889A Hiver 2020 47 / 49

Page 53: 03 - Data Flow

Cadre à vecteur de bits (bit vector framework)

Plusieurs analyses data flow ont les caractéristiques suivantes• 𝐿 est un treillis de sous-ensembles fini• La fonction de transfert est sous la forme

𝑡𝑖(𝑙) = (𝑙 ∪ 𝐺𝑒𝑛𝑖) ∖ 𝐾𝑖𝑙𝑙𝑖où 𝐺𝑒𝑛𝑖 et 𝐾𝑖𝑙𝑙𝑖 ne dépendent que de 𝑛𝑖

Implémentation efficace• Représenter l’information 𝐿 par un vecteur de bit• Faire une passe pour précalculer 𝐺𝑒𝑛𝑖 et 𝐾𝑖𝑙𝑙𝑖 pour chaque

nœud• Faire tourner l’algo de point fixe avec des opérations bit-à-bit

Jean Privat (UQAM) 03 - Data Flow INF889A Hiver 2020 48 / 49

Page 54: 03 - Data Flow

Aller plus loin

• Cadre à vecteur de bits (bit vector framework)• Propagation de constante• Analyse d’intervalles

Jean Privat (UQAM) 03 - Data Flow INF889A Hiver 2020 49 / 49