OpenLLM-France/wikimedia huggingface dataset:
# Dessin en perspective

| Chap. 1 : | Perspective cavalière (0) |
| Chap. 2 : | Perspective isométrique (0) |
| Chap. 3 : | Perspective à un point de fuite (0) |
| Chap. 4 : | Perspectives à plusieurs points de fuite (0) |
| Chap. 5 : | Perspectives coniques et axonométriques (0) |
| Chap. 6 : | Perspective curviligne (0) |

## Présentation [Modifier]

Il existe différentes façons de représenter un sujet par la perspective en dessin. Les différentes techniques sont plus ou moins simplistes. Les plus simples suffisent dans certains cas, d'autres sont indispensables dans des images plus complexes.

## Objectifs [Modifier]

Comprendre les mécanismes utilisés depuis 5 siècles pour représenter le monde réel en trois dimensions sur des surfaces en deux dimensions (bidimensionnelles).

## Niveau et prérequis conseillés [Modifier]

Leçon de niveau 0.
* Connaissances de base en géométrie dans l'espace et dans le plan.
* Sens de l'observation dans le monde réel tridimensionnel.

## Référents

Ces personnes sont prêtes à vous aider concernant cette leçon :
    Personne ne s'est déclaré prêt à aider pour cette leçon. Pour vous ajouter, cliquez ici.
# Dynamique des fluides parfaits/Exercices/Rendement d'un ventilateur

