presentation

This commit is contained in:
fiplox 2022-01-08 16:57:10 +01:00
parent bc8dc81b8e
commit e981669522
6 changed files with 121 additions and 2 deletions

BIN
cycle1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 256 KiB

BIN
cycle2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 356 KiB

BIN
cycle3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 300 KiB

View File

@ -44,6 +44,7 @@ header-includes:
- \setbeamercolor{subsection in sidebar shaded}{fg=grey} - \setbeamercolor{subsection in sidebar shaded}{fg=grey}
- \setbeamercolor{title}{fg=ori} - \setbeamercolor{title}{fg=ori}
- \setbeamercolor{titlelike}{fg=brown} - \setbeamercolor{titlelike}{fg=brown}
classoption: "aspectratio=43"
--- ---
# Programme # Programme
@ -54,6 +55,15 @@ Dans quel sens un "programme" ?
## Neovim ## Neovim
```sh
$ fd --extension c . 'neovim/' | wc -l
174
```
# Exemple d'un programme
## Neovim
```sh ```sh
$ fd --extension c . 'neovim/' | wc -l $ fd --extension c . 'neovim/' | wc -l
174 174
@ -62,4 +72,68 @@ $ wc `fd --extension c . 'neovim/'` -l
... ...
300347 total 300347 total
``` ```
# Parsing
## Regex
```
^(\**\w+\s+?\ ?){1,}\([^!@#$+%^]+?\)\s+
([a-zA-Z_0-9]+)\(.*\)
```
# Recherche des CC
Un algo ?
# Recherche des CC
* call
* vu
# Recherche des cycles
# Recherche des cycles
\tiny
## Exemple d'un cycle
```c
void bar(void)
{
toto(1, 1);
}
int foo(void)
{
hello();
bar();
return 1;
}
int toto(int a, int b)
{
if (a != 1)
foo();
else
aurevoir();
return a + b;
}
```
\normalsize
# Recherche des cycles
![](cycle1.png)
# Recherche des cycles
![](cycle2.png)
# Recherche des cycles
![](cycle3.png)
# Fin
|**Demo**|
|:------:|

47
prez.md
View File

@ -8,4 +8,49 @@ interpreté sous forme d'un graphe orienté avec un vecteur de successeur et un
graphe a matrice compacte. graphe a matrice compacte.
Pour exemple, voici un programme avec plusieur fichiers (174) et plusieurs Pour exemple, voici un programme avec plusieur fichiers (174) et plusieurs
milliers de lignes de code (300347) milliers de lignes de code (300347).
Le code est parsé ligne par ligne contre 2 regex. Le premier pour les
definitions des fonctions et le deuxieme pour les appels des fonctions.
Apres la construction des graphes, une des taches etait de cherches des
composantes connex dans ces graphes.
Une CC dans un code est une fonction qui appele plusieurs autres fonctions. Par
exemple la fonction main est une composante connexe. Et une fonction qui n'est
pas appelé par main ou ses successeurs est consideré comme une autre CC.
Pour ce faire, je pensais d'abord faire un algo de recherche, car sur internet
si on cherche des info sur le sujet, ils parlent de faire un algo. Comme c'est
moi qui construit le graphe, je peux deduire qui est une CC et qui n'en est
pas.
J'ai donc introduit une variable call dans mes stucture pour dire si une
fonction (noeud) a été appelé ou pas. Puis, j'ai une variable vu, qui dis si
lors de print d'un noeud (main), on a vu cette fontion. Et donc toute fonction
qui etait pas vu peut etre une CC.
L'etape suivante etait de trouver des cycles des appels de fonctions. Voici un
exemple de cycle. On voit que la fonction bar appele la fonction toto qui appel
la fonction foo qui reappel la fonction bar.
Pour la recherche de cycles, j'ai utilisé l'algo DFS (Deep First Search /
recherche en profondeur).
J'ai trouvé un pseudo-code sur internet que j'ai utilisé et adapté pour mes
structures. Dans le pseudo-code il y a 3 algorithmes.
Dans le premier on parcour le graph, pour chaque noeud on crée une pile vide,
on push le noeud courrant dans la pile, on dis que le noeud est dans la stack
et on fait un DFS dedans.
Deuxieme algo est le DFS. Pour chaque successeur dans le noeud on regarde s'il
est visité ou dans la pile. Si le successeur est dans la pile, ca veut dire
qu'on a trouvé un cycle. Donc on affiche le cycle. Si le successeur est pas
encore visité, on le push dans la stack en indiquant qu'il est desormais dans
la stack, et on appele recursivement DFS pous ce successeur.
A la fin on indique qu'on a fini avec le noeud et on pop la derniere valeur de
la pile.
Dans le troisieme algo on print le cycle.

View File

@ -18,7 +18,7 @@ void find_funcs(const char *path, graph_vec *gv, graph_mco *gmc, double *tv, dou
regmatch_t rm[2]; regmatch_t rm[2];
bool in; bool in;
const char *re_func_decl = "^(\\**\\w+\\s+?\\ ?\\ ?){1,}\\([^!@#$+%^]+?\\)\\s+"; const char *re_func_decl = "^(\\**\\w+\\s+?){1,}\\([^!@#$+%^]+?\\)\\s+";
const char *re_func_call = "([a-zA-Z_0-9]+)\\(.*\\)"; const char *re_func_call = "([a-zA-Z_0-9]+)\\(.*\\)";
token = malloc(1024 * sizeof(char)); token = malloc(1024 * sizeof(char));