Date de première publication : 2023/06/23
Cette page est en cours d'écriture
Cette page est dédiée à l'utilisation d'outils d'amélioration de code sous l'angle de ma mémoire.
Il existe de nombreux outils en fonction de l'environnement de développement et des langages, on se concentrera sur le C/C++ avec des outils plutot génériques et libres.
- Valgrind
- Les Sanitizers
- Dr Memory
Valgrind
Vous connaissez valgrind normalement. On l'utilise pour deux aspects intéressants :
- les erreurs de contexte - ce qui est le plus important
- les fuites mémoire (peu important finalement sauf si vous écrivez un démon ou bien si votre système ne gère pas le non-rendu mémoire)
Pour utiliser valgrind, il faut compiler avec l'option -g
. Valgrind instrumente alors le binaire compilé et l'exécution
sous valgrind peut être jusqu'à 40 fois plus lente que le code non instrumenté.
À l'exécution, valgrind vous proposera peut-être de le relancer avec des options pour avoir plus de détails, n'hésitez pas !
Valgrind est disponible sous Windows, LINUX mais pas pour les dernières versions de MacOS. Pour le reste, rendez-vous sur :
Valgrind est vu en TP et vous avez une description dans le sujet du projet et notamment l'utilisation de valgrind avec la SDL2 (section 8.4).
https://valgrind.org/Les "sanitizers"
Les sanitizers sont des outils qui ont été ajoutés aux compilateurs (clang et gcc notamment) pour un meilleur développement.
Le code est instrumenté à la compilation (ce qui permet, en général de meilleures performances que valgrind) et des versions adaptées de fonctions peuvent être appelées au travers de l'édition des liens
(par exemple, pour appeler des versions adaptées de malloc()
et free()
)
Il existe de nombreux sanitizers qui sont dépendants des compilateurs (clang est plus riche). Il faut les spécifier un par un et faire attention à la compatibilité entre eux.
Voici la page de documentation officielle de gcc qui en traite :
https://gcc.gnu.org/onlinedocs/gcc/Instrumentation-Options.htmlVous pourrez par exemple préciser :
-fsanitize=address,undefined
Address Sanitizer (ASAN)
Ce module est un "must-have", il permet de détecter :- l'usage après une libération, après un return ou encore en dehors de la portée
- des dépassements de mémoire tampon (tas, pile ou global)
- des bogues liées à l'ordre d'initialisation
- les fuites mémoires
Prenez l'exemple suivant :
int main() {
char s[50] = "detection or not" ;
printf("%c\n", s[51]);
return 0;
}
clang
détecte le problème directement à la compilation, gcc
non. Le sanitizer le détecte également.
Sur un cas à peine différent, ni clang
ni gcc
ne voient quoi que ce soit à la compilation
int main() {
char * s = "detection or not";
printf("%c\n", s[51]);
return 0;
}
Undefined Behavior Sanitizer (UBSAN)
Comme son nom l'indique, ce sanitizer concerne les comportements "indéfinis", c'est-à-dire les comportements non spécifiés car ils ne devraient pas se produire. Les exmeples sont légions : utiliser une variable statique avant son initialisation, diviser par 0, des dépassements d'opérations entières, ...
Quelques liens :Thread Sanitizer (UBSAN)
https://github.com/google/sanitizers/wiki/ThreadSanitizerCppManualSi vous comptez faire de la programmation multithread, activez cette option !
https://medium.com/@lucianoalmeida1/i-little-bit-about-thread-sanitizer-56a887dc144Dr Memory
Dr Memory est un programme à l'image de valgrind : un couteau suisse qui s'installe sur de nombreux systèmes d'exploitation (hormis, là encore, les derniers MacOs). L'installation est rapide et l'exécution tout autant. Tout se trouve à l'url : https://drmemory.org/