Un ventilateur est installé dans la paroi d'un local communiquant avec l'extérieur par l'intermédiaire d'une canalisation cylindrique de diamètre D munie d'un convergent d'entrée.
On suppose que les caractéristiques de l'air ambiant (pression P$_0$ et température T$_0$) prennent les mêmes valeurs à l'extérieur et à l'intérieur du local et que l'air est un fluide parfait. On installe un tube de Pitot dans la veine cylindrique qui est raccordé à un tube en U contenant de l'eau sur lequel on relève la dénivellation h.
Sachant que la puissance du moteur entraînant le ventilateur est $\scriptstyle {\mathcal {P}}$, quelle est la valeur du rendement de l'installation ?
AN : D = 85 cm, P$_0$ = 101 396 Pa, $\scriptstyle {\mathcal {P}}$ = 37,45 kW, h = 124 mm
On définit :
    $\eta ={\frac {\rm {puissance~de~l'air}}{\rm {puissance~fournie}}}$
et la puissance fournie vaut la puissance donnée.
On généralise l'équation de Bernoulli pour l'air entre les points 1 et 2 (entrée et sortie) :
    $\Delta W_{1\rightarrow 2}=(P_{2}-P_{1})+{\rho _{air} \over 2}(v_{2}^{2}-v_{1}^{2})+\rho _{air}g(z_{2}-z_{1})+\Delta J_{1\rightarrow 2}$
    $\Delta J_{1\rightarrow 2}=0$ car l'air est un fluide parfait.
    $P_{1}=P_{2}=P_{0}{\rm {~et~}}z_{1}=z_{2}$
    $\Delta W_{1\rightarrow 2}={\rho \over 2}v^{2}$
et $v_{1}=0{\rm {~et~}}v_{2}=v$ vitesse lue sur le tube.
    $\Delta W_{1\rightarrow 2}$ est l'énergie fournie au fluide par unité de volume.
    $v={\sqrt {2\rho _{eau}gh \over \rho _{air}}}$
    $v=43,38\,{\rm {m.s^{-1}}}$
Puissance de l'air :
    ${\mathcal {P}}_{air}=Q_{v}W_{1\rightarrow 2}=SvW=Sv{\rho _{air} \over 2}v^{2}$
avec $S=\pi {D^{2} \over 4}$
    ${\begin{aligned}{\mathcal {P}}_{air}&={S\rho _{air}v^{3} \over 2}\\&={\pi D^{2}\rho _{air} \over 8}\left({\sqrt {2\rho _{eau}gh \over \rho _{air}}}\right)^{3}\end{aligned}}$
En application numérique, on trouve :
    ${\mathcal {P}}_{air}=29942\,{\rm {W}}$
et finalement,
| Clepsydre | Souffler dans une bobine |
# Dynamique des fluides compressibles/Vitesse du son
## Équations d'onde, vitesse du son

L'écoulement est supposé irrotationnel et parfait, et on traite les champs comme des perturbations de l'état stationnaire uniforme :
    $P({\vec {r}},t)=P_{0}+p({\vec {r}},t)$
    $\mu ({\vec {r}},t)=\mu _{0}+\delta \mu ({\vec {r}},t)$
    $p({\vec {r}},t)$, $\delta \mu ({\vec {r}},t)$ et ${\vec {v}}({\vec {r}},t)$ sont des infiniment petits du premier ordre.
Les équations décrivant un tel écoulement sont :
${\frac {\partial {\vec {v}}}{\partial t}}=-{\frac {1}{\mu _{0}}}{\vec {\nabla }}p~~~~~~;~~~~~~{\frac {\partial p}{\partial t}}=-{\frac {1}{\chi _{T}}}\mathrm {div} {\vec {v}}$
(où $\chi _{T}~$ est le coefficient de compressibilité isotherme.)
D'où l’on tire les équations d'onde :
${\frac {\partial ^{2}p}{\partial t^{2}}}-{\frac {1}{\mu _{0}\chi _{T}}}\Delta p=0~~~~~~;~~~~~~{\frac {\partial ^{2}{\vec {v}}}{\partial t^{2}}}-{\frac {1}{\mu _{0}\chi _{T}}}\Delta {\vec {v}}=0$
(en utilisant ${\overrightarrow {\rm {rot}}}~{\vec {v}}={\vec {0}}$ ).
On en déduit la vitesse du son :
$c={\frac {1}{\sqrt {\mu _{0}\chi _{T}}}}$

## Démonstration

Pour la première équation, on part de l'équation d'Euler (on néglige la viscosité et la gravité) : ${\frac {\partial {\vec {v}}}{\partial t}}+({\vec {v}}\cdot {\vec {\nabla }}){\vec {v}}=-{\frac {1}{\mu }}{\vec {\nabla }}p$
Au premier ordre, $({\vec {v}}\cdot {\vec {\nabla }}){\vec {v}}$ est négligé devant ${\frac {\partial {\vec {v}}}{\partial t}}$, et on a ${\frac {1}{\mu }}{\vec {\nabla }}p={\frac {1}{\mu _{0}}}(1-{\frac {\delta \mu }{\mu _{0}}}+...){\vec {\nabla }}p\approx {\frac {1}{\mu _{0}}}{\vec {\nabla }}p$. On en déduit l'équation utilisée, dite équation d'Euler linéarisée.
L'autre relation est issue de la définition du coefficient de compressibilité isotherme :
    $\chi _{T}=-{\frac {1}{V}}\left({\frac {\partial V}{\partial P}}\right)_{T}={\frac {1}{\mu }}\left({\frac {\partial \mu }{\partial P}}\right)_{T}\approx {\frac {1}{\mu }}{\frac {\delta \mu }{p}}~~\Rightarrow ~~\delta \mu \approx \mu \chi _{T}~p\approx \mu _{0}\chi _{T}~p$
On a ensuite, avec l'équation de conservation de la masse : $\mathrm {div} {\vec {v}}=-{\frac {1}{\mu }}{\frac {\partial \mu }{\partial t}}\approx -{\frac {1}{\mu _{0}}}{\frac {\partial (\delta \mu )}{\partial t}}\approx -\chi _{T}{\frac {\partial p}{\partial t}}$
| Sommaire | Écoulement adiabatique |
# Dynamique des fluides parfaits/Applications pratiques
## Vidange d'un réservoir

Nous allons utiliser le cas de l'écoulement d'un fluide depuis un réservoir. On cherche à établir la loi de vidange h(t) correspondant à la hauteur de fluide dans le réservoir au temps t. La hauteur initiale est notée h0. Les questions qu’il est nécessaire de se poser sont toujours les mêmes.

### Est-ce que le fluide peut être considéré comme parfait?

Oui, le fluide peut être considéré comme parfait car...

### Est ce que le fluide peut être considéré comme incompressible?

Oui, le fluide peut être considéré comme incompressible car... On pourra utiliser la conservation du débit volumique.
$Q_{1}=Q_{2}\Rightarrow V_{1}.S_{1}=V_{2}.S_{2}\Rightarrow V_{1}={\frac {S_{2}}{S_{1}}}.V_{2}$
S2 étant plus petite que S1, on en déduit que V1 est plus petit que V2
De plus, la vitesse du fluide dans le réservoir (v1) correspond aux variations de la hauteur du fluide en fonction du temps:
$V_{1}=-{\frac {dh}{dt}}$

### Est-ce que l'écoulement est permanent?

Non, l'écoulement n’est pas permanent car...
L'équation de Bernouilli est
$\int _{1}^{2}\rho .{\frac {\overrightarrow {d{v}}}{dt}}{\overrightarrow {dr}}+(P_{2}+\rho gz_{2}+0.5\rho v_{2}^{2})-(P_{1}+\rho gz_{1}+0.5\rho v_{1}^{2})=0$
On remarquera que:
$P_{1}=P_{2}=Patm$
$z_{1}=h(t)$ $z_{2}=h_{0}$
Il vient donc:
$\int _{1}^{2}\rho .{\frac {\overrightarrow {d{v}}}{dt}}{\overrightarrow {dr}}+0.5\rho v_{2}^{2}.(1+({\frac {S_{2}}{S_{1}}})^{2})-\rho gh(t)=0$

### Est-ce qu’il y a une ligne de courant?

Oui, il existe au moins une ligne de courant, le long des parois. Cette ligne de courant passe par les points 1, 3 puis enfin 2.
$\int _{1}^{2}\rho .{\frac {\overrightarrow {d{v}}}{dt}}=\int _{1}^{3}\rho .{\frac {\overrightarrow {d{v}}}{dt}}+\int _{3}^{2}\rho .{\frac {\overrightarrow {d{v}}}{dt}}$
Entre 1 et 3 la vitesse est presque égale à la vitesse v1. Entre 3 et 2, la vitesse est presque égale à la vitesse v2. Mais comme, v1 est négligeable devant v2:
$\int _{1}^{2}\rho .{\frac {\overrightarrow {d{v}}}{dt}}{\overrightarrow {dr}}=\int _{3}^{2}\rho .{\frac {\overrightarrow {d{v_{2}}}}{dt}}{\overrightarrow {dr}}$
V2 ne dépend pas de r entre 2 et 3. Il dépend seulement du temps.
$\int _{3}^{2}\rho .{\frac {\overrightarrow {d{v_{2}}}}{dt}}=\rho {\frac {\overrightarrow {d{v_{2}}}}{dt}}\int _{3}^{2}{\overrightarrow {dr}}=l\rho {\frac {\overrightarrow {d{v_{2}}}}{dt}}$
Il vient donc finalement le système d'équation différentielle:
${\begin{cases}\int _{1}^{2}\rho .{\frac {\overrightarrow {d{v}}}{dt}}{\overrightarrow {dr}}+0.5\rho v_{2}^{2}.(1+({\frac {S_{2}}{S_{1}}})^{2})-\rho gh(t)=0\\V2=-{\frac {S_{1}}{S_{2}}}{\frac {dh}{dt}}\end{cases}}$
Si la longueur du conduit de 3 vers 2 (la sortie) est nulle (l = 0) alors:
${\begin{cases}v_{2}={\sqrt {2gh}}\\{\sqrt {2gh}}=-{\frac {S_{1}}{S_{2}}}.{\frac {dh}{dt}}\end{cases}}\Rightarrow {\begin{cases}V_{2}={\sqrt {2gh}}\\\int _{H}^{0}{\frac {dh}{\sqrt {h}}}=-{\sqrt {2g}}.{\frac {S_{2}}{S_{1}}}.\int _{0}^{t}dt\end{cases}}$
Finalement, il vient donc:
$T={\frac {S_{1}}{S_{2}}}{\sqrt {\frac {H}{2g}}}$
| Approche énergétique | Sommaire |
# Dynamique des fluides parfaits/Approche énergétique
## Interprétation de l'équation

${\overrightarrow {dr}}.\rho .{\overrightarrow {a}}=(-\nabla p+\rho {\overrightarrow {g}}){\overrightarrow {dr}}$
On rappelle que le travail élémentaire d'une force est le produit scalaire entre le vecteur force et le vecteur de déplacement élémentaire ${\overrightarrow {dr}}$
Le travail, c’est de l'énergie. L'équation de Bernoulli traduit donc la conservation de l'énergie le long d'une ligne de courant.

## Généralisation de l'équation de Bernoulli

En gardant cette idée de conservation de l'énergie, si le fluide n’est pas parfait, il est quand même possible de se baser sur l'équation de Bernoulli pour bâtir un modèle empirique. Il faudra prendre en compte les effets visqueux et l'interaction entre le fluide et la cause de son mouvement (pompe, etc)
Un effet visqueux correspond à une perte de charge.]] Une pompe augmente la charge du fluide tandis qu'une turbine diminue la charge du fluide...
L'équation de Bernoulli devient alors:
$\Delta E_{p}+\Delta E_{k}+\Delta E_{\rho }=\Delta E_{j}+\Delta E_{w}$
$\Delta E_{p}$ : variation de charge potentielle de pression (Pf-Pi)
$\Delta E_{k}$ : variation de charge cinétique $0.5\rho (Vf^{2}-Vi^{2})$
$\Delta E_{\rho }$ : variation de charge potentielle de l'altitude $\rho g(Zf-Zi)$
$\Delta E_{j}$ perte de charge due aux efforts visqueux (négatif)
$\Delta E_{w}$ : charges associées aux machines (positif si pompe, négatif si turbine)
| Équations de Bernoulli | Applications pratiques |
# Dynamique des fluides parfaits/Exercices/Canal d'irrigation

Un courant d’eau, de vitesse v1, s’écoule sous l’effet de la gravité dans un canal d’irrigation bidimensionnel de profondeur h partiellement fermé par une vanne. On néglige les effets visqueux et les pertes de charge.
1. Tracer le profil de pression au fond du canal et sur les côtés amont et aval.
2. Calculer la profondeur l en aval de la vanne.
3. Calculer la force F exercée par le courant d’eau sur la vanne.
AN : v1 = 1 m s-1, h = 80 cm Solution : l = 22,9 cm, F = 890 N m-1
1. Calcul de $l$
On a une conservation de la masse, donc une conservation du débit volumique car le fluide est incompressible. On a donc : $v_{1}A_{1}=v_{2}A_{2}$ avec $v_{1},v_{2}$ vitesse aux points 1 et 2 respectivement, et $A_{1}etA_{2}$ aire des section aux points 1 et 2.
Soit $L$ la longueur du canal, on a donc :
$v_{1}Lh=v_{2}lL$
$l={hv_{1} \over v_{2}}$
Il faut déterminer $v_{2}$, pour cela on utilise la formule de Bernouilli sur une ligne de courant au fond du canal. On a alors :
$P_{f}+\rho gh+{1 \over 2}\rho v_{1}^{2}=P_{f}+\rho gl+{1 \over 2}\rho v_{2}^{2}$
Avec $P_{f}$ pression au fond du canal.
On a donc :
$v_{2}^{2}=2g(h-l)+v_{1}^{2}$
On a donc le système suivant a résoudre :
${\begin{cases}v_{1}h=v_{2}l\\v_{2}^{2}=2g(h-l)+v_{1}^{2}\end{cases}}$
${\begin{cases}v_{1}h=v_{2}l\\v_{2}=v_{1}{h \over l}\end{cases}}$
${\begin{cases}v_{1}^{2}{h \over l}^{2}=2g(h-l)-v_{1}^{2}\\v_{2}=v_{1}{h \over l}\end{cases}}$
$v_{1}^{2}(h^{2}-l^{2})=2g(h-l)l^{2}$
$v_{1}^{2}(h+l)=2gl^{2}$
$2gl^{2}-v_{1}^{2}l-v_{1}^{2}h=0$
$l={v_{1}^{2}\pm {\sqrt {v_{1}^{4}+8gv_{1}^{2}h}} \over 4g}$
$l>0\rightarrow$
$l={v_{1}^{2}+{\sqrt {v_{1}^{2}(v_{1}^{2}+8gh)}} \over 4g}$
$l={v_{1}^{2}+v_{1}{\sqrt {v_{1}^{2}+8gh}} \over 4g}$
En application numérique, on trouve :
$l=22,9cm$
$v_{2}=3,49ms^{-1}$
2. On représente sur le schéma suivant la force exercée par la vanne sur le fluide, ainsi que les autres forces environnante ( pour le bilan de force) :
On projète alors sur l’axe x de l’équation d’Euler :
$Q_{m}(v_{2}-v_{1})=F_{1}-F_{2}+F-P_{a}tm(A_{1}-A_{2})$
$Q_{m}=(v_{1}A_{1})l$
On a donc :
$F_{1}={\rho gh^{2} \over 2}L+P_{a}tmA_{1}$
$F_{2}={\rho gl^{2} \over 2}L+P_{a}tmA_{2}$
$F=Q_{m}(v_{2}-v_{1})+F_{2}-F_{1}+P_{a}tm(A_{1}-A_{2})$
$F=v_{1}A_{1}\rho (v_{2}-v_{1})+{\rho gL \over 2}(l^{2}-h^{2})$
${F \over L}=v_{1}h\rho (v_{2}-v_{1})+{\rho g \over 2}(l^{2}-h^{2})$
Application numérique :
On trouve ${F \over L}=-890N/m$
| Tube en U | Clepsydre |
# Dynamique des fluides parfaits/Exercices/Véhicule à coussin d'air

On veut construire un véhicule à coussin d'air de forme circulaire et de rayon R. Le rotor aspire l'air ambiant et le comprime à la pression P0 supposée uniforme sous le carter. À l'équilibre le débit aspiré par le rotor est égal à celui qui s'échappe sous la jupe du véhicule située à une hauteur h au-dessus du sol, et le poids W du véhicule est supporté par la pression régnant sous le carter.
1. Montrer que la vitesse de l’air sous le carter est négligeable devant la vitesse de l’air qui s’échappe sous la jupe et calculer le débit Q aspiré par le rotor en fonction de W, R, h, de la pression atmosphérique et de la masse volumique de l’air.
2. La puissance fournie par le rotor étant de P et le rendement du rotor étant de 0,7, calculer la garde au sol h.
3. Étudier la stabilité verticale du véhicule : comment évolue les forces de pression si h change pour Q constant ?
Données pour l'analyse numérique :
* AN : W = 12 000 N
* R = 1,5 m
* P = 50 kW
1. On néglige toutes les pertes de charge dues à l'écoulement, on a alors l'équilibre :
$P_{0}-P_{a}tm={W \over \pi R^{2}}$
L'équation de Bernouilli donne, entre 0 et 2 :
$P_{0}+{1 \over 2}\rho V_{0}^{2}=P_{a}+{1 \over 2}\rho V_{2}^{2}$
Avec la convention suivante :
On suppose que $V_{0}<<V_{2}\,$
Et on a alors :
$P_{0}-P_{a}tm={1 \over 2}\rho V_{2}^{2}\Rightarrow V_{2}^{2}={2(P_{0}-P_{a}tm) \over \rho }={2W \over \rho \pi R^{2}}$
La conservation du débit donne alors :
$Q=2\pi RhV_{2}$
On a alors :
$Q=2\pi Rh{\sqrt {2W \over \rho \pi R^{2}}}$
On a finalement :
$Q=h{\sqrt {8\pi W \over \rho }}$
2. Si on néglige les effets visqueux, on a $P_{u}=Q\Delta P$, avec $P_{u}$ la puissance utile.
On a $P_{u}=0,7P$
On a donc :
$Q={P_{u} \over \delta P}={0,7P \over P_{0}-P_{a}tm}$
Avec $P_{0}-P_{a}tm={W \over \pi R^{2}}$
On a donc :
$Q={0,7P\pi R^{2} \over W}$
$h={Q \over {\sqrt {8\pi W \over \rho }}}={0,7P\pi R^{2} \over W{\sqrt {8\pi W \over \rho }}}$
$h={0,7PR^{2}{\sqrt {\pi }}\rho \over {\sqrt {8}}W^{3 \over 2}}$
En application numérique, on trouve :
$h=4,27cm$
$Q=20,6m^{3}s^{-1}$
3. On a $Q^{2}=h^{2}{8\pi W \over \rho }\rightarrow W={K \over h^{2}}=F_{p}$, avec $F_{p}$ force de pression, et $K=cte$ car $Q=cte$.
Si h augmente, alors $F_{p}$ diminue, et donc h diminue, et inversement. On en conclue qu’il y a stabilité du système.
| Souffler dans une bobine | Écoulement autour d'un disque circulaire |
# Dynamique des fluides parfaits

| Chap. 1 : | Théorème de la quantité de mouvement -Euler |
| Chap. 2 : | Équations de Bernoulli |
| Chap. 3 : | Approche énergétique |
| Chap. 4 : | Applications pratiques |
| Exos. 1 : | Tube en U |
| Exos. 2 : | Canal d'irrigation |
| Exos. 3 : | Clepsydre |
| Exos. 4 : | Rendement d'un ventilateur |
| Exos. 5 : | Souffler dans une bobine |
| Exos. 6 : | Véhicule à coussin d'air |
| Exos. 7 : | Écoulement autour d'un disque circulaire |
Sur les autres projets Wikimedia :

## Présentation [Modifier]

* Le théorème de Bernoulli
** Énoncé
** Applications :
          - Le tube de Venturi ;
          - Le tube de Pitot.
* L’équation de la continuité

## Objectifs [Modifier]

Cette leçon est destinée aux étudiant des sections scientifiques des universités francophones et est, par conséquent, d'un bon niveau. Elle devra apporter les notions théoriques et les exercices d'un niveau suffisant pour réussir les examens qui se déroulent dans ces d'universités.

## Niveau et prérequis conseillés [Modifier]

Leçon de niveau 15.
* Introduction à la mécanique des fluides
* Statique des fluides
* Cinématique des fluides
* Conservation de la masse et équation de continuité

## Référents [Modifier]

Ces personnes sont prêtes à vous aider concernant cette leçon :
* B.lio
# Débogage avancé/Travail pratique/Allocation dans la pile
## But de ce TP

Pour éviter le tourbillon de Charybde des allocations dynamique dans le tas (heap), certains programmeurs aventureux ou programmeuses aventureuses sont prêts à se jeter dans la gueule du monstre Scylla des allocations dynamique dans la pile (stack).
Ils doivent alors de garantir que l'adresse de l'allocation ne sera jamais utilisée après la fin de l'exécution de la fonction, puisque cette fin va entrainer la libération automatique de l'allocation.
Côté débogage, le problème est que la pile est librement manipulable. Il est possible d'y lire et d'y écrire partout ! Et du coup tous les outils deviennent beaucoup plus difficiles à exploiter.

## Le code à déboguer

Créer un fichier bug_allocinstack.c contenant le code suivant.

## Les consignes

Le code bug_allocinstack.c reproduit un schéma classique de la programmation en Python. Mais, pour allouer tous ses objets, Python utilise le tas (malloc) ! Même si la syntaxe est identique, Python ne fait pas du tout la même chose que ce code qui crée son objet dans la pile de la fonction.
* Compiler le programme. Les deux lignes p++,p-- sont peut-être suffisantes pour désorienter votre linter, mais probablement pas l'analyseur statique d'un compilateur récent.
* Exécuter le programme. Suivant le code généré, il peut boucler à l'infini.
* Exécuter le programme avec Valgrind. Vous n'aurez pas beaucoup plus d'indications.
* Compiler et exécuter le programme avec ASan.
* TODO: Exécuter le programme avec gdb et détecter avec un watchpoint qui modifie dans le champ next.
Vous devriez avoir tapé les commandes suivantes (Certains affichages sont omis):
# Débogage avancé/Travail pratique/Débogage à la volée
## But de ce TP

Le débogage de l'exécution d'un programme peut ne pas avoir été anticipé. Heureusement, il est possible de commencer le débogage en cours de route.
Attention, certains systèmes Linux (dont Ubuntu) sont configurés par défaut pour vous empêcher de faire cela. Il faudra en modifier la configuration pour pouvoir faire ce TP.

## Le code à déboguer

Attention: ce code tourne en boucle ! Créer un fichier bug_loop.c contenant le code suivant.
Pour éviter des mésaventures désagréables, comme vider la batterie de son ordinateur portable, nous conseillons de toujours lancer ce programme en limitant son temps d'exécution (ici à 300 secondes, 5 minutes max). Attention à bien mettre les parenthèses, sinon vous risquez de limiter aussi tous les processus que vous lancerez dans le même terminal.

## Les consignes

Le programme tourne donc à l'infini. Vous avez donc tout le temps pour l'attraper au vol. Pour faciliter votre travail, il indique aussi comment l'attraper au vol avec votre débogueur. L'alternative est d'obtenir le PID du processus avec la commande ps.
Après l'avoir attraper, vous changer la valeur d'une de ces variables à la volée pour lui permettre de terminer proprement.
* Lancer le programme en tâche de fond en limitant son temps d'exécution à 5 minutes (300 secondes).
* Demander à votre débogueur de s'accrocher au processus en train de tourner avant qu'il soit fini.
* Afficher le code à proximité de l'arrêt.
* Avancer l'excution pas-à-pas dans la boucle while jusqu'à la ligne l++.
* Changer la valeur de h pour la mettre à 0 (NULL).
* Continuer jusqu'à la sortie de la fonction
* Continuer jusqu'à la terminaison.
Vous devriez avoir tapé les commandes suivantes (les affichages de GDB sont omis):
| Débogage avancé/Travail pratique/Allocation: 0, Libération: 1 | Débogage avancé/Travail pratique/Observation à la loupe |
# Débogage avancé/Travail pratique/Double libération
## But de ce TP

Il est compliqué de suivre dans l'exécution d'un programme si une zone de mémoire allouée dynamiquement dans le tas (avec malloc) est encore utilisée. Mais il faut pourtant bien la libérer un jour pour pouvoir la recycler et ne pas exploser en utilisation de la mémoire. La libération est donc sujette à deux bugs courants: libérer trop tôt une zone encore utilisée, et la libérer deux fois dans deux endroits différents du code. Ce TP tourne autour de ce deuxième bug.
Les langages interprétés (Python, Perl, Ruby, Julia, etc.) et certains langages compilés (Java, Go, Haskell, etc.) font cette libération en exécutant un ramasse-miettes, c'est-à-dire du code dédié à la détection de ces libérations. D'autres méthodes existent comme le compteur de référence d'Objective-C ou des règles strictes d'emprunt d'un pointeur, en Rust (Elles sont vérifiées et validés à la compilation).

## Le code à déboguer

Créer un fichier bug_doublefree.c contenant le code suivant.

## Les consignes

Le code bug_doublefree.c libère deux fois le tableau alloué, une première fois juste avant la fin de la fonction fibon et une fois juste après.
* Compiler le code. L'analyseur statique de votre compilateur détecte le bug.
* Lancer le programme bug_doublefree. C'est votre bibliothèque C qui détecte le problème à l'exécution au moment du second free. Mais elle n'indique pas où était le premier free.
* Lancer le programme avec valgrind. Il détecte également le problème. Valgrind donne les différentes lignes du programme ayant faite l'allocation et les deux libérations. Valgrind donne aussi en toute fin un résumé de ce qu'il a observé (1 allocation et deux libérations).
* Recompiler en utilisant AddressSanitizer et exécuter le programme. Cette fois la détection interne de ASan (et pas de la librairie C) est capable d'indiquer le code faisant la première libération et celui ayant fait l'allocation.
Vous devriez avoir tapé les commandes suivantes (Certains affichages de Valgrind sont omis):
* Débogage avancé/Travail pratique/Débordement de pile
# Débogage avancé/Travail pratique/Pile d'appels
## But de ce TP

Souvent, un bug est détecté à l'exécution d'une fonction A qui a été appelée par la fonction B qui a provoqué le bug. Il est donc important de pouvoir remonter dans la pile d'appel pour observer l'état de la fonction B.
Ce TP concerne la compréhension de la pile d'appels des fonctions dans un programme impératif. Il permet aussi de réviser quelques bases sur les débogueurs (afficher le code dans un terminal, lancer le programme, mettre un point d'arrêt, se déplacer dans la pile d'appel, terminer).
N'hésiter pas à regarder la solution en faisant les manipulations si vous souhaitez plutôt un mini-tutoriel GDB en mode terminal.

## Le code à déboguer

Créer un fichier bug_assert.c contenant le code suivant.

## Les consignes

* Compiler et lancer le programme ./bug_assert. Vous devriez voir le message d'erreur dans votre terminal qui donne la ligne et le fichier du programme qui a détecté le prédicat a faux.
* Lancer gdb avec le programme en argument dans un terminal. Demandé à gdb d'afficher le code du programme à déboguer. Mettre un point d'arrêt sur la fonction main. Démarrer. Vous devriez être au début du main. Continuer. À l'assertion, afficher la pile d'appel et remonter dans la pile d'appel de fonction jusqu'au code source impliqué assert(false);.
Vous devriez avoir tapé les commandes suivantes (les affichages de GDB sont omis):
* Débogage avancé/Travail pratique/Débordement de pile